自作メッセージボックスの作成 その1(エクセルVBA)

記事
IT・テクノロジー
エクセルVBAにはメッセージボックスを表示できる機能があります。
しかしVBAで用意されているメッセージボックスは、文字サイズの変更やボタンの文言の変更が出来ないなど、多少の不満点があります。
今回はその不満点を補ったメッセージボックスを作成してみます。

そもそもメッセージボックスとは


マクロの実行中にユーザーに対してメッセージを表示するための機能です。
主な用途としては

・処理の実行前に「実行してよろしいですか?」のようにユーザーの意思を確認する

・間違った入力を検知した時などにエラーの内容を表示する

・処理が終了したことをユーザーに知らせる

などの用途があります。


 VBEの記述
キャプチャ1.JPG

 表示される内容
キャプチャ2.JPG

見ての通り文字が小さく、ボタンの文言「はい」「いいえ」も自由に変更することが出来ません。


完成イメージ

・完成のイメージとしては、実際のメッセージボックスと似た使用感で文字サイズとボタンの文言が変更できるように作ってみます。

・実際のメッセージボックス同様、ボタンのプリセット(vbOKOnly、vbYesNoのような使い方)も出来るようにしてみます。



モジュールの作成

まずは必要なモジュールを作成します。
・Form_MsgBox:自作MsgBoxのUIを設定するユーザーフォーム

キャプチャ3.JPG



ユーザーフォームにはラベルを1つ、コマンドボタンを3つ設置しておきましょう。
ラベルの横幅は出来るだけ広げて設置しておきます。(理由は後述します。)

キャプチャ4.JPG

それぞれオブジェクト名を変更しておきます。
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

キャプチャ5.JPG


Prompt以外はOptionalを設定しています。
Ootionalを設定しておくと関数を呼び出すときに引数を省略できるようになります。
実際のMsgBoxもそうなっていますよね。
引数が省略された時の既定値の設定も出来るので、フォントサイズの既定値を11に設定しています。
既定値を設定しない場合は変数の型に応じた初期値になります。



ボタンのプリセットを設定する


引数のButton_Optionはボタンプリセットを使用するための引数です。(MsgBox関数のvbYesNoなどの指定方法を真似します。)

ボタンのプリセットを設定するにはEnumを定義しておくと便利です。

Public Enum e_MB_ButtonOption
    mbOKOnly = 0
    mbOKCancel 
    mbAbortRetryIgnore 
    mbYesNoCancel 
    mbYesNo 
    mbRetryCancel 
End Enum

キャプチャ6.JPG


関数内では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

キャプチャ7.JPG



※上記は実際の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


キャプチャ1.JPG



これで標準モジュールからMsgBoxShow関数を呼び出してみます。

     Form_MsgBox.MsgBoxShow "マクロを実行しますか?", mbYesNo


キャプチャ2.JPG



キャプチャ3.JPG



表示は上手くいきました。
次回は引数Button_optionの候補を自動で表示できるようにしてみたいと思います。







サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す