MsgBox関数はメッセージダイアログを表示する

MsgBox関数は、出したいメッセージをメッセージダイアログで表示します。

表示されるメッセージダイアログの見た目はWindowsの設定によって変わります。

MsgBox関数の戻り値で「はい」や「いいえ」や「×ボタン」などのどのボタンが押されたが分かる仕組みになっています。

単純にメッセージダイアログを出す方法


メッセージダイアログのどのボタンが押されたかを判定する方法



構文

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列挙型の定数で返されます。

定数 ボタン
vbOK 1 「OK」ボタン
vbCancel 2 「キャンセル」ボタン
vbAbort 3 「中止」ボタン
vbRetry 4 「再試行」ボタン
vbIgnore 5 「無視」ボタン
vbYes 6 「はい」ボタン
vbNo 7 「いいえ」ボタン

引数がたくさんありますが、一般的に利用するのは第一引数(メッセージ本文)と第二引数(ボタンの種類)です。他は必要なときに使うぐらいです。


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を使う場合

 

Callを使わない場合

一般的には括弧を書かない書き方が多い気がしますが、個人的には関数呼び出しを明示するためにCallを使う方がよいと思われます。


メッセージを変数を使って可変表示する場合

メッセージ本文に可変部分が指定した場合は、変数を利用することも可能です。

上のコードではNow関数の結果の日時(変数n)をそのまま&で文字列”MsgBoxのテスト”に連結していますが、メッセージは文字列のため変数が文字列でない数値などの場合は暗黙の変換を期待せず、以下のようにCStr関数を使って文字列に変換する方が無難です。

CStr関数などの型変換関数についての詳細は「VBAの型変換関数(キャスト)」をご参照ください。



メッセージを改行して複数行表示するには

メッセージを改行して複数行表示したい場合は、メッセージ文字列の改行したい位置で、改行コードを連結します。

改行コードにはLF、CR、CRLFの3種類がありますが、いずれを使ってもメッセージは改行されます。

  • LF(ラインフィード):「vbLf」または「Chr(10)」
  • CR(キャリッジリターン):「vbCr」または「Chr(13)」
  • CRLF:「vbCrLf」または「Chr(13) & Chr(10)」




押したボタンの種類で処理を分ける場合

メッセージボックスのどのボタンのどちらを押したかで処理を変えたい場合は、MsgBox関数の戻り値で判定できます。

例えば、第二引数に「vbYesNoCancel」を指定して「はい」「いいえ」「キャンセル」ボタンを表示するようにしている場合、「はい」ボタンであれば「vbYes(値は6)」、「いいえ」ボタンであれば「vbNo(値は7)」、「キャンセル」ボタンであれば「vbCancel(値は2)」がMsgBox関数の戻り値として返されます。

この場合はCallではなく戻り値を受け取る書き方になります。

メッセージボックスはボタンが複数ある場合に×ボタンを押せることがありますが、いずれも「キャンセル」ボタン扱いになります。OKボタンだけのメッセージボックスでも×ボタンを押せますがその場合は「OK」ボタン扱いになります。


MsgBox関数ではフォントの変更は出来ない

メッセージボックスに表示するメッセージの見た目は変更できません。そのため、メッセージのサイズ、色、太さ、フォントの変更は出来ません。

どうしても見た目を変えたいのであれば、ユーザーフォームでメッセージボックスを自作してそれを利用する方法があります。



メッセージボックスは処理が止まっていいところで出すようにする

メッセージボックスを多用するのは避けましょう。理由は大きく2つあります。

1つ目の理由は、メッセージボックスが表示されている間はVBAの処理が止まるためです。メッセージボックスのボタンを押されるまでずっと次の行の処理が待たされます。そのため、メッセージボックスは処理の最後に「処理が終わったよ」ということを通知することに使うなど、後続処理に影響がないタイミングで出すようにした方がよいです。

2つ目の理由は、うるさい、です。マクロを実行する度に毎回毎回メッセージボックスが表示されると、「あー、うるさいな」と感じます。メッセージボックスは必ずボタン操作を要求するため、それが煩わしく感じてくることがあります。そういう場合は出さない方が精神衛生上よいです。

でも、処理の状況を知りたい、ということはあります。そういう場合はメッセージボックスではなく「Debug.Print」でイミディエイトウィンドウに出力したり、テキストファイルに処理状況を出力するなどして処理を止めないようにしましょう。

Debu.Printの例

テキストファイルの例
テキストファイルに出力する場合は以下のようにOpen、Print、Closeステートメントを使うことで対応できます。

テキストファイルへの出力の詳細については「VBAでテキストファイルの読み書きを行う」をご参照ください。

他にもFileSystemObjectを使ってテキストファイルを出力する方法もあります。詳細は「VBAでのFileSystemObjectとTextStreamの使い方」をご参照ください。