2-4 タイプ別コントロールの主なイベントを確認するコントロール 2021.11.16
次の書籍の第1章~5章を公開しています。
「Excel VBA 逆引きで学ぶ ユーザーフォーム&コントロール」
ここではコントロールのタイプ別の主なイベントを確認していきます。
項目
・AfterUpdateイベント
・BeforeUpdateイベント
・Enterイベント
・Exitイベント
【補足情報】コントロール共通イベントの発生順番
・AddControlイベント
【補足情報】Addメソッド
・RemoveControlイベント
【補足情報】Removeメソッド
・Layoutイベント
・Scrollイベント
【補足情報】リクエストした距離と実際に移動した距離
インプットタイプ
TextBox / ComboBox / ListBox / CheckBox / OptionButton / ToggleButton / ScrollBar / SpinButton / RefEdit
インプットタイプのコントロールに共通するイベントは次の通りです。
・AfterUpdateイベント
コントロールの内容の変更が確定された時点で発生
・BeforeUpdateイベント
コントロールの内容の変更が確定される直前に発生
AfterUpdateイベント
AfterUpdateイベントは、コントロールの内容の変更が確定された時点で発生します。
テキストボックスであれば、テキストを入力し、フォーカスが移ったタイミングです。
サンプルコード①
テキストボックス1の内容の変更が確定したらメッセージを表示
Private Sub TextBox1_AfterUpdate() MsgBox "TextBox1の内容を変更しました!" End Sub
コントロールの内容に変更がなければ、このイベントは発生しません。
次のようにコードで内容を変更し、フォーカスを移した場合にもAfterUpdateイベントは発生します。
サンプルコード②
【例】フォームをクリックすると、テキストボックス1に”Excel VBA”と設定し、フォーカスをTextBox2に移す
Private Sub TextBox1_AfterUpdate() MsgBox "!" End Sub
Private Sub UserForm_Click() TextBox1.Text = "Excel VBA" TextBox2.SetFocus End Sub
BeforeUpdateイベント
BeforeUpdateイベントは、コントロールの内容の変更が確定される直前に発生します。
また引数Cancelを持ったイベントのため、フォーカスの移動をキャンセルすることができます。
このイベントも、前述AfterUpdateイベントと同様、フォーカスのあるコントロールの内容に変更がなければ発生しません。
サンプルコード
テキストボックスの内容が数値でなければお知らせメッセージを表示し、フォーカスの移動をキャンセル
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) If Not IsNumeric(TextBox1.Text) Then MsgBox "TextBox1には数値を入力してください" Cancel = True End If End Sub
◇Cancel
引数CancelをTrueに設定すると、フォーカスの移動をキャンセルします。
フォーカスを受け取れるタイプ
TextBox / ComboBox / ListBox / CheckBox / OptionButton / ToggleButton / Frame / CommandButton / TabStrip / MutiPage / ScrollBar / SpinButton / RefEdit
フォーカスを受け取れるタイプのコントロールに共通するイベントは次の通りです。
・Enterイベント
コントロールにフォーカスが移った時に発生
・Exitイベント
コントロールからフォーカスが抜ける時に発生
Enterイベント
Enterイベントは、コントロールにフォーカスが移った時に発生します。
マウスのクリック、[Tab]・[Enter]キー、コード、Acceleratorプロパティでのショートカット等、フォーカスの移る方法を問わず発生します。
Exitイベント
Exitイベントは、コントロールからフォーカスが抜ける時に発生します。
マウスのクリック、[Tab]・[Enter]キー、コード、Acceleratorプロパティでのショートカット等、フォーカスの移る方法を問わず発生します。
サンプルコード
テキストボックス1にフォーカスが移ったら、背景色をベージュにし、フォーカスが抜けたら白に戻す
Private Sub TextBox1_Enter() TextBox1.BackColor = &HC0FFFF End Sub
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) TextBox1.BackColor = &HFFFFFF End Sub
◇Cancel
引数CancelをTrueに設定すると、フォーカスの移動をキャンセルします。
【補足情報】コントロール共通イベントの発生順番
BeforeUpdate、AfterUpdate、Exitの各イベントの発生順番は次の通りです。
1.BeforeUpdateイベント
2.AfterUpdateイベント
3.Exitイベント
BeforeUpdate、AfterUpdateイベントは、内容に変更があった場合にのみ発生しますが、Exitイベントは、変更に関係なく発生します。
コンテナタイプ
Frame / MultiPage / (UserForm)
コンテナタイプのコントロールに共通するイベントは次の通りです。
・AddControlイベント
Addメソッドでコントロール、またはページを追加した時に発生
・RemoveControlイベント
追加したコントロールをRemoveメソッドで削除した時に発生
・Layoutイベント
コンテナの位置やレイアウトに変更があった場合発生
・Scrollイベント
コンテナに設置したスクロールバーに変更があった場合に発生
AddControlイベント
AddControlイベントは、Addメソッドでコンテナにコントロール、またはページを追加した時に発生します。
サンプルコード
フレーム1をクリックするとテキストボックスコントロールが追加される
Private Sub Frame1_AddControl(ByVal Control As MSForms.Control) MsgBox TypeName(Control) & "を追加しました!" End Sub
Private Sub Frame1_Click() Me.Frame1.Controls.Add "Forms.TextBox.1" End Sub
◇Control
引数Controlは、追加したコントロールを返します。
【補足情報】Addメソッド
Addメソッドには、コントロールを追加するものとページを追加するものがあります。
◇コントロールを追加 UserFrom / Frame
【構文】オブジェクト.Controls.Add ProgID , (Name) , (Visible)
Addメソッドには3つの引数があります。
・ProgID : 必須 : プログラム識別子
・Name : 任意 : オブジェクト名
・Visible : 任意 : 表示・非表示
ProgIDの確認 [ MSDN Addメソッド(Microsoft Forms) ]
◇ページを追加 MultiPage
【構文】オブジェクト.Pages.Add (Name) , (Caption) , (index)
・Name : 任意 : オブジェクト名
・Caption : 任意 : 見出し
・index : 任意 : ページまたはタブの位置
◇タブを追加 TabStrip※
オブジェクト.Tabs.Add (Name) , (Caption) , (index)
※TabStripコントロールに、AddControlイベントはありません
RemoveControlイベント
ReMoveControlイベントは、コンテナに追加したコントロールをRemoveメソッドで削除した時に発生します。
サンプルコード
フレーム1をクリックすると、フレーム1内にコントロールがなければ、テキストボックスを追加し、追加されていればそれを削除する
Private Sub Frame1_RemoveControl(ByVal Control As MSForms.Control) MsgBox TypeName(Control) & "を削除しました!" End Sub
Private Sub Frame1_Click() With Me.Frame1.Controls If .Count = 0 Then .Add "Forms.TextBox.1", "addTextBox" Else .Remove "addTextBox" End If End With End Sub
◇Control
引数コントロールは、削除したコントロールを返します。
【補足情報】Removeメソッド
Removeメソッドは、追加したコントロールやページを削除します。
◇コントロールを削除 UserFrom / Frame
【構文】オブジェクト.Controls.Remove collectionindex
Removeメソッドの引数は一つで、削除対象をオブジェクト名かコレクション内のindex番号で指定します。
index番号は0から始まります。
・collectionindex : 必須 : オブジェクト名、またはコレクション内のindex
[ MSDN Removeメソッド(Microsoft Forms) ]
◇ページを削除 MultiPage
【構文】オブジェクト.Pages. Remove collectionindex
◇タブを削除 TabStrip※
【構文】オブジェクト.Tabs. Remove collectionindex
※TabStripコントロールに、RemoveControlイベントはありません
Layoutイベント
Layoutイベントは、コンテナの位置やレイアウトに変更があった場合発生します。
コンテナの親コンテナの位置に変更があった場合にも発生します。(フォームを移動した場合に、フレームのLayoutイベントが発生する等)
またフォームが起動する時にも発生するため注意が必要です。
サンプルコード
フレーム1をクリックするとフレームの幅が変更され、Layoutイベントでそれを表示する
Private Sub Frame1_Layout() MsgBox "変更しました!" End Sub
Private Sub Frame1_Click() Frame1.Width = 120 End Sub
Scrollイベント
Scrollイベントは、コンテナにスクロールバーを設置し、それに変更があった場合に発生します。
スクロールバーの詳細については次をご覧ください。
「6-2 スクロールバーでフレーム内を広く活用する」
サンプルコード
フォームの見出しにスクロール値を表示
Private Sub UserForm_Scroll(ByVal ActionX As MSForms.fmScrollAction, ByVal ActionY As MSForms.fmScrollAction, ByVal RequestDx As Single, ByVal RequestDy As Single, ByVal ActualDx As MSForms.ReturnSingle, ByVal ActualDy As MSForms.ReturnSingle) Dim s As String s = "ScrollLeft:" & Me.ScrollLeft & " " s = s & "ScrollTop:" & Me.ScrollTop Me.Caption = s End Sub
◇ActionX / ActionY
引数ActionX/ ActionYは、水平方向、あるいは垂直方向で発生した操作を整数値で返します。
引数 ActionX/ ActionY |
数値 |
変更は発生していない |
0 |
キーボードの[↑]または[←]による操作 |
1 |
キーボードの[↓]または[→]による操作 |
2 |
[Page Up]キーによる操作 |
3 |
[Page Down]キーによる操作 |
4 |
スクロールバーの上端/左端の操作 |
5 |
スクロールバーの下端/右端の操作 |
6 |
ScrollTop/ScrollLeftプロパティの変更 |
8 |
コントロールがコンテナにスクロールを要求 |
9 |
ユーザーが別のコントロールに移動 |
10 |
◇RequestDx / RequestDy
引数RequestDx/RequestDyは、スクロールバーの移動をリクエストした距離をポイント単位で返します。
◇ActualDx / ActualDy
引数ActualDx/ActualDyは、スクロールバーが移動した距離をポイント単位で返します。
【補足情報】リクエストした距離と実際に移動した距離
RequestDx/RequestDyとActualDx/ActualDyは、似ていますが、リクエストした距離と実際に移動した距離という違いがあります。
例えば、垂直スクロールボックスが上端にある場合に垂直スクロールバーの[▲]を押すと、RequestDxは6(ポイント)を返しますが、スクロールボックスはそれ以上移動できないため、ActualDxは0(ポイント)を返します。
書籍紹介140以上のサンプルファイル付き!
知りたいがすぐわかる! やりたいがすぐできる!
「Excel VBA 逆引きで学ぶ ユーザーフォーム&コントロール」(Kindle版)
ユーザーフォームを扱えると、VBAでできることが大きく広がります!
本書では、知りたいこと、やりたいことから、逆引きで学びを深められます。
■ 購入:amazon