ExcelVBA(マクロ)でメッセージウィンドウを表示し、押したボタンで処理を分岐する方法/MsgBox関数の使い方

IT

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

スポンサーリンク

成果物

vbyesno
選択肢やアイコンを変更したメッセージボックスを表示し、押したボタンによって処理を振り分けます。

MsgBox関数の使い方

メッセージボックスを表示
Msgbox(Prompt,Buttons,Title,Helpfile,Context)
※Prompt以外は省略可能

メッセージの表示(Prompt)

msgbox1
メッセージを表示するだけであれば、特別難しいことはありません。
MsgBox”hello”と打ったコードを実行すれば、
msgbox2
“”の中の文章がメッセージボックスに表示されます。
MsgBox (“hello”)でもOKです。
msgbox3
“”で区切った文章の間に関数や取得した変数を挿入することも可能です。
msgbox4
Now関数を挟むことで、現在時刻を表示しています。
msgbox5
改行する場合は、Chr(10)を挟みます。
msgbox6
実行結果です。他にChr(13)、VBLf、vbCrのいずれかを挟んでも改行可能です。

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

msgbox7
このメッセージボックスに表示するメッセージは、フィールド名で言うとpromptになります。

ボタン、アイコンの種類などを変更(Buttons)

ボタンを変更

msgbox8
Buttonsに指定の値を入力すると、ボタンの種類やアイコン表示を変更することができます。
たとえばMsgBox prompt:=”test”, Buttons:=vbOKCancelとしてやれば、
msgbox9
このように「OK」と「キャンセル」のどちらかを押せるメッセージボックスを表示できます。
vbOKCancelの代わりにButtons:=1としても同じ結果になります。
msgbox10
Buttons:=vbAbortRetryIgnoreまたはButtons:=2だとこう。
押したボタンによって処理を振り分ける方法については後述します。
定数 内容
vbOKOnly 0 OKボタンを表示
vbOKCancel 1 OK、キャンセルボタンを表示
vbAbortRetryIgnore 2 中止、再試行、無視ボタンを表示
vbYesNoCancel 3 はい、いいえ、キャンセルボタンを表示
vbYesNo 4 はい、いいえボタンを表示
vbRetryCancel 5 再試行、キャンセルボタンを表示

アイコンを変更

msgbox11
Buttonsではボタンの選択肢の他にもいろいろできることがあり、たとえばアイコンを変更することができます。
MsgBox prompt:=”test”, Buttons:=vbCriticalと入力して実行すると、このように警告アイコンが表示されます。
vbCriticalの代わりにButtons:=16と入力しても同様の結果になります。
msgbox12
vbQuestionまたは32だと問い合わせアイコン、
msgbox13
vbExclamationまたは48で注意アイコン、
msgbox15
vbInformationまたは64で情報アイコンが表示されます。
定数 内容
vbCritical 16 警告アイコンを表示
vbQuestion 32 問い合わせアイコンを表示
vbExclamation 48 注意アイコンを表示
vbInformation 64 情報アイコンを表示

ボタンもアイコンも変更

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

標準ボタンを変更

msgbox17
標準ボタンというのは、メッセージボックスで最初から青くなっている選択肢、Enterを押すと選択されるボタンのことです。
通常であれば一番左のボタンが選択されていますが、この規定の状態はButtons:=vbDefaultButton1(数字で言うと0)に当たります。
msgbox18
vbDefaultButton2(数字で言うと256)にすれば2番目、
msgbox19
vbDefaultButton3(数字で言うと512)にすれば3番目のボタンが標準ボタン、vbDefaultButton4(数字で言うと768)で4番目のボタンが標準ボタンになります。
msgbox22
4番目のボタンは後述するヘルプボタンを追加すると表示可能です。

もしボタンが2種類しかないのに3番目や4番目のボタンを標準ボタンに指定した場合、1番目のボタンが標準ボタンになります。

定数 内容
vbDefaultButton1 0 1番目のボタンを標準ボタンに設定
vbDefaultButton2 256 2番目のボタンを標準ボタンに設定
vbDefaultButton3 512 3番目のボタンを標準ボタンに設定
vbDefaultButton4 768 4番目のボタンを標準ボタンに設定

モーダルを変更

msgbox20
Buttonsに何も指定しないかvbApplicationModal(数字で言うと0)の場合、メッセージが表示されている間はExcelが操作できなくなります。
Excel以外のアプリケーションは操作可能です(アプリケーションモーダル)。
msgbox21
Buttons:=vbSystemModal(数字で言うと4096)の場合、PCのシステムに干渉し、メッセージに返答しない限り他のアプリも操作できなくなります(システムモーダル)。
定数 内容
vbApplicationModal 0 アプリケーションモーダル
vbSystemModal 4096 システムモーダル

ヘルプボタンの表示

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

その他

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

タイトルを変更(Title)

msgbox27
Title:=”testtitle”のように指定すると、タイトルの文字列を変更することができます。

ヘルプファイル(HelpFile,Context)

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

msgbox31
具体的に言うとこんな感じでいくつか書いたんですが、動作せず。そのうち追記するかもです。
htmlやpdfでテストしてもうまく開きませんでした。

押したボタンによって処理を振り分ける

msgbox32
押したボタンによって何かしらの処理を走らせたい場合は、まず何か変数を宣言し、
msgbox33
MsgBoxの頭に変数 = という文を入れ、MsgBoxの引数を()で囲みます。
この場合answer = MsgBox(prompt:=”test”, Buttons:=vbYesNoCancel)という文になります。
msgbox34
条件分岐をしたいので、If文Select Case文を作り、
msgbox35
押すボタンが「はい」であればvbYes、「いいえ」であればvbNo、という風に分岐を作ります。Integer型(整数)なのに文字で指定してますが、このvbYesやvbNoは実際には数値として処理され、文字の代わりに数値での指定も可能です(vbYesが6、vbNoが7)。
msgbox36
ボタンごとに行う処理を記述します。
msgbox37
この状態で実行すると、まずはいつものメッセージボックスが表示され、
msgbox38
いずれかのボタンを押すと、指定した処理がさらに実行されます。
msgbox39
定数を数字で指定する場合はこんな感じです。
' 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やメソッドの諸機能を、機能の名称から探せるまとめ記事です。

コメント