HOME > 即効テクニック > Excel VBA > 関数関連のテクニック > MsgBox関数の使い方(2) - ユーザーが選択したボタンの処理

MsgBox関数の使い方(2) - ユーザーが選択したボタンの処理|Excel VBA

関数関連のテクニック

MsgBox関数の使い方(2) - ユーザーが選択したボタンの処理

(Excel 97/2000/2002/2003/2007/2010/2013/2016)

MsgBox関数の使い方(1) -メッセージボックスの表示方法」では、メッセージの改行、ボタンやアイコンの指定など、いろいろな表示方法をご紹介しました。
いろいろなボタンを表示できたら、今度はユーザーがどのボタンをクリックしたか、その結果を知りたいところです。
ここでは、ユーザーが選択したボタンを判定する方法をご紹介します。

■ユーザーが選択したボタンを判定する

MsgBox関数はユーザーがどのボタンをクリックしたかを数値で返します。
選んだボタンによって処理を行うには、この戻り値を利用します。

「MsgBox関数の使い方(1)」では、引数をカッコで囲まずに利用してきましたが、関数の戻り値を利用するときは、引数をカッコで囲むのがVBAの基本ルールです。
次のコードは、ユーザーがクリックしたボタンの種類を表示します。
2つのMsgBox関数のカッコの有無に留意してください。

Sub Sample5()
    Dim rc As Long
    rc = MsgBox("処理を続けますか?", vbYesNo + vbQuestion)
    MsgBox "クリックされたボタンは" & rc & "です"
End Sub

MsgBox関数はクリックされたボタンを数値で返しますが、それぞれの数値にはあらかじめ定数が定義されています。

【戻り値に関する定数】

戻り値に関する定数の一覧表

これらの定数は、VbMsgBoxResult列挙体のメンバです。
したがって、クリックされたボタンに応じて処理を行うには、IfステートメントやSelect Caseステートメントを使って次のようにします。

Sub Sample6()
    Dim rc As VbMsgBoxResult
    rc = MsgBox("処理を続行しますか?", vbYesNo + vbQuestion)
    If rc = vbYes Then
        MsgBox "処理を続けます", vbInformation
    Else
        MsgBox "処理を中止します", vbCritical
    End If
End Sub

戻り値を受け取る変数rcはLong型で宣言してもいいですが、上のコードのようにVbMsgBoxResult型で宣言しておくと、「If rc = 」まで入力したときに、入力支援機能が効いて列挙体のメンバがずらっと表示されるので、効率よくプログラミングできます。

■[×]ボタンで閉じられたら

メッセージボックスは、[キャンセル]ボタンを表示しているときだけ、右上の[×]ボタンが有効になります。
このとき、[×]ボタンをクリックしたり、[Esc]キーを押してメッセージボックスを閉じたりすると、[キャンセル]ボタンがクリックされたとみなされ、vbCancelを返します。

Sub Sample7()
    Dim rc As VbMsgBoxResult
    rc = MsgBox("送信に失敗しました", vbRetryCancel + vbExclamation)
    If rc = vbCancel Then
        MsgBox "キャンセルします"
    End If
End Sub

「送信に失敗しました」のメッセージボックス

■標準ボタンを指定する

ボタンが1つしかないシンプルなメッセージボックスのとき、マウスでクリックする代わりに[Enter]キーを押すと、メッセージボックスを閉じることができますね。
このように、メッセージボックスの表示時にアクティブになっているボタンを「標準ボタン」といい、[Enter]キーを押すと選択されます。

複数のボタンがある場合、既定では一番左のボタンが標準ボタンになります。
しかし、ときには左のボタンがアクティブになっていると困ることもあります。
たとえば、「すべてのファイルを削除してよろしいですか?」と[はい][いいえ]ボタンを表示しているとき、うっかりさんが、ついうっかり[Enter]キーを押して途方に暮れてしまうかもしれません。
このようなうっかりミスの防止や、選んで欲しいボタンをアクティブにするには、引数Buttonsで標準ボタンを変更します。

標準ボタンを指定する定数は次の表のとおりです。
これらも、ボタンやアイコンを指定する定数と同じVbMsgBoxStyle列挙体のメンバです。

【標準ボタンに関する定数】

標準ボタンに関する定数の一覧表

次のマクロは、[はい][いいえ]ボタンのうち、2つめの[いいえ]ボタンを標準ボタンに指定します。

Sub Sample8()
    Dim rc As VbMsgBoxResult
    rc = MsgBox("この記事、ちょっと長すぎた?", vbYesNo + vbDefaultButton2)
    
    If rc = vbNo Then
        MsgBox "ありがとう"
    Else
        MsgBox "ごめんね"
    End If
End Sub

「この記事、ちょっと長すぎた?」のメッセージボックス

MsgBox関数では、定数で定義されているアイコン以外のものを表示することはできません。
また、表示する文字列の大きさや文字色を指定することもできません。
そうした独自のメッセージボックスを表示したいときは、UserFormを使用してください。