excel

【Excel】エクセルのメッセージボックスを作成する方法(VBA・マクロ)

エクセルでメッセージボックスを表示する基本コード - MsgBox関数の書き方
当サイトでは記事内に広告を含みます

エクセルのVBAでは、処理の完了通知、入力内容の確認、エラーの案内などをメッセージボックスで表示できます。

マクロの実行中に利用者へ必要な情報を伝えられるため、業務用ブックの使いやすさを高める基本機能です。

この記事では、MsgBox関数を使ったメッセージボックスの作成方法から、ボタンの種類、戻り値を利用した分岐、実務で使いやすいVBAコードまで順に解説します。

メッセージボックスで押さえたい要点

・MsgBoxで短い通知を表示する

・vbYesNoで確認用のボタンを追加する

・戻り値をIf文で判定して処理を分岐する

まずは基本形を理解し、必要に応じて確認画面やエラー表示へ発展させましょう。

 

エクセルでメッセージボックスを表示する基本コード

それではまず、VBAでメッセージボックスを表示する基本コードについて解説していきます。

A B C
1 作業名 状態
2 月次集計 未実行
3 データ確認 未実行

この例では、1行目をヘッダーとし、2行目以降に処理対象のデータが並んでいるシートを想定します。

 

MsgBox関数の書き方

MsgBoxは、VBAで最も手軽に通知画面を表示できる関数です。

文字列を丸括弧なしで指定するだけでも、メッセージボックスを表示できます。

VBEを開き、標準モジュールに次のコードを入力しましょう。

エクセルでメッセージボックスを表示する基本コード - MsgBox関数の書き方
Sub 基本のメッセージ表示()

    MsgBox "マクロの処理が完了しました。"

End Sub

SubからEnd Subまでが、ひとつのマクロの範囲です。

MsgBoxの後ろに表示したい文章をダブルクォーテーションで囲むと、実行時に小さなダイアログが開きます。

このような通知は、データ転記、帳票作成、保存処理などが終わったことを利用者に知らせる場面で便利です。

通知文は長くしすぎず、何が完了したのかを一読で理解できる文章にするとよいでしょう。

 

改行を含むメッセージの作成

続いては、複数行で見やすく表示する方法を確認していきます。

メッセージ本文の中で改行したい位置には、vbCrLfを連結します。

エクセルでメッセージボックスを表示する基本コード - 改行を含むメッセージの作成
Sub 改行付きのメッセージ表示()

    MsgBox "集計処理が完了しました。" & vbCrLf & _
           "結果は集計シートで確認できます。"

End Sub

vbCrLfは、Windows環境で改行を表すVBAの定数です。

文章を途中で区切ると、横に長いメッセージになりにくく、内容を読み取りやすくなります。

処理結果と次に行う操作を別の行へ分けると、案内としての役割が明確になります。

表示例

集計処理が完了しました。

結果は集計シートで確認できます。

 

マクロを実行する手順

続いては、作成したMsgBoxを実際に実行する流れを確認していきます。

エクセルでAltキーとF11キーを押すと、Visual Basic Editorを開けます。

プロジェクトエクスプローラーから対象ブックを選び、挿入、標準モジュールの順にクリックしてください。

コードを貼り付けた後、カーソルをSubプロシージャ内に置き、F5キーを押すとマクロが実行されます。

メッセージボックスが表示されれば、基本設定は完了です。

マクロ有効ブックとして保存する場合は、ファイル形式をExcelマクロ有効ブックに指定しましょう。

【操作のポイント】最初は短い固定メッセージで動作確認を行い、表示できた後にセル参照や条件分岐を追加します。

 

VBAでタイトルとアイコンを設定する方法

続いては、タイトルやアイコンを設定して、表示内容を分かりやすくする方法を確認していきます。

項目 表示内容 用途
本文 集計が完了しました 処理結果の通知
タイトル 月次集計 画面の目的の明示
アイコン 情報アイコン 通知の性質の補助

本文だけを表示する方法でも十分ですが、タイトルとアイコンを追加すると、利用者が画面の意味を判断しやすくなります。

 

タイトルを付ける指定

