Excel VBAで、OKボタン、キャンセルボタンを配置したユーザーフォームの戻り値を取得する方法を紹介します。
OKボタン、またはキャンセルボタンを押すとユーザーフォームが閉じられ、どのボタンが押されたのか取得できるようにします。
フォームデザイン
以下のようにユーザーフォームを作成します。
項目 | コントロール | オブジェクト名 |
---|---|---|
フォーム | ユーザーフォーム | UserForm1 |
OKボタン | コマンドボタン | cmdOK |
キャンセルボタン | コマンドボタン | cmdCancel |
コードと解説
ユーザーフォーム(UserForm1)に以下のコードを記述します。
' UserForm1に記述するコード
Option Explicit
Private m_dialogResult As VbMsgBoxResult ' 戻り値
' コンストラクタ(初期化処理)。
Private Sub UserForm_Initialize()
m_dialogResult = vbCancel
End Sub
' キャンセルボタンを押したとき。
Private Sub cmdCancel_Click()
Me.Hide
End Sub
' OKボタンを押したとき。
Private Sub cmdOK_Click()
m_dialogResult = vbOK
Me.Hide
End Sub
' UserForm が閉じる前に発生するイベント。
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If (CloseMode = vbFormControlMenu) Then
Cancel = True
Me.Hide
End If
End Sub
' [プロパティ] ユーザーフォーム戻り値。(読み取り専用)
Public Property Get DialogResult() As VbMsgBoxResult
DialogResult = m_dialogResult
End Property
ユーザーフォームの戻り値にVbMsgBoxResult型のメンバ変数「m_dialogResult」を宣言しておきます。そして、プロパティ「DialogResult」を介して外部から取得できるようにしておきます。
m_dialogResultは、初期化時にvbCancelを設定し、OKを押したときにはvbOKを設定するようにします。
※MsgBoxでないのに VbMsgBoxResult を使用することに抵抗があれば、自前で列挙型を定義しても良いと思います。
ユーザーフォームを閉じる(Unloadする)とプロパティにアクセスできなくなるので、Hideで非表示するようにしています。また、右上の×ボタンを押したときに閉じられないように、UserForm_QueryCloseイベントでHideするようにしています。
使用例
作成したユーザーフォームの使用例です。
Private Sub Sample()
' 変数宣言。
Dim frm As UserForm1
' インスタンス化。
Set frm = New UserForm1
' ユーザーフォームをモーダル表示する。
frm.Show vbModal
If (frm.DialogResult = vbOK) Then
' OKボタンが押された時の処理。
Debug.Print "OKが押されました。"
ElseIf (frm.DialogResult = vbCancel) Then
' キャンセルボタンが押された時の処理。
Debug.Print "キャンセルが押されました。"
End If
' ユーザーフォームをアンロードする。
Call Unload(frm)
End Sub