【VBA】ユーザーフォームの戻り値を取得する

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
タイトルとURLをコピーしました