何かと便利なMsgBox関数の使い方、アレンジ方法の記事です。
関数なので、押したボタンによって戻り値を取得することが可能です。この戻り値を使って分岐処理するところまで解説します。
成果物

選択肢やアイコンを変更したメッセージボックスを表示し、押したボタンによって処理を振り分けます。
MsgBox関数の使い方
メッセージボックスを表示
Msgbox(Prompt,Buttons,Title,Helpfile,Context)
※Prompt以外は省略可能
Msgbox(Prompt,Buttons,Title,Helpfile,Context)
※Prompt以外は省略可能
メッセージの表示(Prompt)

メッセージを表示するだけであれば、特別難しいことはありません。
MsgBox”hello”と打ったコードを実行すれば、
MsgBox”hello”と打ったコードを実行すれば、

“”の中の文章がメッセージボックスに表示されます。
MsgBox (“hello”)でもOKです。
MsgBox (“hello”)でもOKです。

“”で区切った文章の間に関数や取得した変数を挿入することも可能です。

Now関数を挟むことで、現在時刻を表示しています。

改行する場合は、Chr(10)を挟みます。

実行結果です。他にChr(13)、VBLf、vbCrのいずれかを挟んでも改行可能です。
※Chr(10)またはVBLfがラインフィード、Chr(13)またはvbCrがキャリッジリターンで、どちらも改行する時に使うコードです。昔は両方まとめて行わないと改行できなかったので二種類ありますが、この場合どっちか片方でOKです。

このメッセージボックスに表示するメッセージは、フィールド名で言うとpromptになります。
ボタン、アイコンの種類などを変更(Buttons)
ボタンを変更

Buttonsに指定の値を入力すると、ボタンの種類やアイコン表示を変更することができます。
たとえばMsgBox prompt:=”test”, Buttons:=vbOKCancelとしてやれば、
たとえばMsgBox prompt:=”test”, Buttons:=vbOKCancelとしてやれば、

このように「OK」と「キャンセル」のどちらかを押せるメッセージボックスを表示できます。
vbOKCancelの代わりにButtons:=1としても同じ結果になります。
vbOKCancelの代わりにButtons:=1としても同じ結果になります。

Buttons:=vbAbortRetryIgnoreまたはButtons:=2だとこう。
押したボタンによって処理を振り分ける方法については後述します。
押したボタンによって処理を振り分ける方法については後述します。
定数 | 値 | 内容 |
---|---|---|
vbOKOnly | 0 | OKボタンを表示 |
vbOKCancel | 1 | OK、キャンセルボタンを表示 |
vbAbortRetryIgnore | 2 | 中止、再試行、無視ボタンを表示 |
vbYesNoCancel | 3 | はい、いいえ、キャンセルボタンを表示 |
vbYesNo | 4 | はい、いいえボタンを表示 |
vbRetryCancel | 5 | 再試行、キャンセルボタンを表示 |
アイコンを変更

Buttonsではボタンの選択肢の他にもいろいろできることがあり、たとえばアイコンを変更することができます。
MsgBox prompt:=”test”, Buttons:=vbCriticalと入力して実行すると、このように警告アイコンが表示されます。
vbCriticalの代わりにButtons:=16と入力しても同様の結果になります。
MsgBox prompt:=”test”, Buttons:=vbCriticalと入力して実行すると、このように警告アイコンが表示されます。
vbCriticalの代わりにButtons:=16と入力しても同様の結果になります。

vbQuestionまたは32だと問い合わせアイコン、

vbExclamationまたは48で注意アイコン、

vbInformationまたは64で情報アイコンが表示されます。
定数 | 値 | 内容 |
---|---|---|
vbCritical | 16 | 警告アイコンを表示 |
vbQuestion | 32 | 問い合わせアイコンを表示 |
vbExclamation | 48 | 注意アイコンを表示 |
vbInformation | 64 | 情報アイコンを表示 |
ボタンもアイコンも変更

ボタン、アイコン両方変更したい場合は、MsgBox prompt:=”test”, Buttons:=vbQuestion + vbYesNoCancelのように両方書くか、vbQuestionの32とvbYesNoCancelの3を足した35をButtonsに指定します。
以下の引数も同様の方法で同時に実行可能です。
以下の引数も同様の方法で同時に実行可能です。
標準ボタンを変更

標準ボタンというのは、メッセージボックスで最初から青くなっている選択肢、Enterを押すと選択されるボタンのことです。
通常であれば一番左のボタンが選択されていますが、この規定の状態はButtons:=vbDefaultButton1(数字で言うと0)に当たります。
通常であれば一番左のボタンが選択されていますが、この規定の状態はButtons:=vbDefaultButton1(数字で言うと0)に当たります。

vbDefaultButton2(数字で言うと256)にすれば2番目、

vbDefaultButton3(数字で言うと512)にすれば3番目のボタンが標準ボタン、vbDefaultButton4(数字で言うと768)で4番目のボタンが標準ボタンになります。

