こんにちは、ユーキです。
今回は、リストボックスを選択した時に処理を行う方法を紹介します。
リストボックスの選択時イベント
リストボックスを選択したときの処理と一口に言っても、イベントはいろいろあります。ひとつずつ見ていきましょう。
Clickイベント
リストボックスの行を選択する際に発生します。リストボックス「ListBox1」のClickイベントは以下のようになります。
Private Sub ListBox1_Click()
’選択時に行いたい対処を書く。今回は、イミディエイトウィンドウに文字を出力
Debug.Print "ListBox1_Click:" & Me.ListBox1.Value
End Sub
上記ようなリストボックス「LisitBox1」がであった場合、項目を選択するたびにClickイベントが発生します。今回の処理だと、イミディエイトウィンドウに「ListBox1_Click:AB型」と表示されます(AB型の部分は、選択した項目が入ります)。
マウスで項目を選択しても、矢印キーで選択をしてもイベントは発生します。ただし、複数選択のリストボックス(fmMultiSelectSingleでもfmMultiSelectExtended)においては、Clickイベントは発生しません。
Changeイベント
リストボックスの選択項目が変わった場合に発生します。単一行選択のリストボックスの場合は、Clickイベントと同じです。Clickイベントと異なる点は、複数選択のリストボックス(fmMultiSelectSingleでもfmMultiSelectExtended)でもイベントが発生するという点になります。
Private Sub ListBox1_Change()
’選択時に行いたい対処を書く。今回は、イミディエイトウィンドウに文字を出力
Debug.Print "ListBox1_Change:" & Me.ListBox1.Value
End Sub
BeforeUpdateイベント
BeforeUpdateイベントも、リストボックスの選択項目が変わった場合に発生するイベントとなります。ClickイベントやChangeイベントと異なるのは、引数Cancelが存在することです。
引数CancelにTrueを代入すると、そこで終了となります。引数CancelにTrueを代入して処理終了した場合、後述するAfterUpdateイベントも発生しなくなる点に注意してください。
Private Sub ListBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
'選択時に行いたい対処を書く。今回は、イミディエイトウィンドウに文字を出力
Debug.Print "ListBox1_BeforeUpdate:" & Me.ListBox1.Value
If (Me.ListBox1.Text = "O型") Then
'CancelにTrueを代入すると、そこで処理は終了となる
Cancel = True
End If
End Sub
複数選択のリストボックス(fmMultiSelectSingleでもfmMultiSelectExtended)では、最初に一度発生するだけとなり、選択項目を変更してもこのイベントは発生しません。
AfterUpdateイベント
AfterUpdateイベントもリストボックスの選択項目が変わった場合に発生するイベントとなります。BeforeUpdateイベントが実行がCancelされると、AfterUpdateイベントは発生しなくなります。
Private Sub ListBox1_AfterUpdate()
'選択時に行いたい対処を書く。今回は、イミディエイトウィンドウに文字を出力
Debug.Print "ListBox1_AfterUpdate:" & Me.ListBox1.Value
End Sub
複数選択のリストボックス(fmMultiSelectSingleでもfmMultiSelectExtended)では、最初に一度発生するだけとなり、選択項目を変更してもこのイベントは発生しません。
その他のイベント
項目選択時ではないですが、選択に付随して発生するイベントを2つほど紹介しておきます。
Enterイベント
Enterイベントは、リストボックスにフォーカスが移るときに発生します。
Private Sub ListBox1_Enter()
Debug.Print "ListBox1_Enter:" & Me.ListBox1.Value
End Sub
Exitイベント
Exitイベントは、リストボックスからフォーカスが外れるときに発生します。他のボタンやコントロールを選択しても、フォーカスが外れるので、Exitイベントが発生します。
Private Sub ListBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Debug.Print "ListBox1_Exit:" & Me.ListBox1.Value
End Sub
BeforeUpdateイベント同様、引数Cancelがあります。これをTrueに設定すると、フォーカスが他のコントロール移動しません。処理をキャンセルしたい場合に使いましょう。
イベントの発生順序
上記で紹介したイベントを発生順に並べると以下のようになります。
- フォーカスがリストボックスに移動したとき
- Enterイベント
- 項目選択時(単一行選択)
- Changeイベント
- Clickイベント
- BeforeUpdateイベント
- AfterUpdateイベント
- 項目選択時(複数行選択)
- Changeイベント
- フォーカスが外れるとき
- Exitイベント
まとめ
今回は、リストボックスの選択時のイベントについて紹介しました。
単純に項目を選択したときに処理をするのであれば、Changeがイベントが妥当だと思います。単一行選択であれば、Clickイベントでも直観的でよいと思います。BeforeUpdateイベント、AfterUpdateイベントは組合せて、処理を取り消しした場合の処理や処理を確定した後の行いたい処理を書きたい場合に使用するのが妥当でしょう。
- リストボックス選択時イベントは、Changeイベント、Clickイベント、BeforeUpdateイベント、AfterUpdateイベントがある
- それぞれ発生順序は決まっている
- BeforeUpdateイベントは、処理をキャンセルすることができる
- BeforeUpdateイベントをキャンセルすると、AfterUpdateイベントは発生しない
- 単一行選択と複数行選択のリストボックスで、発生イベントが異なる
少しでもお役に立てば、幸いです。