Mutable_Yunの業務改善ブログ

業務改善や生産性向上のブログです。自動化の手段として、VBAやRPAの勉強に役立つ解説をしています。

VBA 中級者から上級者へ② メッセージボックスを使いこなす

VBAで中級から上級へのステップアップの2回目です。今回は、他人に使ってもらうツールで頻繁に利用されるメッセージボックスで使い勝手を向上させ、メッセージボックス周りのエラーを撲滅していきます。

この記事は中級です。
レベルについてはExcel VBAの実力(レベル)を定義してみる 初心者~三段をご参照ください。

目次

MsgBoxは関数

この記事の対象読者であれば、一度は必ず使って事のあるメッセージボックス。入門でもおなじみのメッセージボックスについて考えていきます。簡単だけど、きちんと使いこなせば使い勝手の向上につながります。

このMsgBoxは関数であると言うことは知っていますか?単にメッセージを出すだけなら関数である事を意識する必要は無いのですが、使い勝手がよいツールにしたり、エラーを防ぐためには戻り値を使う事が必須となります。きちんとマスターしていきましょう。

MsgBox関数に戻り値がある事を確認する

MsgBoxは関数ですが、初めてのVBAの時には戻り値を使っていませんでした。

Sub 一番初めに習ったときのコード()
    
    MsgBox "こんにちは!"
    
End Sub

関数と言う事は、本来ならカッコで囲むハズですよね。囲んでみます。

Sub 一番初めに習ったときのコード2()
    
    MsgBox ("こんにちは!")
    
End Sub

カッコをつけても同様にメッセージボックスが表示された
カッコをつけても同様にメッセージボックスが表示された

関数なので戻り値があるはずです。それを表示してみます。

Sub 一番初めに習ったときのコード2()
    
    Dim num As Long
    
    num = MsgBox("こんにちは!")
    
    Debug.Print num
    
End Sub

イミディエイトウィンドウを開いた状態で実行してみて下さい。
OKを押すと、1が表示されます。右上の×を押しても1が表示されます。

OKを押しても×を押しても1が返る
実行結果

MsgBox関数は単に表示させるメッセージのみを引数に取ったとき、ユーザーによるメッセージボックスの閉じ方にかかわらず、1が返ることが分かりました。つまり、OKを押しても×を押してもどちらでもいいときに使う場合は、戻り値を取得する必要が無いことになります。

例えば、マクロの実行の最後の部分で「作業が完了しました」と言ったメッセージを出すときなどですね。

適切な引数を設定して使い勝手を向上する

ここで、MsgBox関数の引数を調べます。調べると言えば、インターネットで検索をする事が真っ先に思い浮かぶかもしれませんが、中級から上級へのステップの中で、VBE(エディタ)に記載されている情報を確認できるようにしておきましょう。

表示⇒オブジェクトブラウザを押します。そして検索ボックスの中に、msgboxと入力してエンターを押しましょう。

オブジェクトブラウザでMsgBox関数を調べたところ
オブジェクトブラウザでMsgBox関数を調べる


MsgBoxをクリックすると一番下にMsgBox関数の説明が表示されます。

一番下に表示された、MsgBox関数の説明
一番下に表示された、MsgBox関数の説明
この説明を正しく理解するにはクラスの概念が本当は必要です。しかし、クラスの概念が出てくるのは二段なので今は、「Functionとかいてあるから関数なはずで、何らかの値を返すんだな」くらいの理解で問題ありません。

Promptはメッセージボックスに表示させるメッセージそのもののことです。[中カッコ]で囲まれた部分は省略できると言う意味です。これまでは後ろの4つの引数は全て省略していました。ここに引数を設定していきましょう。

先ほどの「こんにちは!」と表示させるコードを改造していきます。コピペはダメですよ。書きましょう。まずは2つめの引数を記述します。

Sub メッセージボックスの練習()
    
    Dim num As Long
    
    num = MsgBox("こんにちは!", vbYesNo)
    
    Debug.Print num
    
End Sub

カンマを記述すると、入力補助がでます。上下でvbYesNoを選択してTabを押します。Enterを押すと開業されてしまうので注意しましょう。

入力補助が出るので便利
入力補助が出るので便利

引数の名前から想像できるかもしれませんが、これはボタンを表しています。先ほどオブジェクトブラウザでMsgBox関数を調べたときに、第2引数に[Buttons As vbMsgBoxStyle = vbOKOnly]と書いてありました。これは、第二引数が省略されたときは「OK」のボタンだけ表示させますよ、と言う事だったんですね。

実行してみます。


「はい」を押して閉じるとイミディエイトウィンドウに6が表示されました。もう一度実行してみましょう。今度は「いいえ」を押してみます。今度はイミディエイトウィンドウに7が表示されました。

このように戻り値の値が異なります。vbOKCancelなど、いろいろと試してみましょう。実はvbYesNoなどは数値としての値を持っていて、足し算をする事ができます。次のコードをを試してみましょう。

Sub メッセージボックスの練習()
    
    Dim num As Long
    
    num = MsgBox("こんにちは!", vbYesNo + vbDefaultButton2)
    
    Debug.Print num
    
End Sub

実行してみます。よ~く目を凝らして見て下さい。今度は「いいえ」のボタンに影がついています。先ほどは「はい」のボタンに影がついていました。

vbDefaultButton2でいいえをデフォルトにする
vbDefaultButton2でいいえをデフォルトにする

これはどういうことかというと、デフォルトで「いいえ」が選択されていると言う事です。マウスの操作では無く、Enterを押したときに押されるボタンと言う事ですね。

これらの引数を使い、戻り値を使って条件分岐すれば次のようなことができます。

Sub メッセージボックスの練習()
    
    Dim num As Long
    
    num = MsgBox("選択したファイルが最新ではありません。" & vbCrLf & "作業を実行しますか?", vbYesNo + vbDefaultButton2 + vbExclamation)
    
    If num = 6 Then
        '継続するときの処理を呼び出す
    Else
        MsgBox "キャンセルしました。"
    End If
    
End Sub

引数を使った応用
引数を使った応用

イメージとしてはユーザーが誤ったファイルを選択し、それを検知した際に表示されるメッセージです。vbExclamationでびっくりマークを表示して警告を促しつつ、デフォルトで「いいえ」が選択されているので、Enterを押すと処理が中断される、と言う内容です。

ユーザーフレンドリーですね。中級から上級へのステップアップに必要なのは経験と思いやりでした。これは、最新でないファイルで作業を続行し、思いも寄らない結果が出ることを防いでいます。思いやりですね。

もう一つ引数について触れます。メッセージボックスの左上の「Microsoft Excel」の文字が変更できます。先ほどのコードをさらに変更します。

Sub メッセージボックスの練習()
    
    Dim num As Long
    
    num = MsgBox("選択したファイルが最新ではありません。" & vbCrLf & "作業を実行しますか?", vbYesNo + vbDefaultButton2 + vbExclamation, "要確認!")
    
    If num = 6 Then
        '継続するときの処理を呼び出す
    Else
        MsgBox "キャンセルしました。"
    End If
    
End Sub

ユーザーフレンドリーなメッセージボックス
ユーザーフレンドリーなメッセージボックス

いい感じですね。とても分かりやすくなりました。

3つめのHelpFileとContextは普通のユーザーには関係ない引数なので無視してOKです。

これで、「ファイルを選択して下さい」でキャンセルや「×」を押したときの処理も記述できますね!「OK」が押されなかった時の処理をIf文で導いてあげればOKです。

それでは、メッセージボックスでいろいろな引数を試して、エラーを防ぎつつユーザーフレンドリーなツールに仕上げていきましょう。