MsgBoxには、本文、ボタンの種類、タイトルの順で引数を指定できます。

通知用のタイトルを付けるには、次のように記述します。

VBAでタイトルとアイコンを設定する方法 - タイトルを付ける指定
Sub タイトル付きメッセージ()

    MsgBox "集計処理が完了しました。", vbOKOnly, "月次集計"

End Sub

vbOKOnlyは、OKボタンだけを表示する指定です。

3番目の引数である月次集計が、ダイアログ上部のタイトルバーに表示されます。

処理名やブック内の機能名をタイトルに使うと、複数の通知が続くマクロでも区別しやすくなります。

タイトルは利用者に見せる文言なので、開発者向けの略称ではなく、業務上の意味が伝わる名称を選びましょう。

 

情報アイコンと警告アイコンの使い分け

続いては、メッセージの重要度をアイコンで伝える方法を確認していきます。

正常終了の通知にはvbInformation、注意を促す画面にはvbExclamation、停止すべきエラーにはvbCriticalを使用できます。

VBAでタイトルとアイコンを設定する方法 - 情報アイコンと警告アイコンの使い分け
Sub 情報アイコンの表示()

    MsgBox "データの更新が完了しました。", _
           vbOKOnly + vbInformation, "更新結果"

End Sub

vbOKOnlyとvbInformationは、プラス記号で組み合わせられます。

情報アイコンは青い丸の記号として表示されるため、通常の完了連絡に向いています。

警告アイコンを多用すると利用者が重要な警告を見落としやすくなるため、本当に注意が必要な場面に絞ることが大切です。

アイコンの主な使い分け

vbInformationは完了や案内

vbExclamationは入力漏れや確認事項

vbCriticalは処理を継続できないエラー

 

表示位置と既定ボタンの考え方

続いては、ボタンの初期選択を設定する考え方を確認していきます。

MsgBoxの表示位置は通常、WindowsとOfficeの制御に任せます。

VBAのMsgBoxでは画面上の座標を自由に指定する用途には向かないため、画面位置よりも文面とボタン構成を整えることが実用的です。

一方で、複数ボタンを表示するときは、既定ボタンを指定できます。

Sub 既定ボタンの設定()

    MsgBox "保存前に内容を確認しますか。", _
           vbYesNo + vbQuestion + vbDefaultButton2, "確認"

End Sub

vbDefaultButton2を指定すると、2番目のボタンに初期フォーカスが置かれます。

ただし、Enterキーで意図しない処理が進むことを避けるため、削除や上書きなどの重要操作では既定ボタンの設定を慎重に考えましょう。

【操作のポイント】タイトルは処理名、本文は結果、アイコンは重要度という役割に分けると、メッセージが整理されます。

 

確認メッセージとYes Noボタンによる処理分岐

続いては、確認メッセージの選択結果に応じてマクロを分岐させる方法を確認していきます。

A B C
1 商品名 在庫数
2 商品A 25
3 商品B 18

確認なしで処理を進めると、利用者が意図しない削除や保存を行うおそれがあります。

Yes Noボタンと戻り値を使えば、実行前に意思を確認できます。

 

戻り値を変数に入れる方法

それでは、選択されたボタンの結果を変数へ保存する方法について解説していきます。

MsgBoxを値として受け取る場合は、変数への代入を行います。

Sub 確認結果を受け取る()

    Dim answer As VbMsgBoxResult

    answer = MsgBox("集計を実行しますか。", _
                    vbYesNo + vbQuestion, "実行確認")

End Sub

VbMsgBoxResult型は、MsgBoxが返す結果を扱うための型です。

answerには、利用者がクリックしたボタンに対応する値が保存されます。

代表的な戻り値はvbYes、vbNo、vbOK、vbCancelです。

確認用のMsgBoxは、表示するだけでなく、戻り値を受け取って初めて処理の安全性を高められます。

 

Yesを選んだ場合だけ実行するコード

続いては、Yesをクリックしたときだけ処理を実行するIf文を確認していきます。

