VBA-11マクロ内でMsgBoxとIfステートメントを組み合わせる

MsgBox(メッセージボックス)とIf文を組み合わせて使う
Excelでデータを作成している際に間違えてワークシート右上の×ボタンをクリックしてしまった事はありませんか?
そんなときはこの様なダイアログボックス(ポップアップメッセージ)が出るはずです。
ほんとにデータを消しても(作業を終了しても)良いですか?という内容のメッセージボックスです。
表示されると「ドキ」っとしますよね。メッセージボックスは作業者に気付きのポイントを与えることができます。
ExcelVBAではメッセージボックスを表示させることも出来ますが作る事もできます。MsgBox関数を使います。
メッセージボックスのメリットは作業者の気付きが増えるという事です。

「本当に〇〇しても良いですか?」
という様なダイアログボックスを表示させることができます。
メリットとしては作業時の気付きが増えます。
タイミング良く出せば作業の間違いを減らすことができますよ。
早速勉強していくのですがここで1つ提案です。せっかくなのでIf文も一緒に勉強していただきます。
メッセージボックスとの相性が良いというのが最大の理由です。以降で紹介するコードを見ると理由が分かります。
前回の記事
メソッドについて勉強しました。Excelファイルを使ってプロパティ、メソッドについて説明しています。
クリア、コピー&ペースト等を使ってコードの解説をしています。


今は完全に理解出来なくても良いです。自然に分かる様になってきますのでまずは勉強を進めましょう。
本記事での課題
今回の課題です。本記事と次の記事は非常に重要です。



課題:
メッセージボックスとIf文を使ってみよう
メッセージボックスとIf文について
Microsoft のドキュメントへのリンクを用意しておきます。これでそれぞの機能はおおよそ理解できます。
Microsoft のドキュメントは分かりにくいという方はこのまま以降の記事をご覧ください。(別途解説しています)
VBAのIf文はワークシート関数のIfとほぼ同じ機能です。よって馴染みのある方も多いです。
呼び方としては「Ifステートメント」と呼ばれる事もあります。少し長いので以降はIf文と書いていきます。
事例:コードを紹介
まずはコードを紹介します。コード右上のアイコンを押していただくとコードをコピーする事ができます。
Option Explicit '任意で表示させてください
Sub メッセージボックスとIf文()
'変数を定義(分かりやすくする為に日本語で書きます)
Dim 回答 As Long
'回答という変数にOKかNGの値を代入する。OKだと1、NGだと2が返ってくる。
回答 = MsgBox("実行しますか?", vbOKCancel + vbExclamation, "実行確認")
'もし変数「回答」が1だったら・・・
If 回答 = 1 Then
'指定のセルに OKですよ と表示
Range("A1").Value = "OKですよ"
'回答が1ではなかったら・・・
Else
'指定のセルに Cancelですよ と表示
Range("A1").Value = "Cancelですよ"
End If
End Sub
VBコードを実行すると何が起きるのか
実行ボタンを押した後に以下画像のようにメッセージボックスを出すことにします。
OKならOKの処理を行いキャンセルならキャンセルの処理を行うというコードを書いてみます。


エクスクラメーションマークなどのアイコンが表示されるとアプリケーションっぽくなりますよね。
同時にIf文について勉強できるのでこの仕様を採用してみました。それでは建付けを説明します。
解説
ではコードを解説していきます。キーとなる要素は2つです。
- メッセージボックス
- If文(Ifステートメント)
2つの要素を中心に解説を進めていきます。
1_メッセージボックス
コードのフォーマット(構文)です。以下のように書きます。引数は5つで1つ目のPromptが必須です。
[ ] の中は省略可能です。しかしPromptをはじめButtonsとTitleは非常に使用頻度が高いです。
Titleまでの引数は必須だと思って使える様にしましょう。HelpFileとContentは最初は使わないという判断で良いです。
MsgBox Prompt , [Buttons],[Title],[HelpFile],[Context]
Prompt
メッセージボックスに表示させる文字です。ユーザーに読んでもらう文字を記入します。
上の画像に置き換えると「実行しますか?」という文字になります。
Buttons
アイコンやボタンの仕様、ボタンの戻り値の設定をします。
アイコン(アラートマーク)
アイコン(アラートマーク)のリストです。必要に応じて使ってみてください。
番号 | 定数 | 値 | 使い時 | 画像 |
---|---|---|---|---|
1 | vbCritical | 16 | 処理に問題がある時に使いましょう | ![]() ![]() |
2 | vbQuestion | 32 | 問い合わせしたい時に使いましょう | ![]() ![]() |
3 | vbExclamation | 48 | 警告したい時に使いましょう | ![]() ![]() |
4 | vbInformation | 64 | 情報を伝える時に使いましょう | ![]() ![]() |
ボタンの仕様
今回はコード内でVbOKCancelというコードを書いています。
このコードで「OKボタン」と「キャンセルボタン」を用意しています。
標準は無いです。複数仕様がありますのでご自身の環境にあったものを選んで使ってください。
番号 | 定数 | 値 | 内容 |
---|---|---|---|
1 | vbOKOnly | 0 | 「OK」ボタンのみ |
2 | vbOKCancel | 1 | 「OK」ボタンと「キャンセル」ボタン |
3 | vbAbortRetryIgnore | 2 | 「中止」ボタンと「再試行」ボタンと「無視」ボタン |
4 | vbYesNoCancel | 3 | 「はい」ボタンと「いいえ」ボタンと「キャンセル」ボタン |
5 | vbYesNo | 4 | 「はい」ボタンと「いいえ」ボタン |
ボタンの戻り値
下のテーブルの様にボタン毎に戻り値が決まっています。文字列である定数を選択いただいてもOKです。
メッセージボックスのボタンは色々な種類があります。
命令+回答をフォーマット化しておくと迷わず使う事ができて良いです。
番号 | 定数 | 戻り値 | 説明 |
---|---|---|---|
1 | vbOK | 1 | OK |
2 | vbCancel | 2 | キャンセル |
3 | vbAbort | 3 | 中止 |
4 | vbRetry | 4 | 再試行 |
5 | vbIgnore | 5 | 無視 |
6 | vbYes | 6 | はい |
7 | vbNo | 7 | いいえ |
今回のコードではボタンの仕様に対してvbOKCancelを使っています。
よって演算後の戻り値は「vbOK」であれば「1」、代わって「vbCancel」であれば「2」という事になります。
Title
メッセージボックスのタイトルです。入力した文字列がメッセージボックスのタイトルになります。
以下画像にあるメッセージボックスの左上に「テスト」という文字が表示されていますね。これがタイトルです。