4番目のボタンは後述するヘルプボタンを追加すると表示可能です。
もしボタンが2種類しかないのに3番目や4番目のボタンを標準ボタンに指定した場合、1番目のボタンが標準ボタンになります。
定数 | 値 | 内容 |
---|---|---|
vbDefaultButton1 | 0 | 1番目のボタンを標準ボタンに設定 |
vbDefaultButton2 | 256 | 2番目のボタンを標準ボタンに設定 |
vbDefaultButton3 | 512 | 3番目のボタンを標準ボタンに設定 |
vbDefaultButton4 | 768 | 4番目のボタンを標準ボタンに設定 |
モーダルを変更

Buttonsに何も指定しないかvbApplicationModal(数字で言うと0)の場合、メッセージが表示されている間はExcelが操作できなくなります。
Excel以外のアプリケーションは操作可能です(アプリケーションモーダル)。
Excel以外のアプリケーションは操作可能です(アプリケーションモーダル)。

Buttons:=vbSystemModal(数字で言うと4096)の場合、PCのシステムに干渉し、メッセージに返答しない限り他のアプリも操作できなくなります(システムモーダル)。
定数 | 値 | 内容 |
---|---|---|
vbApplicationModal | 0 | アプリケーションモーダル |
vbSystemModal | 4096 | システムモーダル |
ヘルプボタンの表示

Buttons:=vbMsgBoxHelpButton(数字で言うと16384)のようにすることで、ヘルプボタンを表示することができます。ただし、ボタンを押してもヘルプファイルがうまく表示できなかったりします(後述)。
定数 | 値 | 内容 |
---|---|---|
vbMsgBoxHelpButton | 16384 | ヘルプボタンを表示 |
その他

Buttons:=vbMsgBoxSetForeground(数字で言うと65536)とすると、メッセージを最前面に表示することができます。

Buttons:=vbMsgBoxRight(数字で言うと524288)の場合、メッセージを右寄せで表示します。

Buttons:=vbMsgBoxRtlReading(数字で言うと1048576)は文字を右から左に読む形式で表示する設定ですが、言語システムがヘブライ語かアラビア語のときにしか使えません。日本語や英語の場合は何も起こらないです。
定数 | 値 | 内容 |
---|---|---|
vbMsgBoxSetForeground | 65536 | メッセージを最前面に表示 |
vbMsgBoxRight | 524288 | メッセージを右寄せで表示 |
vbMsgBoxRtlReading | 1048576 | メッセージを右から左に表示(ヘブライ語、アラビア語) |
タイトルを変更(Title)

Title:=”testtitle”のように指定すると、タイトルの文字列を変更することができます。
ヘルプファイル(HelpFile,Context)
私の環境(64bit Windows10)だと再現できなかったんですが、調べた感じHelpFileにヘルプファイルのパス、Contextにページ番号を指定すれば、ヘルプを押した時にヘルプファイルのそのページが表示されるようです。Windows10だと拡張子hlpはサポート外なので、PC内に転がってたchmでテストしました。
HelpFileとContextはセットで設定しないとエラーになります。

具体的に言うとこんな感じでいくつか書いたんですが、動作せず。そのうち追記するかもです。
htmlやpdfでテストしてもうまく開きませんでした。
htmlやpdfでテストしてもうまく開きませんでした。
押したボタンによって処理を振り分ける

押したボタンによって何かしらの処理を走らせたい場合は、まず何か変数を宣言し、

MsgBoxの頭に変数 = という文を入れ、MsgBoxの引数を()で囲みます。
この場合answer = MsgBox(prompt:=”test”, Buttons:=vbYesNoCancel)という文になります。
この場合answer = MsgBox(prompt:=”test”, Buttons:=vbYesNoCancel)という文になります。

条件分岐をしたいので、If文かSelect Case文を作り、

押すボタンが「はい」であればvbYes、「いいえ」であればvbNo、という風に分岐を作ります。Integer型(整数)なのに文字で指定してますが、このvbYesやvbNoは実際には数値として処理され、文字の代わりに数値での指定も可能です(vbYesが6、vbNoが7)。

ボタンごとに行う処理を記述します。

この状態で実行すると、まずはいつものメッセージボックスが表示され、

いずれかのボタンを押すと、指定した処理がさらに実行されます。

定数を数字で指定する場合はこんな感じです。
' vba
Dim answer As Integer
answer = MsgBox(prompt:="test", Buttons:=vbYesNoCancel)
Select Case answer
' 「はい」を押した場合
Case vbYes
MsgBox "「はい」が押されました"
' 「いいえ」を押した場合
Case vbNo
MsgBox "「いいえ」が押されました"
' 「キャンセル」を押した場合
' ※Case Elseでも可
Case vbCancel
MsgBox "「キャンセル」が押されました"
End Select
定数 | 値 | 内容 |
---|---|---|
vbOK | 1 | 「OK」ボタン |
vbCancel | 2 | 「キャンセル」ボタン |
vbAbort | 3 | 「中止」ボタン |
vbRetry | 4 | 「再試行」ボタン |
vbIgnore | 5 | 「無視」ボタン |
vbYes | 6 | 「はい」ボタン | vbNo | 7 | 「いいえ」ボタン |

関数・演算子・メソッド・プロパティ名から探すExcel/VBA(マクロ)使い方・組み合わせ方まとめ
こちらはExcelやメソッドの諸機能を、機能の名称から探せるまとめ記事です。
コメント