自作メッセージボックスの作成 その4~どのボタンを押したかを取得するには~

記事
IT・テクノロジー

自作メッセージボックスの作成その4です。
その3はこちら




今回はユーザーフォームを押した後にどのボタンを押したのかを取得したいと思います。


まずはモジュールレベル変数とEnumを宣言します。

キャプチャ4.JPG

Private g_Rtn_MsgBox As Long
Public Enum e_Rtn_Msgbox
    RtnButton1 = 1
    RtnButton2
    RtnButton3
End Enum


これらは、ボタンのクリックイベントで使用します。

ボタン1がクリックされた→g_Rtn_MsgBoxにRtnButton1を代入
ボタン2がクリックされた→g_Rtn_MsgBoxにRtnButton2を代入
ボタン3がクリックされた→g_Rtn_MsgBoxにRtnButton3を代入

といった感じです。

最後にユーザーフォームのMsgBoxShow関数にg_Rtn_MsgBoxを代入(リターン)してあげれば、どのボタンを押したかを実行元へ返すことが出来ます。


キャプチャ2.JPG




実行元では次のように使用します。


キャプチャ3.JPG

ユーザーフォームを×で消したときはg_Rtn_MsgBoxには0が代入されていますので、Elseで判定しています。


実行時
キャプチャ4.JPG



OKボタン押下時
キャプチャ5.JPG







せっかくなのでサイズを色々変更してみました。

キャプチャ6.JPG

Sub Sample()

    Dim Rtn As Long
    Rtn = Form_MsgBox.MsgBoxShow(Prompt:="マクロを実行しますか?", _
                                 Button_Option:=mbOKCancel, _
                                 Title:="実行確認", _
                                 Prompt_FontSize:=30, _
                                 Button_FontSize:=25)
    Select Case Rtn
        Case RtnButton1: Form_MsgBox.MsgBoxShow Prompt:="処理を開始します。", Prompt_FontSize:=20, Button_FontSize:=25
        Case RtnButton2: Form_MsgBox.MsgBoxShow Prompt:="処理を中止します。", Prompt_FontSize:=40, Button_FontSize:=25: Exit Sub
        Case Else: Form_MsgBox.MsgBoxShow Prompt:="処理を中止します。", Prompt_FontSize:=40, Button_FontSize:=25: Exit Sub
    End Select
End Sub



実行時
キャプチャ7.JPG



OKボタン押下時
キャプチャ8.JPG



キャンセルボタン押下時
キャプチャ9.JPG





以上になります。

長い間ありがとうございました。




以下、他サイトのリンクが載せられないのでコードを貼り付けておきます。

’フォームモジュール
Option Explicit

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

Private g_Rtn_MsgBox As Long

Public Enum e_Rtn_Msgbox
    RtnButton1 = 1
    RtnButton2
    RtnButton3
End Enum


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

    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 mbOneTwoThree
                Button1_Caption = "1"
                Button2_Caption = "2"
                Button3_Caption = "3"
        End Select
    End If


    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.lbl_Prompt.AutoSize = True

    Dim CurrentControl As Control 'ループ用変数
    For Each CurrentControl In Me.Controls 'コントロールをループ
        If TypeName(CurrentControl) = "CommandButton" Then 'コマンドボタンのみ対象
            If CurrentControl.Caption = "" Then CurrentControl.Visible = False 'ボタンが空白だったら非表示にする
            CurrentControl.Font.Size = Button_FontSize 'ボタンのフォントサイズを設定
            CurrentControl.AutoSize = True 'ボタンのサイズを自動設定
            CurrentControl.Top = Me.lbl_Prompt.Height + 40 'ラベルとボタンの間にすき間をいれる
        End If
    Next

    Me.Button2.Left = Me.Button1.Left + Me.Button1.Width + 10 'ボタン1とボタン2の間にすき間を入れる
    Me.Button3.Left = Me.Button2.Left + Me.Button2.Width + 10 'ボタン2とボタン3の間にすき間を入れる

    'ユーザーフォームのサイズを設定する
    Me.Height = Me.lbl_Prompt.Height + Me.Button1.Height + 80
    Me.Width = WorksheetFunction.Max(Me.lbl_Prompt.Width + 20, Me.Button1.Width + Me.Button2.Width + Me.Button3.Width + 100)

    Me.Show

    MsgBoxShow = g_Rtn_MsgBox
    g_Rtn_MsgBox = 0

End Function


Private Sub Button1_Click()
    g_Rtn_MsgBox = RtnButton1
    Unload Me
End Sub

Private Sub Button2_Click()
    g_Rtn_MsgBox = RtnButton2
    Unload Me
End Sub

Private Sub Button3_Click()
    g_Rtn_MsgBox = RtnButton3
    Unload Me
End Sub



’標準モジュール
Option Explicit

Sub Sample()
    Dim Rtn As Long
    Rtn = Form_MsgBox.MsgBoxShow(Prompt:="マクロを実行しますか?", _
                                 Button_Option:=mbOKCancel, _
                                 Title:="実行確認", _
                                 Prompt_FontSize:=30, _
                                 Button_FontSize:=25)


    Select Case Rtn
        Case RtnButton1: Form_MsgBox.MsgBoxShow Prompt:="処理を開始します。", Prompt_FontSize:=20, Button_FontSize:=25
        Case RtnButton2: Form_MsgBox.MsgBoxShow Prompt:="処理を中止します。", Prompt_FontSize:=40, Button_FontSize:=25: Exit Sub
        Case Else: Form_MsgBox.MsgBoxShow Prompt:="処理を中止します。", Prompt_FontSize:=40, Button_FontSize:=25: Exit Sub
    End Select


End Sub



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