在庫管理.xlsm – Excel − □ ×
ファイル ホーム 挿入 ページ レイアウト 数式 データ 校閲 表示 開発
貼り付け
B
罫線
中央揃え
A1 fx 商品名
A B C
1 商品名 在庫数 状態
2 商品A 25 確認待ち
3 商品B 18
実行確認 ×
? 在庫一覧を更新しますか。
➤
「はい」を選ぶと更新処理へ進みます
Sub 在庫一覧を更新する()

    Dim answer As VbMsgBoxResult

    answer = MsgBox("在庫一覧を更新しますか。", _
                    vbYesNo + vbQuestion, "実行確認")

    If answer = vbYes Then
        Worksheets("在庫一覧").Range("C2").Value = "更新済み"
        MsgBox "更新が完了しました。", vbInformation, "更新結果"
    Else
        MsgBox "更新を中止しました。", vbInformation, "更新結果"
    End If

End Sub

If answer = vbYes Thenは、answerの内容がYesならばという条件です。

Yes以外を選んだ場合はElse側へ進むため、中止したことも利用者へ伝えられます。

処理を中止した場合にも短い通知を出すと、ボタンが反応しなかったという誤解を減らせます。

 

Cancelボタンを含める確認画面

続いては、決定を保留できるCancelボタンを含める方法を確認していきます。

削除や上書きのように影響が大きい処理では、Yes No Cancelを表示する設計も有効です。

Sub 削除前の最終確認()

    Dim answer As VbMsgBoxResult

    answer = MsgBox("選択した行を削除しますか。", _
                    vbYesNoCancel + vbExclamation, "削除確認")

    If answer = vbYes Then
        Selection.EntireRow.Delete
        MsgBox "行を削除しました。", vbInformation, "削除結果"
    ElseIf answer = vbNo Then
        MsgBox "削除せずに処理を終了します。", vbInformation, "削除結果"
    Else
        MsgBox "操作をキャンセルしました。", vbInformation, "削除結果"
    End If

End Sub

Cancelは、まだ判断できない利用者が安全に画面を閉じるための選択肢です。

選択範囲を削除するコードは誤操作の影響が大きいため、テスト用ブックで十分に確認してから使用してください。

【操作のポイント】データ更新や削除の前には、処理内容を具体的に書いた確認メッセージを表示します。

 

セルの値をメッセージボックスに表示する方法

続いては、セルに入力された値や計算結果をMsgBoxで表示する方法を確認していきます。

A B C
1 担当者 売上金額
2 田中 125000
3 佐藤 98000

固定文だけではなく、セルの内容を組み込むと、選択中の行や集計結果に応じた案内を作成できます。

 

Rangeで指定したセルの表示

それでは、特定のセルを指定して値を表示する方法について解説していきます。

Rangeプロパティでセル番地を指定し、Valueプロパティで値を取得します。

Sub 担当者を表示する()

    Dim staffName As String

    staffName = Range("B2").Value

    MsgBox "担当者は" & staffName & "です。", _
           vbInformation, "担当者確認"

End Sub

B2セルに田中と入力されていれば、担当者は田中ですというメッセージが表示されます。

数値、日付、文字列のいずれも取得できますが、表示形式まで整えたい場合はFormat関数を使うと便利です。

セル番地を固定するコードは分かりやすい一方で、行の追加や並べ替えがある表では参照先に注意が必要です。

 

選択中の行から情報を取得する方法

続いては、利用者が選択しているセルと同じ行の情報を表示する方法を確認していきます。

ActiveCell.Rowを使うと、現在選択中のセルの行番号を取得できます。

Sub 選択行の売上を表示する()

    Dim targetRow As Long
    Dim staffName As String
    Dim salesAmount As Double

    targetRow = ActiveCell.Row
    staffName = Cells(targetRow, 2).Value
    salesAmount = Cells(targetRow, 3).Value

    MsgBox staffName & "さんの売上は" & _
           Format(salesAmount, "#,##0") & "円です。", _
           vbInformation, "売上確認"

End Sub

Cells(targetRow, 2)は、選択行のB列を意味します。

Cells(targetRow, 3)は、同じ行のC列です。

Format関数の書式を指定することで、125000を125,000円のように読みやすく表示できます。

