自作メッセージボックスの作成その4です。
その3はこちら
今回はユーザーフォームを押した後にどのボタンを押したのかを取得したいと思います。
まずはモジュールレベル変数とEnumを宣言します。
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を代入(リターン)してあげれば、どのボタンを押したかを実行元へ返すことが出来ます。
実行元では次のように使用します。
ユーザーフォームを×で消したときはg_Rtn_MsgBoxには0が代入されていますので、Elseで判定しています。
実行時
OKボタン押下時
せっかくなのでサイズを色々変更してみました。
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
実行時
OKボタン押下時
キャンセルボタン押下時
以上になります。
長い間ありがとうございました。
以下、他サイトのリンクが載せられないのでコードを貼り付けておきます。
’フォームモジュール
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