このようなサンプルを用意しました。
(画像をクリックすると、このサンプルがダウンロードできます)
5種類のサンプルを用意し、それぞれユーザーフォーム上にOKボタンだけがあります。
ここでOKボタンが押されて終了したか、そうでないか(閉じる[×]ボタンやEscキー)で処理を切り分けるようにします。
以下、順に説明して行きます。
'***************************************************************************************************
' ユーザーフォームの閉じるボタン制御 Module1(Module)
'
' 作成者:井上治 URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev 変更履歴内容------------------------------------------------------------------------>
'04/01/03(1.00)新規作成
'19/10/24(1.10)64ビット版Office対応(CancelTEST4)、ソース整理
'***************************************************************************************************
Option Explicit
'===================================================================================================
Public swOK As Byte ' ユーザーフォームからの結果通知
'***************************************************************************************************
' ■■■ 公開プロシージャ(Public) ■■■
'***************************************************************************************************
'* 処理名 :ShowUserForm1
'* 機能 :ごく普通のフォーム操作(OKが押されたか後で判断)
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2004年01月03日
'* 作成者 :井上 治
'* 更新日 :2004年01月03日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Public Sub ShowUserForm1()
'-----------------------------------------------------------------------------------------------
' テスト①フォーム
CancelTEST1.Show
' OKボタンがクリックされたか
If swOK = 1 Then
' OKがクリックされた時の処理
MsgBox "「OK」が押されました。"
Else
' OKがクリックされずにHideした時の処理
MsgBox "キャンセルされました。"
End If
Unload CancelTEST1
End Sub
'***************************************************************************************************
' ユーザーフォームの閉じるボタン制御 CancelTEST1(UserForm)
'
' 作成者:井上治 URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev 変更履歴内容------------------------------------------------------------------------>
'04/01/03(1.00)新規作成
'***************************************************************************************************
Option Explicit
'***************************************************************************************************
' ■■■ フォームイベント(Private) ■■■
'***************************************************************************************************
'* 処理名 :CommandButton1_Click
'* 機能 :OKボタンのクリックイベント
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2004年01月03日
'* 作成者 :井上 治
'* 更新日 :2004年01月03日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub CommandButton1_Click()
'-----------------------------------------------------------------------------------------------
swOK = 1
Me.Hide
End Sub
'***************************************************************************************************
'* 処理名 :UserForm_Initialize
'* 機能 :ユーザーフォームの初期化
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2004年01月03日
'* 作成者 :井上 治
'* 更新日 :2004年01月03日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub UserForm_Initialize()
'-----------------------------------------------------------------------------------------------
swOK = 0
End Sub
'------------------------------------------<< End of Source >>--------------------------------------
'***************************************************************************************************
' ユーザーフォームの閉じるボタン制御 CancelTEST2(UserForm)
'
' 作成者:井上治 URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev 変更履歴内容------------------------------------------------------------------------>
'04/01/03(1.00)新規作成
'***************************************************************************************************
Option Explicit
'***************************************************************************************************
' ■■■ フォームイベント(Private) ■■■
'***************************************************************************************************
'* 処理名 :CommandButton1_Click
'* 機能 :OKボタンのクリックイベント
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2004年01月03日
'* 作成者 :井上 治
'* 更新日 :2004年01月03日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub CommandButton1_Click()
'-----------------------------------------------------------------------------------------------
swOK = 1
Me.Hide
End Sub
'***************************************************************************************************
'* 処理名 :UserForm_Initialize
'* 機能 :ユーザーフォームの初期化
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2004年01月03日
'* 作成者 :井上 治
'* 更新日 :2004年01月03日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub UserForm_Initialize()
'-----------------------------------------------------------------------------------------------
swOK = 0
End Sub
'***************************************************************************************************
'* 処理名 :UserForm_QueryClose
'* 機能 :ユーザーフォーム閉鎖動作
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(既定)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2004年01月03日
'* 作成者 :井上 治
'* 更新日 :2004年01月03日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
'-----------------------------------------------------------------------------------------------
' 閉じる[×]ボタンか
If CloseMode = vbFormControlMenu Then
MsgBox "キャンセルはできません。"
Cancel = True
End If
End Sub
'------------------------------------------<< End of Source >>--------------------------------------
'***************************************************************************************************
'* 処理名 :ShowUserForm3
'* 機能 :キャンセルボタンを別に置いたフォーム操作
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2004年01月03日
'* 作成者 :井上 治
'* 更新日 :2019年10月24日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Public Sub ShowUserForm3()
'-----------------------------------------------------------------------------------------------
swOK = 0
' OKになるまで繰り返す
Do Until swOK = 1
' テスト③フォーム
CancelTEST3.Show
' OKボタンがクリックされたか
If swOK = 1 Then
' OKがクリックされた時の処理
MsgBox "「OK」が押されました。"
Else
' OKがクリックされずにHideした時の処理
If MsgBox("キャンセルが押されました。" & vbCr & _
"終了しますか?", vbInformation + vbYesNo) = vbYes Then
swOK = 1
End If
End If
Loop
Unload CancelTEST3
End Sub
'***************************************************************************************************
' ユーザーフォームの閉じるボタン制御 CancelTEST3(UserForm)
'
' 作成者:井上治 URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev 変更履歴内容------------------------------------------------------------------------>
'04/01/03(1.00)新規作成
'***************************************************************************************************
Option Explicit
'***************************************************************************************************
' ■■■ フォームイベント(Private) ■■■
'***************************************************************************************************
'* 処理名 :CommandButton1_Click
'* 機能 :OKボタンのクリックイベント
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2004年01月03日
'* 作成者 :井上 治
'* 更新日 :2004年01月03日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub CommandButton1_Click()
'-----------------------------------------------------------------------------------------------
swOK = 1
Me.Hide
End Sub
'***************************************************************************************************
'* 処理名 :CommandButton2_Click
'* 機能 :CANCELボタンのクリックイベント
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2004年01月03日
'* 作成者 :井上 治
'* 更新日 :2004年01月03日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub CommandButton2_Click()
'-----------------------------------------------------------------------------------------------
Me.Hide
End Sub
'***************************************************************************************************
'* 処理名 :UserForm_Initialize
'* 機能 :ユーザーフォームの初期化
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2004年01月03日
'* 作成者 :井上 治
'* 更新日 :2004年01月03日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub UserForm_Initialize()
'-----------------------------------------------------------------------------------------------
swOK = 0
' ユーザーフォームの高さを調整してCANCELボタンを隠す
Me.Height = 74.25
End Sub
'------------------------------------------<< End of Source >>--------------------------------------
'***************************************************************************************************
' ユーザーフォームの閉じるボタン制御 CancelTEST4(UserForm)
'
' 作成者:井上治 URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev 変更履歴内容------------------------------------------------------------------------>
'04/01/03(1.00)新規作成
'19/10/24(1.10)64ビット版Office対応
'***************************************************************************************************
Option Explicit
'===================================================================================================
Private Const GWL_STYLE = (-16)
Private Const WS_SYSMENU = &H80000
' APIは条件付きコンパイルで64ビットWindowsにも対応
#If VBA7 Then
' ウィンドウに関する情報を返す
Private Declare PtrSafe Function GetWindowLong Lib "USER32.dll" _
Alias "GetWindowLongA" _
(ByVal hWnd As LongPtr, ByVal nIndex As Long) As LongPtr
' ウィンドウの属性を変更
Private Declare PtrSafe Function SetWindowLongPtr Lib "USER32.dll" _
Alias "SetWindowLongPtrA" _
(ByVal hWnd As LongPtr, _
ByVal nIndex As Long, _
ByVal dwNewLong As LongPtr) As LongPtr
' Activeなウィンドウのハンドルを取得
Private Declare PtrSafe Function GetActiveWindow Lib "USER32.dll" _
() As LongPtr
' メニューバーを再描画
Private Declare PtrSafe Function DrawMenuBar Lib "USER32.dll" _
(ByVal hWnd As LongPtr) As Long
#Else
' ウィンドウに関する情報を返す
Private Declare Function GetWindowLong Lib "USER32.dll" _
Alias "GetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long) As Long
' ウィンドウの属性を変更
Private Declare Function SetWindowLong Lib "USER32.dll" _
Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
' Activeなウィンドウのハンドルを取得
Private Declare Function GetActiveWindow Lib "USER32.dll" _
() As Long
' メニューバーを再描画
Private Declare Function DrawMenuBar Lib "USER32.dll" _
(ByVal hWnd As Long) As Long
#End If
'***************************************************************************************************
' ■■■ フォームイベント(Private) ■■■
'***************************************************************************************************
'* 処理名 :CommandButton1_Click
'* 機能 :OKボタンのクリックイベント
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2004年01月03日
'* 作成者 :井上 治
'* 更新日 :2004年01月03日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub CommandButton1_Click()
'-----------------------------------------------------------------------------------------------
swOK = 1
Me.Hide
End Sub
'***************************************************************************************************
'* 処理名 :UserForm_Activate
'* 機能 :フォームがアクティブになるイベント
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2004年01月03日
'* 作成者 :井上 治
'* 更新日 :2004年01月03日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub UserForm_Activate()
'-----------------------------------------------------------------------------------------------
#If VBA7 Then
Dim hWnd As LongPtr
Dim Wnd_STYLE As LongPtr
#Else
Dim hWnd As Long
Dim Wnd_STYLE As Long
#End If
hWnd = GetActiveWindow()
Wnd_STYLE = GetWindowLong(hWnd, GWL_STYLE)
Wnd_STYLE = Wnd_STYLE And (Not WS_SYSMENU)
#If VBA7 Then
SetWindowLongPtr hWnd, GWL_STYLE, Wnd_STYLE
#Else
SetWindowLong hWnd, GWL_STYLE, Wnd_STYLE
#End If
DrawMenuBar hWnd
End Sub
'***************************************************************************************************
'* 処理名 :UserForm_Initialize
'* 機能 :ユーザーフォームの初期化
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2004年01月03日
'* 作成者 :井上 治
'* 更新日 :2004年01月03日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub UserForm_Initialize()
'-----------------------------------------------------------------------------------------------
swOK = 0
End Sub
'------------------------------------------<< End of Source >>--------------------------------------
'***************************************************************************************************
' ユーザーフォームの閉じるボタン制御 CancelTEST5(UserForm)
'
' 作成者:井上治 URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev 変更履歴内容------------------------------------------------------------------------>
'04/01/03(1.00)新規作成
'***************************************************************************************************
Option Explicit
'***************************************************************************************************
' ■■■ フォームイベント(Private) ■■■
'***************************************************************************************************
'* 処理名 :CommandButton1_Click
'* 機能 :OKボタンのクリックイベント
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2004年01月03日
'* 作成者 :井上 治
'* 更新日 :2004年01月03日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub CommandButton1_Click()
'-----------------------------------------------------------------------------------------------
swOK = 1
Me.Hide
End Sub
'***************************************************************************************************
'* 処理名 :CommandButton1_KeyDown
'* 機能 :OKボタンのキー押下イベント
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(既定)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2004年01月03日
'* 作成者 :井上 治
'* 更新日 :2004年01月03日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub CommandButton1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
'-----------------------------------------------------------------------------------------------
' Escキー打鍵か
If KeyCode = vbKeyEscape Then
' Escキー打鍵時の処理
If FP_GetResult Then Me.Hide
End If
End Sub
'***************************************************************************************************
'* 処理名 :UserForm_Initialize
'* 機能 :ユーザーフォームの初期化
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2004年01月03日
'* 作成者 :井上 治
'* 更新日 :2004年01月03日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub UserForm_Initialize()
'-----------------------------------------------------------------------------------------------
swOK = 0
End Sub
'***************************************************************************************************
'* 処理名 :UserForm_QueryClose
'* 機能 :ユーザーフォーム閉鎖動作
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(既定)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2004年01月03日
'* 作成者 :井上 治
'* 更新日 :2004年01月03日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
'-----------------------------------------------------------------------------------------------
' 閉じる[×]ボタンか
If CloseMode = vbFormControlMenu Then
Cancel = Not FP_GetResult
End If
End Sub
'***************************************************************************************************
' ■■■ サブ処理(Private) ■■■
'***************************************************************************************************
'* 処理名 :FP_GetResult
'* 機能 :キャンセルするかを確認
'---------------------------------------------------------------------------------------------------
'* 返り値 :キャンセル判定(Boolean)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2004年01月03日
'* 作成者 :井上 治
'* 更新日 :2004年01月03日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Function FP_GetResult() As Boolean
'-----------------------------------------------------------------------------------------------
' 確認メッセージ表示
If MsgBox("キャンセルが押されました。" & vbCr & _
"終了しますか?", vbInformation + vbYesNo) = vbYes Then
FP_GetResult = True
Else
FP_GetResult = False
End If
End Function
'------------------------------------------<< End of Source >>--------------------------------------
'***************************************************************************************************
' ■■■ サブ処理(Private) ■■■
'***************************************************************************************************
'* 処理名 :FP_GetResult
'* 機能 :キャンセルするかを確認
'---------------------------------------------------------------------------------------------------
'* 返り値 :キャンセル判定(Boolean)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2004年01月03日
'* 作成者 :井上 治
'* 更新日 :2020年01月09日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Function FP_GetResult() As Boolean
'-----------------------------------------------------------------------------------------------
' 確認メッセージ表示
FP_GetResult = MsgBox("キャンセルが押されました。" & vbCr & _
"終了しますか?", vbInformation + vbYesNo) = vbYes
End Function