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

お知らせ記事には広告が含まれておりますがExcelのスキルUPに繋がる様コンテンツ自体は手を抜かずに作成しております

MsgBox(メッセージボックス)とIF文を組み合わせて使う

Excelでデータを作成している際に間違えてワークシート右上の×ボタンをクリックしてしまった事はありませんか?

そんなときはこの様なダイアログボックス(ポップアップメッセージ)が出るはずです。

「ほんとにデータを消しても(作業を終了しても)良いですか?」という内容のメッセージボックスです。

表示されると「ドキ」っとしますよね。この様にメッセージボックスは作業者に気付きのポイントを与えることができます。

ExcelVBAではメッセージボックスを表示させることも出来ますが作る事もできます。MsgBox関数を使います。

メッセージボックスのメリットは作業者の気付きが増えるという事です。

EnjoyExcel
EnjoyExcel

本当に〇〇しても良いですか?」の様なダイアログボックスを表示させることができます。

作業時の気付きが増えるのでタイミング良く出してあげると作業の間違いを減らすことができますよ。

提案させてください

早速勉強していくのですがここで1つ提案です。せっかくなのでIF文も一緒に勉強していただきます

理由はメッセージボックスとの相性が良い為です。記事を読んでいただくと理由が分かります。

今回はメッセージボックスとIF文を一緒に勉強します。VBA-9の記事で勉強したボタンと連動する作業になります。

前回の記事

メソッドについて勉強しました。Excelファイルを使ってプロパティ、メソッドについて説明しています。

クリア、コピー&ペースト等を使ってコードの解説をしています。

今は完全に理解出来なくても良いです。自然に分かる様になってきますのでまずは勉強を進めましょう。

本記事での課題

今回の課題です。本記事と次の記事は非常に重要です。

EnjoyExcel
EnjoyExcel
課題

メッセージボックスと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

コードを実行すると何が起きるのか

実行ボタンを押した後に以下画像のようにメッセージボックスを出すことにします。

OKならOKの処理を行いキャンセルならキャンセルの処理を行うというコードを書いてみます。

エクスクラメーションマークなどのアイコンが表示されるとアプリケーションっぽくなりますよね。

同時にIF文について勉強できるのでこの仕様を採用してみました。それでは建付けを説明します。

解説

ではコードを解説していきます。キーとなる要素は2つです。

  1. メッセージボックス
  2. IF文(Ifステートメント)

2つの要素を中心に解説を進めていきます。

1_メッセージボックス

コードのフォーマット(構文)です。以下のように書きます。引数は5つで1つ目のPromptが必須です。

[ ] の中は省略可能です。しかしPromptをはじめButtonsとTitleは非常に使用頻度が高いです。

Titleまでの引数は必須だと思って使える様にしましょう。HelpFileとContentは最初は使わないという判断で良いです。

メッセージボックスの使い方
  • MsgBox  Prompt , [Buttons],[Title],[HelpFile],[Context]

Prompt

メッセージボックスに表示させる文字です。ユーザーに読んでもらう文字を記入します。

上の画像に置き換えると「実行しますか?」という文字になります。

Buttons

アイコンやボタンの仕様、ボタンの戻り値の設定をします。

アイコン(アラートマーク)

アイコン(アラートマーク)のリストです。必要に応じて使ってみてください。

番号定数使い時画像
1vbCritical16処理に問題がある時に使いましょう
2vbQuestion32問い合わせしたい時に使いましょう
3vbExclamation48警告したい時に使いましょう
4vbInformation64情報を伝える時に使いましょう
状況によってマークを付与してあげるとユーザー満足度向上につながります
ボタンの仕様

今回はコード内でVbOKCancelというコードを書いています。

このコードで「OKボタン」と「キャンセルボタン」を用意しています。

標準は無いです。複数仕様がありますのでご自身の環境にあったものを選んで使ってください。

番号定数内容
1vbOKOnly0「OK」ボタンのみ
2vbOKCancel1「OK」ボタンと「キャンセル」ボタン
3vbAbortRetryIgnore2「中止」ボタンと「再試行」ボタンと「無視」ボタン
4vbYesNoCancel3「はい」ボタンと「いいえ」ボタンと「キャンセル」ボタン
5vbYesNo4「はい」ボタンと「いいえ」ボタン
ボタンの種類を決めるためのコードです。
ボタンの戻り値

下のテーブルの様にボタン毎に戻り値が決まっています。文字列である定数を選択いただいてもOKです。

メッセージボックスのボタンは色々な種類があります。

命令+回答をフォーマット化しておくと迷わず使う事ができて良いです。

番号定数戻り値説明
1vbOK1OK
2vbCancel2キャンセル
3vbAbort3中止
4vbRetry4再試行
5vbIgnore5無視
6vbYes6はい
7vbNo7いいえ
ボタンの種類と戻り値の一覧です。戻り値は全て整数です。

今回のコードではボタンの仕様に対してvbOKCancelを使っています。

よって演算後の戻り値は「vbOK」であれば「1」、代わって「vbCancel」であれば「2」という事になります。

Title

メッセージボックスのタイトルです。入力した文字列がメッセージボックスのタイトルになります。

以下画像にあるメッセージボックスの左上に「テスト」という文字が表示されていますね。これがタイトルです。

メッセージボックスのタイトルの場所を指示

HelpFileContext は最初は覚えなくても良いです。興味ある方は調べてみてください。

今回のコードの仕様について-1

今回はOKとCancelを表示させたかったのでボタンの仕様は「vbOKCancel」にしています。 

+vbExclamationで「注意してください」というイメージの警告メッセージを出しています。

上の画像に置き換えると「△の中に!マークがある表示」ですね。エクスクラメーションマークです。

2_IF文

次にIF文です。ワークシート関数でもお馴染みの機能です。いわゆる分岐処理です。

IF文もプログラムの中でフォーマット化されているので形が決まっています。

If  条件 Then
 '条件がTrueだった時の処理
Else
 '条件がFalseだった時の処理
End If

これに当てはめれば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文はマクロの記録では再現出来ないコードになります。

これが書けるだけで普通の方が出来ない事が出来るという事になります。

本日勉強したこと
  1. メッセージボックスの使い方
  2. IF文の建付け
  3. MsgBoxとIF文は相性が良い
対話型のデータが出来た

Enjoy Excel

では次はループ処理です。これもマクロの記録では書けないコードです。

みんなで勉強してスキルアップしましょう。

参考:関連記事

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

マクロ勉強の道筋マクロは何から勉強するのか|学習をサポートするためのロードマップを作成

タイトルとURLをコピーしました