【ExcelVBA】ユーザーフォームのChangeイベントをハンドリングしたい

ExcelVBA, フォームの操作

テキストボックスにカーソルから入力した場合のChangeイベントと、それ以外の入力から発生したChangeイベントの違いを識別したいときの方法です。

それ以外の入力には、CommandButtonを押したらTextBoxに値を入力させたり、他のプロシージャからTextBoxに値を入力させたり等々があります。

Changeイベントをハンドリング

今回は、TextBox1にカーソルから値を入力させた場合と、CommandButton1を押してTextBox1に値を入力させた場合の TextBox1_Change イベントを、 ActiveControl.Name を使って違いを識別させます。

※ActiveControl.Nameは、フォーカスがあるコントロール名を返します。

以下では、ユーザーフォーム画面に「TextBox1」と「CommandButton1」が存在することを前提に説明します。

UserForm1のオブジェクト



オブジェクト名は TextBox1 と CommandButton1 です。
CommandButton1 を押すと TextBox1.value = "ボタン入力テスト" が実行される仕組みにします。

UserForm1のコード内容

Private Sub TextBox1_Change()

    If ActiveControl.Name = TextBox1.Name Then
        MsgBox "同じ: " & ActiveControl.Name & "=" & TextBox1.Name
    Else
        MsgBox "違う: " & ActiveControl.Name & "<>" & TextBox1.Name
    End If

End Sub

Private Sub CommandButton1_Click()

    TextBox1.value = "ボタン入力テスト"

End Sub
3行目のif文で コントロール名の違いを識別させています。

結果

◆カーソルから入力した場合の結果


◆ボタンを押した場合の結果

余談

今回の例では、テキストボックスのチェンジイベントを判定させる方法でしたが、ラジオボタン・チェックボックス・リストボックス・コンボボックスなどにも応用ができます。