質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

5回答

2201閲覧

ブックを保存せずに閉じると、Excelが再起動される。

montagna

総合スコア1

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2021/08/27 06:25

編集2021/09/06 05:26

実現したいこと

ユーザーフォームの×ボタンが押されたら、
ブックを保存せずに閉じ、かつ、プロジェクト全ての処理を終了させたいです。

発生している問題

ユーザーフォームの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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

自己解決

自分自身でも調べながら解決方法を模索してきましたが、何を試しても症状が変わりませんでした。
妥協して諦めます。
ご回答ありがとうございます。

If CloseMode = 0 Then If MsgBox("キャンセルしますか?", vbYesNo) = vbYes Then MsgBox "処理を中止します。", vbExclamation End Else Cancel = True End If End If

投稿2021/09/13 00:06

montagna

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

追加
全てのブックを閉じる場合

VBA

1Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) 2'Stop 3 '×ボタンが押された場合 4 If CloseMode = 0 Then 5 If MsgBox("キャンセルしますか?", vbYesNo) = vbYes Then 6 Call 全て閉じる 7 Else 8 MsgBox "処理を中止します。", vbExclamation 9 End If 10 11 End If 12End Sub 13 14標準モジュール 15Sub 全て閉じる() 16Dim i As Long 17For i = Workbooks.Count To 1 Step -1 18 19 Workbooks(i).Close savechanges:=False 20 Application.Quit 21 22Next i 23End Sub

投稿2021/09/06 11:16

syousuke.33

総合スコア312

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

montagna

2021/09/07 06:08

ご回答ありがとうございます。 Excel全体を終了させたいわけではないため、Application.Quitは候補に入れておりません。 もう一方のご回答を試してみます。
guest

0

マクロ詳しくありませんが、下記構文何回もテストしました
「Workbooks(main).Close False 」 'main:パブリック変数
これについてはコメント化して
「ActiveWorkbook.Close False 」この様に書き換えました。
確認してみてください

VBA

1Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) 2'Stop 3 '×ボタンが押された場合 4 If CloseMode = 0 Then 5 If MsgBox("キャンセルしますか?", vbYesNo) = vbYes Then 6 ' Workbooks(main).Close False 'main:パブリック変数 7' Cancel = 1 8 ActiveWorkbook.Close False 9 Else 10 MsgBox "処理を中止します。", vbExclamation 11 End If 12 13 End If 14End Sub

投稿2021/09/06 09:59

syousuke.33

総合スコア312

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

montagna

2021/09/07 06:35

ご回答ありがとうございます。 Workbooks(main).Close Falseを ActiveWorkbook.Close Falseに変えて 実行したところ、Excelが再起動されてしまう症状は相変わらずでした。 ちなみにですが、上記の場合に、 ①引数なしのEndではなくExit Subを記述する ②ご提案の通りEndもExitも記述しない 両パターンを試したところ、Excel全体が固まり、クリックする度に警告音が鳴るのみの状態になってしまい、タスクマネージャからExcelを終了させるしかできなくなってしまいました。 ご提案ありがとうございます。
guest

0

Workbooks(main).Close False

Workbooks(main).Saved = True

ではどうでしょう。

投稿2021/08/31 06:17

iruyas

総合スコア1067

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

montagna

2021/09/06 03:10 編集

ご回答ありがとうございます。 Savedプロパティについて、調べました。 ブックを閉じる処理もしたいため、下記のように記述してみました。 変更前) Workbooks(main).Close False 変更後) Workbooks(main).Saved = True Workbooks(main).Close Excelが再起動されてしまう症状は相変わらずでした。 ご提案ありがとうございます。
iruyas

2021/09/06 11:54

そもそも、main って何ですか? このコードが書かれているブックの名前ですか? もしそうでしたら、コード内で Close してはいけません。 ましてや、End なんて普通は使いません。 すべてを終了するには、Application.Quit を使います。 そのとき、もし、ブックが変更されていると、保存するかどうか聞かれます。 ThisWorkbook.Saved = True をやっておくと聞かれずに閉じます。
guest

0

OnTimeはどうでしょう。

VBA

1Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) 2 3 '×ボタンが押された場合 4 If CloseMode = 0 Then 5 If MsgBox("キャンセルしますか?", vbYesNo) = vbYes Then 6 MsgBox "処理を中止します。", vbExclamation 7 Application.OnTime Now + TimeValue("0:00:03"), "BookClose" 8 End 9 Else 10 Cancel = True 11 End If 12 End If 13 14End Sub 15 16Sub BookClose() 17 Workbooks(main).Close False 18End Sub

投稿2021/08/27 09:09

jinoji

総合スコア4592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

montagna

2021/08/31 02:23 編集

ご回答ありがとうございます。 OnTimeメソッドを試してみました。 マクロ "(ファイルパス)!BookClose"を実行できません。このブックでマクロが使用できないか、またはすべてのマクロが無効になっている可能性があります。 上記のメッセージ表示とともにエラーになってしまいます。 初手で標準モジュールを実行し、そこでユーザーフォームを呼び出しているので、『すべてのマクロが無効になっている』ことは無いと思われます。 エラーメッセージを閉じた後は、マクロが実行中のまま固まっている様子もありません。 ご提案ありがとうございます。
jinoji

2021/08/31 09:07

Sub BookClose() を どこのモジュールに配置しましたか。 たとえば"Module1.BookClose" のように明示的に書くと良いかもしれません。
montagna

2021/09/06 03:01

コメントありがとうございます。 モジュールを指定したら、マクロが使用できないというエラーは発生しませんでしたが、Excelが再起動されてしまう症状は相変わらずでした。 ご教授ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問