MsgBoxの戻り値の受け取り方

今日は、MsgBoxの戻り値の受け取り方について、二通りをご紹介。
f:id:Infoment:20220104121203p:plain

VBEで、MsgBoxの後に "(" を入力すると、下のように表示される。
f:id:Infoment:20220104121548p:plain
末尾に" As VbMsgBoxResult " と表示されていることから、戻り値を
VbMsgBoxResult(Enum)で受け取ることが可能と分かる。
f:id:Infoment:20220104121809p:plain

VbMsgBoxRsult の メンバーを見ると、例えば vbYes は 6 が設定されている。
f:id:Infoment:20220104122021p:plain

従ってMsgBoxの結果を受け取って条件分岐したい場合、例えば次のような書き方が可能だ。

Sub MsgBoxTest1()
    Dim MsgBoxResult As Long
        MsgBoxResult = MsgBox("好きますか?", vbYesNo, "伝染るんです")
        
        Select Case MsgBoxResult
            Case vbYes
                Debug.Print "はい"
            Case vbNo
                Debug.Print "いいえ"
        End Select
End Sub

変数に受け取るのも面倒な場合、こんな書き方もできる。

Sub MsgBoxTest2()        
        Select Case MsgBox("好きますか?", vbYesNo, "伝染るんです")
            Case vbYes
                Debug.Print "はい"
            Case vbNo
                Debug.Print "いいえ"
        End Select
End Sub

※ステップ実行で値を確認しにくいなどの理由から、個人的にはお勧めしません。

私も昔は主に上記の書き方をしていたが、最近は専ら下記で統一している。

Sub MsgBoxTest3()
    ' 変数の型を VbMsgBoxResult で宣言。
    Dim MsgBoxResult As VbMsgBoxResult
        MsgBoxResult = MsgBox("好きますか?", vbYesNo, "伝染るんです")
        
        Select Case MsgBoxResult
            Case vbYes
                Debug.Print "はい"
            Case vbNo
                Debug.Print "いいえ"
        End Select
End Sub

こうしておくと、入力候補が表示されるなどのメリットがある。
f:id:Infoment:20220104123250g:plain

ということで、個人的にはお勧めです。

参考まで。