MsgBox関数の使い方(2) - ユーザーが選択したボタンの処理|Excel VBA |
「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を使用してください。