[[20191120111750]] 『VBAのフォームに関して困っている点があります。』(あみ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBAのフォームに関して困っている点があります。』(あみ)

プログラミング初心者です。
質問が2点ありますので分かる方いましたら解説をよろしくお願いいたします。
1.フォームのサイズ変更がドラックでできない
  直接プロパティから値を変更すればできるのですが、通常のブラウザやエクスプローラーのようにドラックして変更したいです。

2.AUserForm_Active(Deactivate)が動作しない
  起動時に1回処理が通りますが、それ以降動作しません
  イメージ的にはフォームをクリックしたらActiveが動作し、フォーカスが外れたらDeactivateが動作すると考えています。
  調べてみるとExcelのバージョンによってイベントの扱いが違うということは分かったのですが、Office365で動作させたい時にどのようにすればいいのかまではわかりませんでした。

文章力が無く、プログラミングの知識的にも不足していますので伝わりにくいかと思いますが確認をよろしくお願いいたします。

< 使用 Excel:Office365、使用 OS:Windows10 >


 >1.フォームのサイズ変更がドラックでできない 

 普通はできないです。
 APIと言う難しいものを使います。

 >AUserForm_Active(Deactivate)が動作しない。

 イベント動作の確認取ってないけど、その前に
 スペル違うし、○○UserForm_Activate() って、勝手に名前を変えてないですかね
(BJ) 2019/11/20(水) 11:39

Bjさんへ

申し訳ありませんでした。
単純にスペル間違いです。
UserForm_Activate()でやってもできませんでした
(あみ) 2019/11/20(水) 15:09


 2007でも最初だけでした。(実験1)
 フォームとシートを交互に選択しても無反応。

 実験1
 Sub aaaa()
 UserForm1.Show 0
 End Sub

 Private Sub UserForm_Activate()
 MsgBox Me.Caption
 End Sub

 実験2
 UserForm1とUserForm2を用意してUserForm1にボタン一つ
 UserForm1とUserForm2の交互選択では、動きました。

 Sub bbbb()
 UserForm1.Show 0
 End Sub

 UserForm1モジュール

 Private Sub CommandButton1_Click()
 UserForm2.Show 0
 End Sub

 UserForm2モジュール

 Private Sub UserForm_Activate()
 MsgBox Me.Caption
 End Sub

 と、言うことは?
 シートや他との連携には対応してない???
(BJ) 2019/11/20(水) 15:32

 あ、実験2のUserForm1モジュールのコードが抜けてた。

 Private Sub UserForm_Activate()
 MsgBox Me.Caption
 End Sub

 場合によって、シートを選択して両フォームを非選択状態にしてから、
 どちらかのフォームを選択すると動く時と動かない時あり。
 何が原因なのかきっかけが、良く解りませんでした。
 すみません。
(BJ) 2019/11/20(水) 16:02

私は、APIを使った、ユーザーフォームをリサイズ可能にする方法だけ書きますね。

Excel VBAは、フォームのリサイズに対応するプロシジャが用意されているくせに、リサイズ可能にするプロパティが存在しないという、中途半端な仕様になっているのが謎です。

 Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
 Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
    (ByVal hWnd As Long, ByVal nIndex As Long) As Long
 Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
    (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
 Const GWL_STYLE = (-16&)
 Const WS_THICKFRAME = &H40000
 Const WS_MAXIMIZEBOX = &H10000

 Private Sub UserForm_Initialize()
    Dim hWnd As Long
    hWnd = FindWindow("ThunderDFrame", Me.Caption)
    SetWindowLong hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) Or WS_THICKFRAME Or WS_MAXIMIZEBOX
 End Sub
(???) 2019/11/21(木) 11:51

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.