実現したいこと
ユーザーフォームの×ボタンが押されたら、
ブックを保存せずに閉じ、かつ、プロジェクト全ての処理を終了させたいです。
発生している問題
ユーザーフォームのQueryCloseイベントに、
・ブックを保存せずに閉じる
・引数なしのEndステートメント(すべての処理を終了させたいため)
を記述しています。
ユーザーフォームの×ボタンを押して閉じると、
ブックを保存せずに閉じると同時に、Excelそのものが再起動されてしまいます。
Visual
1Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) 2 3'×ボタンが押された場合 4If CloseMode = 0 Then 5 If MsgBox("キャンセルしますか?", vbYesNo) = vbYes Then 6 Workbooks(main).Close False 'main:パブリック変数 7 MsgBox "処理を中止します。", vbExclamation 8 End 9 Else 10 Cancel = True 11 End If 12End If 13 14End Sub
試したこと
1) DoEventsを活用
検索して調べ、DoEvents
を追記すれば解決するかと思い、試しました。
症状は変わりませんでした。
2) Cancelをパブリック変数で共有
あるいはと考え、ユーザーフォームと標準モジュールそれぞれで
Exit Subで処理を抜けさせようかと考えました。
Cancel
1If CloseMode = 0 Then 2 If MsgBox("キャンセルしますか?", vbYesNo) = vbYes Then 3 Cancel = False 4 btn = Cancel 'btn:パブリック変数 5 Workbooks(main).Close False 'main:パブリック変数 6 MsgBox "処理を中止します。", vbExclamation 7 Exit Sub 8 Else 9 Cancel = True 10 End If 11End If
Boolean型のパブリック変数でCancelプロパティを共有し、
標準モジュールにIf文でFalseの場合にExit Subを実行させたところ、
ブックを保存せずに閉じましたが、マクロが実行中のままExcelが固まってしまい、
マクロの実行をリセットするとExcelが再起動されます。
また、この場合の記述だと、
ユーザーフォームの本来の目的でコマンドボタンを実行した場合、
(ユーザーフォームの×ボタンを押していないのに)
標準モジュールがIf文のところで処理を抜けてしまいます。
3) CloseModeをパブリック変数で共有
CloseMode
1If CloseMode = 0 Then 2 If MsgBox("キャンセルしますか?", vbYesNo) = vbYes Then 3 btn = CloseMode 'btn:パブリック変数 4 Workbooks(main).Close False 'main:パブリック変数 5 MsgBox "処理を中止します。", vbExclamation 6 Exit Sub 7 Else 8 Cancel = True 9 End If 10End If
それならばと思い、CloseMode = 0をInteger型で共有してみました。
ですが、これもCancelを共有した場合と同様、
ブックを保存せずに閉じましたが、マクロが実行中のままExcelが固まってしまい、
マクロの実行をリセットするとExcelが再起動されます。
そしてやはり、ユーザーフォームの本来の目的でコマンドボタンを実行した場合、
標準モジュールがIf文のところで処理を抜けてしまいます。
4)妥協する
ちなみにですが、妥協してブックを保存せずに閉じることを諦めれば、
マクロ実行中のまま固まったり、Excelが再起動されたりといった症状は出ません。
If CloseMode = 0 Then If MsgBox("キャンセルしますか?", vbYesNo) = vbYes Then MsgBox "処理を中止します。", vbExclamation End Else Cancel = True End If End If
お伺いしたいこと
ユーザーフォームのQueryCloseイベント内のみで完結させるには、
引数なしのEndステートメントしかないのでしょうか?
また、ユーザーフォームと標準モジュールそれぞれで
処理を抜けさせる方法は、他に何かあるのでしょうか?
補足情報
Windows10 Pro バージョン 2004
Excelのバージョン:365 ProPlus
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。