セル参照の考え方

Range(“B2”)は番地を直接指定する方法

Cells(行番号, 列番号)は行と列を変数で扱える方法

ActiveCell.Rowは選択されている行番号の取得

 

空白セルを確認してから表示する方法

続いては、入力漏れを確認してからメッセージを表示する方法を確認していきます。

セルが空白のまま処理を進めると、意図しない表示や計算エラーにつながることがあります。

Sub 入力内容を確認する()

    If Range("B2").Value = "" Then
        MsgBox "担当者名を入力してください。", _
               vbExclamation, "入力確認"
        Range("B2").Select
        Exit Sub
    End If

    MsgBox "入力内容を確認しました。", _
           vbInformation, "入力確認"

End Sub

Exit Subを入れると、警告後に以降の処理を実行せず、マクロを終了できます。

入力エラーを見つけたときは、該当セルを選択状態にすると、利用者が修正場所をすぐに把握できます。

【操作のポイント】セルの値を表示する前に、空白、数値、日付などの入力条件を確認するコードを用意します。

 

メッセージボックスのボタン種類と定数

続いては、VBAで指定できるボタンの種類と定数の基本を確認していきます。

指定する定数 表示ボタン 主な用途
vbOKOnly OK 完了通知
vbOKCancel OK、キャンセル 実行確認
vbYesNo はい、いいえ 選択確認
vbYesNoCancel はい、いいえ、キャンセル 重要な判断

定数を使うと、数値を直接記述するよりもコードの意味を読み取りやすくなります。

 

OKのみを表示する通知

それでは、OKボタンのみを使う通知について解説していきます。

処理結果を知らせるだけで、利用者の判断を必要としない場合にはvbOKOnlyが適しています。

Sub 保存完了を知らせる()

    MsgBox "ファイルを保存しました。", _
           vbOKOnly + vbInformation, "保存完了"

End Sub

保存完了、印刷完了、転記完了などの通知には、この形式が使いやすいでしょう。

利用者がOKを押すまでマクロは一時停止するため、連続処理の途中で使いすぎないことも重要です。

 

OKとキャンセルを使う場面

続いては、OK Cancelボタンが適する場面を確認していきます。

印刷、出力、保存のように、実行するか中止するかを確認したいときに利用します。

Sub 印刷前に確認する()

    Dim answer As VbMsgBoxResult

    answer = MsgBox("印刷を開始しますか。", _
                    vbOKCancel + vbQuestion, "印刷確認")

    If answer = vbOK Then
        ActiveSheet.PrintOut
    End If

End Sub

OKをクリックしたときだけPrintOutが実行され、キャンセルなら印刷は行われません。

ボタンの言葉と処理内容が自然につながるように、実行ならOK、選択ならはいという使い分けを意識しましょう。

 

定数を組み合わせる記述

続いては、ボタン、アイコン、既定ボタンを組み合わせる記述を確認していきます。

複数の定数はプラス記号で連結できます。

vbYesNo + vbQuestion + vbDefaultButton2

はい、いいえのボタンを表示し、質問アイコンを付け、2番目のいいえを初期選択にする指定です。

Sub 上書き保存を確認する()

    Dim answer As VbMsgBoxResult

    answer = MsgBox("既存ファイルを上書き保存しますか。", _
                    vbYesNo + vbExclamation + vbDefaultButton2, _
                    "上書き確認")

    If answer = vbYes Then
        ThisWorkbook.Save
        MsgBox "上書き保存しました。", vbInformation, "保存完了"
    End If

End Sub

上書き保存のように影響が残る操作では、初期状態をいいえにしておく考え方があります。

ただし、組織内の運用ルールや利用者の操作習慣も考慮して決めましょう。

【操作のポイント】通知、確認、警告の目的を先に決めてから、ボタンとアイコンの定数を選択します。

 

実務で使いやすいエラー表示と入力確認

続いては、実務用マクロで役立つ入力確認とエラー表示の作り方を確認していきます。

A B C
1 受注番号 金額
2 A001 50000
3 32000

メッセージボックスは、単なる完了通知だけでなく、入力漏れの防止や予期しないエラーの説明にも利用できます。

 

