MsgBox関数はメッセージダイアログを表示する
MsgBox関数は、出したいメッセージをメッセージダイアログで表示します。
表示されるメッセージダイアログの見た目はWindowsの設定によって変わります。
MsgBox関数の戻り値で「はい」や「いいえ」や「×ボタン」などのどのボタンが押されたが分かる仕組みになっています。
単純にメッセージダイアログを出す方法
1 2 3 |
Sub MsgBoxTest1() Call MsgBox("MsgBoxのテスト。") End Sub |
メッセージダイアログのどのボタンが押されたかを判定する方法
1 2 3 4 5 6 |
Sub MsgBoxTest2() Dim result result = MsgBox("MsgBoxのテスト。") Debug.Print result End Sub |
構文
Function MsgBox(Prompt, [Buttons As VbMsgBoxStyle = vbOKOnly], [Title], [HelpFile], [Context]) As VbMsgBoxResult
Prompt(必須) | ダイアログダイアログに表示する文字列を設定します。 | ||||||||||||||||||||||||
Buttons(省略可) | 主にボタンの種類を設定します。
他にも、アイコンの種類、標準ボタン(Enterキーで押せるボタン)、メッセージダイアログのモーダル状態、ヘルプボタン、最前面表示、テキスト位置、などを定数で指定します。指定方法は癖があるため後述します。省略すると「OK」ボタンが表示されます。 |
||||||||||||||||||||||||
Title(省略可) | ダイアログボックスのタイトルバーに表示する文字列を設定します。省略すると「Microsoft Excel」と表示されます。 | ||||||||||||||||||||||||
HelpFile(省略可) | 第二引数ButtonsでvbMsgBoxHelpButtonを指定してヘルプボタンを押したときに表示するヘルプファイルのパスを設定します。 | ||||||||||||||||||||||||
Context(省略可) | 第二引数ButtonsでvbMsgBoxHelpButtonを指定してヘルプボタンを押したときに表示するヘルプの内容に対応する番号を設定します。 | ||||||||||||||||||||||||
戻り値 | 押したボタンの種類がVbMsgBoxResult列挙型の定数で返されます。
|
引数がたくさんありますが、一般的に利用するのは第一引数(メッセージ本文)と第二引数(ボタンの種類)です。他は必要なときに使うぐらいです。
Buttonsの定数
第二引数のButtonsはVbMsgBoxStyle列挙型で定義されています。
5種類(ボタン、アイコン、標準ボタン、状態、その他)に分けられており、+記号で組み合わせ、「vbYesNo + vbInformation」または「4 + 64」または「68」のように指定します。
ボタンの種類
定数 | 値 | 説明 |
---|---|---|
vbOKOnly | 0(初期値) | 「OK」ボタンを表示します。×ボタンも「OK」ボタン扱いになります。 |
vbOKCancel | 1 | 「OK」「キャンセル」ボタンを表示します。×ボタンは「キャンセル」ボタン扱いになります。 |
vbAbortRetryIgnore | 2 | 「中止」「再試行」「無視」ボタンを表示します。×ボタンは非活性で押せません。 |
vbYesNoCancel | 3 | 「はい」「いいえ」「キャンセル」ボタンを表示します。×ボタンは「キャンセル」ボタン扱いになります。 |
vbYesNo | 4 | 「はい」「いいえ」ボタンを表示します。×ボタンは非活性で押せません。 |
vbRetryCancel | 5 | 「再試行」「キャンセル」ボタンを表示します。×ボタンは「キャンセル」ボタン扱いになります。 |
メッセージボックスの表示状態
定数 | 値 | 説明 |
---|---|---|
vbApplicationModal | 0(初期値) | メッセージボックスのボタン操作が終わるまでExcelの操作ができない状態(モーダル状態)になります。 |
vbSystemModal | 4096 | メッセージボックスのボタン操作が終わるまでExcelを含む全てのアプリケーションでメッセージボックスが表示された状態(常にメッセージボックスが見える状態)になります。 |
アイコンの種類
定数 | 値 | 説明 |
---|---|---|
vbCritical | 16 | 警告アイコン(×マーク)を表示します。 |
vbQuestion | 32 | 問い合わせアイコン(?マーク)を表示します。 |
vbExclamation | 48 | 感嘆符アイコン(!マーク)を表示します。 |
vbInformation | 64 | 情報アイコン(小文字のi)を表示します。 |
標準ボタン(エンターキーで実行されるボタン)の指定
定数 | 値 | 説明 |
---|---|---|
vbDefaultButton1 | 0(初期値) | 一番左のボタンを標準ボタンにします。 |
vbDefaultButton2 | 256 | 左から2番目のボタンを標準ボタンにします。2番目のボタンが無い場合は無視されます。 |
vbDefaultButton3 | 512 | 左から3番目のボタンを標準ボタンにします。3番目のボタンが無い場合は無視されます。 |
vbDefaultButton4 | 768 | 左から4番目のボタンを標準ボタンにします。4番目のボタンが無い場合は無視されます。 |
その他(これらは通常使うことはありません)
定数 | 値 | 説明 |
---|---|---|
vbMsgBoxHelpButton | 16384 | ヘルプボタンを追加します。 |
vbMsgBoxSetForeground | 65535 | メッセージボックスウィンドウを前面ウィンドウとします。ただ、指定しなくても通常は最前面に表示されます。 |
vbMsgBoxRight | 524288 | テキストを右寄せにします。 |
vbMsgBoxRtlReading | 1048576 | アラビア語のようにタイトル、メッセージ本文、ボタン配置がいずれも左右逆に表示します。 |
引数を括弧で囲う書き方と囲わない書き方
どのボタンが押されたかの判定が不要で、単にメッセージだけを表示させたい場合は、第一引数のPromptのみにメッセージ本文を指定します。ボタンの種類を指定していませんが、ボタンは「OK」ボタンのみが表示されます。
この場合、MsgBox関数の呼び出し方にはCallを使うか使わないかの2通りの書き方があります。
Callを使う場合
1 2 3 4 |
'// Callを使って関数呼び出しを明示する書き方(引数を括弧で囲う) Sub MsgBoxTest3() Call MsgBox("MsgBoxのテスト") End Sub |
Callを使わない場合
1 2 3 4 |
'// Callを使わない場合の書き方(括弧不要) Sub MsgBoxTest3() MsgBox "MsgBoxのテスト" End Sub |
一般的には括弧を書かない書き方が多い気がしますが、個人的には関数呼び出しを明示するためにCallを使う方がよいと思われます。
メッセージを変数を使って可変表示する場合
メッセージ本文に可変部分が指定した場合は、変数を利用することも可能です。
1 2 3 4 5 6 7 |
Sub MsgBoxTest4() Dim n n = Now Call MsgBox("MsgBoxのテスト" & n) End Sub |
上のコードではNow関数の結果の日時(変数n)をそのまま&で文字列”MsgBoxのテスト”に連結していますが、メッセージは文字列のため変数が文字列でない数値などの場合は暗黙の変換を期待せず、以下のようにCStr関数を使って文字列に変換する方が無難です。
CStr関数などの型変換関数についての詳細は「VBAの型変換関数(キャスト)」をご参照ください。
1 2 3 4 5 6 |
Sub MsgBoxTest5() Dim i As Integer i = 12345 Call MsgBox("MsgBoxのテスト" & ":" & CStr(i)) End Sub |
メッセージを改行して複数行表示するには
メッセージを改行して複数行表示したい場合は、メッセージ文字列の改行したい位置で、改行コードを連結します。
改行コードにはLF、CR、CRLFの3種類がありますが、いずれを使ってもメッセージは改行されます。
- LF(ラインフィード):「vbLf」または「Chr(10)」
- CR(キャリッジリターン):「vbCr」または「Chr(13)」
- CRLF:「vbCrLf」または「Chr(13) & Chr(10)」
1 2 3 4 5 6 7 8 9 10 11 |
Sub MsgBoxTestLF() Call MsgBox("1行目" & vbLf & "2行目" & Chr(10) & "3行目") End Sub Sub MsgBoxTestCR() Call MsgBox("1行目" & vbCr & "2行目" & Chr(13) & "3行目") End Sub Sub MsgBoxTestCRLF() Call MsgBox("1行目" & vbCrLf & "2行目" & Chr(13) & Chr(10) & "3行目") End Sub |
押したボタンの種類で処理を分ける場合
メッセージボックスのどのボタンのどちらを押したかで処理を変えたい場合は、MsgBox関数の戻り値で判定できます。
例えば、第二引数に「vbYesNoCancel」を指定して「はい」「いいえ」「キャンセル」ボタンを表示するようにしている場合、「はい」ボタンであれば「vbYes(値は6)」、「いいえ」ボタンであれば「vbNo(値は7)」、「キャンセル」ボタンであれば「vbCancel(値は2)」がMsgBox関数の戻り値として返されます。
この場合はCallではなく戻り値を受け取る書き方になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub MsgBoxYesNoCancelTest() Dim result As Integer result = MsgBox("MsgBoxのテスト", vbYesNoCancel) '// はい が押された場合 If result = vbYes Then Debug.Print "はい が押された:" & CStr(result) '// "はい が押された:6" '// いいえ が押された場合 ElseIf result = vbNo Then Debug.Print "いいえ が押された:" & CStr(result) '// "いいえ が押された:7" '// キャンセル または ×ボタンが押された場合 Else Debug.Print "キャンセル または ×ボタンが押された:" & CStr(result) '// "キャンセル または ×ボタンが押された:2" End If End Sub |
メッセージボックスはボタンが複数ある場合に×ボタンを押せることがありますが、いずれも「キャンセル」ボタン扱いになります。OKボタンだけのメッセージボックスでも×ボタンを押せますがその場合は「OK」ボタン扱いになります。
MsgBox関数ではフォントの変更は出来ない
メッセージボックスに表示するメッセージの見た目は変更できません。そのため、メッセージのサイズ、色、太さ、フォントの変更は出来ません。
どうしても見た目を変えたいのであれば、ユーザーフォームでメッセージボックスを自作してそれを利用する方法があります。
メッセージボックスは処理が止まっていいところで出すようにする
メッセージボックスを多用するのは避けましょう。理由は大きく2つあります。
1つ目の理由は、メッセージボックスが表示されている間はVBAの処理が止まるためです。メッセージボックスのボタンを押されるまでずっと次の行の処理が待たされます。そのため、メッセージボックスは処理の最後に「処理が終わったよ」ということを通知することに使うなど、後続処理に影響がないタイミングで出すようにした方がよいです。
2つ目の理由は、うるさい、です。マクロを実行する度に毎回毎回メッセージボックスが表示されると、「あー、うるさいな」と感じます。メッセージボックスは必ずボタン操作を要求するため、それが煩わしく感じてくることがあります。そういう場合は出さない方が精神衛生上よいです。
でも、処理の状況を知りたい、ということはあります。そういう場合はメッセージボックスではなく「Debug.Print」でイミディエイトウィンドウに出力したり、テキストファイルに処理状況を出力するなどして処理を止めないようにしましょう。
Debu.Printの例
1 2 3 4 5 6 7 8 |
Sub MsgBoxTest7() '// MsgBoxをやめる '// Call MsgBox("処理の途中報告") '// かわりにDebug.Printを使う Debug.Print "処理の途中報告" End Sub |
テキストファイルの例
テキストファイルに出力する場合は以下のようにOpen、Print、Closeステートメントを使うことで対応できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub MsgBoxTest8() Dim n As Integer '// ファイル番号 Dim sPath As String '// テキストファイルパス sPath = "C*\test\a.txt" '// ファイル番号取得 n = FreeFile '// 追加モードでファイルを開く Open sPath For Append As #n Print #n, "処理の途中報告" '// ファイルを閉じる Close #n End Sub |
テキストファイルへの出力の詳細については「VBAでテキストファイルの読み書きを行う」をご参照ください。
他にもFileSystemObjectを使ってテキストファイルを出力する方法もあります。詳細は「VBAでのFileSystemObjectとTextStreamの使い方」をご参照ください。