エクセルVBAにはメッセージボックスを表示できる機能があります。
しかしVBAで用意されているメッセージボックスは、文字サイズの変更やボタンの文言の変更が出来ないなど、多少の不満点があります。
今回はその不満点を補ったメッセージボックスを作成してみます。
そもそもメッセージボックスとは
マクロの実行中にユーザーに対してメッセージを表示するための機能です。
主な用途としては
・処理の実行前に「実行してよろしいですか?」のようにユーザーの意思を確認する
・間違った入力を検知した時などにエラーの内容を表示する
・処理が終了したことをユーザーに知らせる
などの用途があります。
VBEの記述
表示される内容
見ての通り文字が小さく、ボタンの文言「はい」「いいえ」も自由に変更することが出来ません。
完成イメージ
・完成のイメージとしては、実際のメッセージボックスと似た使用感で文字サイズとボタンの文言が変更できるように作ってみます。
・実際のメッセージボックス同様、ボタンのプリセット(vbOKOnly、vbYesNoのような使い方)も出来るようにしてみます。
モジュールの作成
まずは必要なモジュールを作成します。
・Form_MsgBox:自作MsgBoxのUIを設定するユーザーフォーム
ユーザーフォームにはラベルを1つ、コマンドボタンを3つ設置しておきましょう。
ラベルの横幅は出来るだけ広げて設置しておきます。(理由は後述します。)
それぞれオブジェクト名を変更しておきます。
label1 → lbl_Prompt
CommandButton1 → Button1
CommandButton2 → Button2
CommandButton3 → Button3
MsgBox関数の作成
今回の肝であるMsgBox関数をフォームモジュールに記述します。
関数と引数名はこんな感じ
Function MsgBoxShow( _
ByVal Prompt As String, _
Optional ByVal Button_Option As Long, _
Optional ByVal Button1_Caption As String, _
Optional ByVal Button2_Caption As String, _
Optional ByVal Button3_Caption As String, _
Optional ByVal Title As String, _
Optional ByVal Prompt_FontSize As Long = 11, _
Optional ByVal Button_FontSize As Long = 11) As Long
Prompt以外はOptionalを設定しています。
Ootionalを設定しておくと関数を呼び出すときに引数を省略できるようになります。
実際のMsgBoxもそうなっていますよね。
引数が省略された時の既定値の設定も出来るので、フォントサイズの既定値を11に設定しています。
既定値を設定しない場合は変数の型に応じた初期値になります。
ボタンのプリセットを設定する
引数のButton_Optionはボタンプリセットを使用するための引数です。(MsgBox関数のvbYesNoなどの指定方法を真似します。)
ボタンのプリセットを設定するにはEnumを定義しておくと便利です。
Public Enum e_MB_ButtonOption
mbOKOnly = 0
mbOKCancel
mbAbortRetryIgnore
mbYesNoCancel
mbYesNo
mbRetryCancel
End Enum
関数内ではSelect Caseを使ってボタンのプリセットを登録します。
(Button1~3_Captionのいずれかが指定されていた場合はそちらを優先します。)
If Button1_Caption = "" And Button2_Caption = "" And Button3_Caption = "" Then
Select Case Button_Option
Case mbOKOnly
Button1_Caption = "OK"
Button2_Caption = ""
Button3_Caption = ""
Case mbOKCancel
Button1_Caption = "OK"
Button2_Caption = "キャンセル"
Button3_Caption = ""
Case mbAbortRetryIgnore
Button1_Caption = "中止"
Button2_Caption = "再試行"
Button3_Caption = "無視"
Case mbYesNoCancel
Button1_Caption = "はい"
Button2_Caption = "いいえ"
Button3_Caption = "キャンセル"
Case mbYesNo
Button1_Caption = "はい"
Button2_Caption = "いいえ"
Button3_Caption = ""
Case mbRetryCancel
Button1_Caption = "再試行"
Button2_Caption = "キャンセル"
Button3_Caption = ""
End Select
End If
※上記は実際のMsgBoxのボタンのプリセットを真似していますが、自由に設定して頂いて構いません。
例えば
Public Enum e_MB_ButtonOption
mbOKOnly = 0
mbOKCancel
mbAbortRetryIgnore
mbYesNoCancel
mbYesNo
mbRetryCancel
mbOneTwoThree '←これを追加して
End Enum
If Button1_Caption = "" And Button2_Caption = "" And Button3_Caption = "" Then
Select Case Button_Option
Case mbOKOnly
Button1_Caption = "OK"
Button2_Caption = ""
Button3_Caption = ""
Case mbOKCancel
Button1_Caption = "OK"
Button2_Caption = "キャンセル"
Button3_Caption = ""
Case mbAbortRetryIgnore
Button1_Caption = "中止"
Button2_Caption = "再試行"
Button3_Caption = "無視"
Case mbYesNoCancel
Button1_Caption = "はい"
Button2_Caption = "いいえ"
Button3_Caption = "キャンセル"
Case mbYesNo
Button1_Caption = "はい"
Button2_Caption = "いいえ"
Button3_Caption = ""
Case mbRetryCancel
Button1_Caption = "再試行"
Button2_Caption = "キャンセル"
Button3_Caption = ""
Case mbOneTwoTree '←これを追加する
Button1_Caption = "1"
Button2_Caption = "2"
Button3_Caption = "3"
End Select
End If
このようにすることで、ボタンプリセット「mbOneTwoThree」が使えるようになります。
表示できる所まで作ってみよう
Button_Optionの実装が出来たので、とりあえずメッセージボックスが表示できる所まで作ってみましょう。
先程Button_Optionを実装したコードの下に以下を記述します。
Me.Caption = Title
Me.lbl_Prompt.Caption = Prompt
Me.Button1.Caption = Button1_Caption
Me.Button2.Caption = Button2_Caption
Me.Button3.Caption = Button3_Caption
Me.lbl_Prompt.Font.Size = Prompt_FontSize
Me.Show
これで標準モジュールからMsgBoxShow関数を呼び出してみます。
Form_MsgBox.MsgBoxShow "マクロを実行しますか?", mbYesNo
表示は上手くいきました。
次回は引数Button_optionの候補を自動で表示できるようにしてみたいと思います。