必須入力を確認するコード

それでは、1行目をヘッダーとしたデータ表で、2行目以降の必須項目を確認するコードについて解説していきます。

次の例では、A列の受注番号が空白でないかを最終行まで確認します。

Sub 受注番号を確認する()

    Dim lastRow As Long
    Dim rowNumber As Long

    lastRow = Cells(Rows.Count, 1).End(xlUp).Row

    For rowNumber = 2 To lastRow
        If Cells(rowNumber, 1).Value = "" Then
            MsgBox rowNumber & "行目の受注番号が未入力です。", _
                   vbExclamation, "入力エラー"
            Cells(rowNumber, 1).Select
            Exit Sub
        End If
    Next rowNumber

    MsgBox "必須項目を確認しました。", vbInformation, "確認完了"

End Sub

Cells(Rows.Count, 1).End(xlUp).Rowは、A列の最後に入力されている行番号を取得する書き方です。

For文では2行目から最終行まで順番に調べるため、ヘッダー行を判定対象から外せます。

エラー内容だけでなく、何行目のどの項目が問題なのかを示すと、修正作業が大幅に速くなります。

 

エラー処理で内容を伝える方法

続いては、想定外のエラーが起きたときに内容を表示する方法を確認していきます。

On Error GoToを使うと、エラー発生時に指定した場所へ処理を移せます。

Sub エラー内容を表示する()

    On Error GoTo ErrorHandler

    Worksheets("集計").Range("B2").Value = _
        Worksheets("元データ").Range("B2").Value

    MsgBox "データを転記しました。", vbInformation, "転記完了"
    Exit Sub

ErrorHandler:

    MsgBox "処理中にエラーが発生しました。" & vbCrLf & _
           "内容を確認してから再実行してください。", _
           vbCritical, "処理エラー"

End Sub

存在しないシート名を指定した場合などに、VBAのエラー画面をそのまま利用者に見せず、分かりやすい案内へ切り替えられます。

ただし、開発中は原因調査のためにErr.NumberやErr.Descriptionを記録する設計も必要です。

 

メッセージ文を分かりやすくする工夫

続いては、利用者に伝わるメッセージ文の作り方を確認していきます。

よいメッセージには、起きたこと、利用者が行うこと、必要なら対象となる場所が含まれます。

分かりにくい表示

エラーです。

分かりやすい表示

3行目の受注番号が未入力です。A3セルに受注番号を入力してから再実行してください。

利用者にVBAの専門知識を求めず、次に取る操作を具体的に案内することが実務用マクロでは重要です。

また、パスワード、顧客情報、システム内部の詳細など、表示する必要がない情報はメッセージ本文へ含めないようにします。

エラーが発生したら、対象セルの選択、入力欄の色変更、ログへの記録などを組み合わせると、さらに使いやすくなります。

【操作のポイント】エラー表示は原因の断定よりも、利用者が自分で修正できる具体的な案内を優先します。

 

まとめ エクセルのメッセージボックスを作成する方法

エクセルのVBAでメッセージボックスを作成するには、MsgBox関数を使います。

最も基本的な形は、MsgBoxの後ろに表示したい文字列を記述する方法です。

完了通知にはOKボタン、処理前の確認にはYes Noボタン、入力漏れには警告アイコンというように、目的に合わせて構成を選びましょう。

タイトル、アイコン、既定ボタンを指定すると、短い画面でも意図が伝わりやすくなります。

Yes NoやOK Cancelを使う場合は、戻り値を変数へ入れ、If文で処理を分岐させることがポイントです。

セルの値をMsgBoxへ組み込めば、担当者名、金額、行番号などを反映した案内も作成できます。

また、1行目がヘッダーのデータ表では、2行目から最終行までの入力確認を行うと、入力漏れを防ぎやすくなります。

重要な更新や削除の前には確認画面を表示し、エラー時には修正場所と次の操作を分かりやすく案内しましょう。

メッセージボックスを適切に使うことで、VBAマクロは単に処理を自動化するだけでなく、利用者が安心して操作できる仕組みになります。