HelpFile と Context は最初は覚えなくても良いです。興味ある方は調べてみてください。
今回のコードの仕様について-1
今回はOKとCancelを表示させたかったのでボタンの仕様は「vbOKCancel」にしています。
+vbExclamationで「注意してください」というイメージの警告メッセージを出しています。
上の画像に置き換えると「△の中に!マークがある表示」ですね。エクスクラメーションマークです。
2_If文
次にIf文です。ワークシート関数でもお馴染みの機能です。いわゆる分岐処理です。
If文もプログラムの中でフォーマット化されているので形が決まっています。
If 条件 Then
'条件がTrueだった時の処理
Else
'条件がFalseだった時の処理
End If
VBこれに当てはめればOK。コードを都度考えなくても良いです。簡単ですよね。
ワークシート関数でIf文を書いている人達はイメージしやすい仕様になっています。
コードを用意する際に変更が入るのは以下3つです。
- 条件(演算子を用いた演算など)
- 条件がTrueだった時の処理(条件を判定したあとの処理)
- 条件がFalseだった時の処理(条件を判定したあとの処理)
VBAの方がワークシート関数より見易い
ワークシートでは条件分岐の関数を横に書いてますがVBAでは条件分岐のコードを縦に書きます。
VBAの方が改行もされて整理した状態でIf文を見ることが出来ますよね。
あくまで私見ですがむしろVBAの方が見易い気がしませんか。
If(条件,Trueの時,Falseの時)という関数を縦に見易く並べているという感じを持っています。
今回のコードの仕様について-2
メッセージボックスでOKボタンが押されると演算が行われ変数「回答」に1が代入されます。
その後セルA1に「OKですよ」と表示されます。
メッセージボックスでキャンセルボタンが押されて変数「回答」に2が代入された時はどうでしょうか。
答えはセルA1に「Cancelですよ」と表示されるというコードになっています。
応用編
Ifステートメントの中にIfステートメントを用意する事もできます。トータルで用意できる選択肢が増えます。
ExcelVBA【Ifのネスト&For】マクロ内で分岐とループを組み合わせる-4
MsgBox関数には「保存」ボタンが無いです。うまくアレンジして「保存」ボタンの仕様を再現しています。
VBA|MsgBoxの「保存」ボタンを使わずにデータをSaveする
メッセージボックスとIfステートメントは色々な作業に使います。
VBAを使ってPDFを出力するという作業の中でも使ってみました。
VBA×PDF|ワークブック内の全てのデータを1つのファイルで保存
まとめ
メッセージボックスの作り方と使い方をIf文を交えて勉強していただきました。
If文についてはワークシート関数の様にIf文を重ねて書いたりすることも可能です。
If文が理解出来るとコードの幅が広がりやれることや表現の方法が増えます。
少し難しいですが以下記事を読んでいただくと条件分岐と繰り返し処理をマスター出来ます。
【エラーにならない】 VBA条件分岐完全ガイドコードのテンプレを紹介
なによりIf文はマクロの記録では再現出来ないコードになります。
これが書けるだけで普通の方が出来ない事が出来るという事になります。
では次はループ処理です。これもマクロの記録では書けないコードです。
みんなで勉強してスキルアップしましょう。


参考:関連記事
本シリーズはこちらの記事とも連携しています。