トップ > 逆引きで学ぶ ユーザーフォーム&コントロール > 2-4 タイプ別コントロールの主なイベントを確認する

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

ページトップへ戻る
Copyright(C) 2009- 坂江 保 All Rights Reserved.