VBA(Visual Basic for Applications)では、UserForm(ユーザーフォーム)を使って、視覚的なインターフェースを作成し、ユーザー入力を効率的に取得することができます。UserFormはコントロール(テキストボックス、ボタン、チェックボックスなど)と組み合わせて使うことが多く、これに付随するイベントプロシージャを活用することで、インタラクティブで柔軟な動作を実現できます。
◆ UserFormイベントとは?
UserFormイベントとは、ユーザーフォーム自体やその中に配置されたコントロール(TextBox、CommandButtonなど)で発生するアクション(表示、クリック、変更など)に対応して実行されるVBAプロシージャです。
たとえば、UserFormを開いたときに初期化処理をしたり、ボタンがクリックされたときに処理を開始したりといったことが可能です。
◆ UserFormイベントの記述場所
- VBE(Visual Basic Editor)を開く(Alt + F11)
- プロジェクトウィンドウで「UserForm1」などのフォームをダブルクリック
- 上部のドロップダウンから「UserForm」やコントロール名を選び、右側でイベントを選択
◆ 主なUserFormイベント一覧と説明
1. UserForm_Initialize
UserFormが表示される前に一度だけ呼び出されます。主に初期設定に使用します。
Private Sub UserForm_Initialize()
ComboBox1.AddItem "男性"
ComboBox1.AddItem "女性"
TextBox1.Value = "ここに入力"
End Sub
2. UserForm_Activate
UserFormがユーザーに表示されたときに実行されます。Initializeのあとに起こります。
Private Sub UserForm_Activate()
MsgBox "フォームがアクティブになりました"
End Sub
3. UserForm_QueryClose
フォームが閉じられる前に呼ばれ、閉じる処理をキャンセルすることもできます。
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If MsgBox("本当に閉じますか?", vbYesNo) = vbNo Then
Cancel = True
End If
End Sub
4. UserForm_Terminate
UserFormが完全に閉じられた後に発生します。リソース解放などに使われます。
Private Sub UserForm_Terminate()
MsgBox "フォームが閉じられました"
End Sub
◆ コントロールのイベント(UserForm内)
UserForm上に配置した各コントロールにもイベントがあります。
● CommandButton(ボタン)
Private Sub CommandButton1_Click()
MsgBox "ボタンがクリックされました"
End Sub
● TextBox(テキスト入力)
Private Sub TextBox1_Change()
Label1.Caption = "現在の入力:" & TextBox1.Text
End Sub
● ComboBox(プルダウン選択)
Private Sub ComboBox1_Change()
MsgBox "選択された値:" & ComboBox1.Value
End Sub
● CheckBox(チェック)
Private Sub CheckBox1_Click()
If CheckBox1.Value = True Then
MsgBox "チェックされました"
Else
MsgBox "チェックが外れました"
End If
End Sub
◆ 実用例:ログインフォーム
以下は、ユーザー名とパスワードを入力して認証するフォームの例です。
Private Sub CommandButton1_Click()
If TextBox1.Text = "admin" And TextBox2.Text = "1234" Then
MsgBox "ログイン成功"
Me.Hide
Else
MsgBox "ユーザー名またはパスワードが間違っています"
End If
End Sub
Private Sub UserForm_Initialize()
TextBox1.Text = ""
TextBox2.Text = ""
TextBox2.PasswordChar = "*"
End Sub
◆ 応用機能:フォームの動的変更
表示中のラベルやテキストをリアルタイムで更新:
Private Sub TextBox1_Change()
Label1.Caption = "文字数:" & Len(TextBox1.Text)
End Sub
◆ エラー処理の追加
フォームではユーザー操作が不確実なので、エラー処理も重要です。
Private Sub CommandButton1_Click()
On Error GoTo ErrHandler
Dim x As Integer
x = CInt(TextBox1.Text)
MsgBox "数値:" & x
Exit Sub
ErrHandler:
MsgBox "有効な数値を入力してください"
End Sub
◆ UserFormの表示方法
UserFormは次のようにして表示します。
Sub フォーム表示()
UserForm1.Show
End Sub
モーダル(他の操作をブロック)で表示され、.Show vbModeless
を指定すれば非モーダル表示が可能です。
UserForm1.Show vbModeless
◆ イベント活用の注意点
- 過剰なイベントの使用はパフォーマンスに悪影響を与える
- 無限ループや意図しない再実行を防ぐため、フラグや条件を使う
- Initialize → Activate →(操作)→ Terminate の流れを理解する
- テスト時は
.Hide
と.Unload
の違いに注意(Hide
はメモリ上に残る)
◆ まとめ
項目 | 内容 |
---|---|
主なイベント | Initialize, Activate, Click, Change, QueryClose, Terminate 等 |
使用タイミング | 初期化、クリック処理、データ検証、フォーム終了処理などに活用 |
コントロール例 | CommandButton, TextBox, ComboBox, CheckBox など |
実用例 | ログイン、フォームバリデーション、リアルタイム計算など |
注意点 | 過剰なイベント使用、エラー処理、モーダル制御 |