エクセルで閉じるを押したときの保存確認を表示させないようにするには?

解決


メロディ  2009-02-04 20:06:00  No: 141450

環境:Windows XP(SP2),エクセルVB6 です。
たびたびすみません。
エクセルで1つのブックを開いています。
ブックの閉じるボタンじゃなく、エクセルの閉じるボタンを押したときのイベントを記述しています。
このブックに対し、何か編集をかけて閉じるボタンを押したとき、
Workbook_BeforeCloseイベントが発生しますので、Cancelを選択すると、
そのあとでさらに編集を保存するか確認してきます。
この2回目の保存確認を消したいのですがどうしたらいいのでしょうか?
初歩的な質問で申し訳ないですが、よろしくお願いします。
-----------------------------------------------------------------
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    
    Dim Choice As Integer
    '閉じるボタンが押された場合
    Choice = MsgBox("変更を保存して終了しますか?" & vbLf & _
             "" & vbLf & _
             "「いいえ」を選択すると保存せずに終了します。", vbYesNoCancel, "保存確認")
    
    Select Case Choice
        Case vbYes
            '保存してから閉じる
            ThisWorkbook.Save
            Application.Quit
        Case vbNo
            '保存せずに閉じる
            Application.Quit
        Case Cancel
            '閉じるをキャンセル
            Cancel = True
    End Select
    
End Sub
-------------------------------------------------------------------


魔界の仮面弁士  2009-02-04 20:29:06  No: 141451

> ブックの閉じるボタンじゃなく、エクセルの閉じるボタンを押したときのイベントを記述しています。

該当するイベントが無いので、
  Excel.Application の WorkbookBeforeClose イベント
  Excel.Workbook の BeforeClose イベント
のいずれかで代用する事になるでしょうね。

> Cancelを選択すると、そのあとでさらに編集を保存するか確認してきます。
キャンセル処理が行われていないからです。
「Case Cancel」ではなく、
「Case vbCancel」にしてみてください。

# メッセージ表示の所にブレークポイントを貼っておき、
# そこからステップ実行してみれば、一目瞭然だったかも…。


メロディ  2009-02-04 21:18:48  No: 141452

魔界の仮面弁士ありがとうございます。
簡単なミスでした。。甘いですね。気をつけます。
キャンセルは直ったのですが、「いいえ」を選択したときの動作が
上手くいきません。
エクセルを編集ありの時も編集なしの時も、保存確認で「いいえ」
を選択したとき、もう一度選択画面がでてきてしまい、そこでまた
「いいえ」を選択すると、ブックだけが閉じ、アプリケーションが
閉じられません。
「いいえ」を選択すると、ThisWorkBook.Closeまで行って、
プロシージャが初めに戻ってしまいます。
どうしてなのでしょうか?よろしくお願いします。


KG  2009-02-04 21:47:03  No: 141453

確認したところ2回目のメッセージはエクセル規定のメッセージが表示
されました。

このメッセージであれば、DisplayAlertプロパティをFalseにすることで
回避できます。

>「いいえ」を選択すると、ThisWorkBook.Closeまで行って、
>プロシージャが初めに戻ってしまいます。
これは

BeforeCloseイベント
Closeイベント
Closeイベント

の順で発生しているということでしょうか?


メロディ  2009-02-04 22:28:53  No: 141454

魔界の仮面弁士さん
先ほどの発言で  さん  を付け忘れました;;;
失礼しました。

KGさんアドバイスありがとうございます。
DisplayAlert追加してみます。

>「いいえ」を選択すると、ThisWorkBook.Closeまで行って、
>プロシージャが初めに戻ってしまいます。
流れを書くと、こうなります。
Start
①BeforeCloseイベント
②メッセージ表示「いいえ」選択
③ThisWorkBook.Closeまで流れて
④BeforeCloseイベント
⑤メッセージ表示「いいえ」選択
⑥エクセル規定のメッセージが表示「いいえ」選択
End
結果は、ブックは閉じられエクセルアプリケーションだけが残ります。


メロディ  2009-02-04 22:33:39  No: 141455

あ、すいません。
いいえのケースで記述を追加していました。

Case vbNo
    ThisWorkbook.Close ←追加
    Application,Quit


メロディ  2009-02-04 23:02:10  No: 141456

何度もすみません。
いいえのケースのThisWorkbook.Closeの記述を消すことで、2回目の
保存確認はなくなりましたが、エクセル規定のメッセージが表示は残ります。
DisplayAlertを追加しようとしましたが、どこに追加すればいいか
わからなかったので、Auto_Closeイベントを追加したらなんとか
できました。
このような形でも問題ないのでしょうか?あまり美しくないかも・・?
DisplayAlertの追加も試してみたいのですが。。。

--------------------------------------------------------------
Private Sub Workbook_BeforeClose(Cancel As Boolean)

    Dim Choice As Integer
    '閉じるボタンが押された場合
    Choice = MsgBox("変更を保存して終了しますか?" & vbLf & _
             "" & vbLf & _
             "「いいえ」を選択すると保存せずに終了します。", vbYesNoCancel, "保存確認")

    Select Case Choice
        Case vbYes
            '保存してから閉じる
            ThisWorkbook.Save
            Application.Quit
        Case vbNo
            '保存せずに閉じる
            Application.Quit
            Call Auto_Close
        Case vbCancel
            '閉じるをキャンセル
            Cancel = True
    End Select
    
End Sub

'変更を保存せずにブックを強制的に閉じる
Sub Auto_Close()

    ThisWorkbook.Saved = True

End Sub


KG  2009-02-05 03:56:42  No: 141457

プロシージャの最初に戻ってしまうのは、Colseメソッドをコールした時点で、
BeforeCoseイベントが発生するからだと思いますよ。

DisplayAlertプロパティを使う箇所としては

-------------------------------------
       Case vbNo
            '保存せずに閉じる
            Application.DisplayAlert=False
            Application.Quit
-------------------------------------

でしょうか。


メロディ  2009-02-05 21:21:13  No: 141458

KGさん返信ありがとうございます。
>プロシージャの最初に戻ってしまうのは、Colseメソッドをコールした時点で、
>BeforeCoseイベントが発生するからだと思いますよ。
おっしゃるとおりでした。そんなことも知らなくてすいません;;

DisplayAlertプロパティを使う箇所についても
-------------------------------------
       Case vbNo
            '保存せずに閉じる
            Application.DisplayAlert=False  ←ここはわかりましたが…
            Application.Quit
            Application.DisplayAlert=True  ←ここに入れちゃいました。
-------------------------------------
閉じるだけなんでいらないのに、付けなきゃいけないと思ってました;;

おかげ様で思い通りの動きになりました。
ありがとうございました。


魔界の仮面弁士  2009-02-05 22:47:45  No: 141459

> Choice = MsgBox("変更を保存して終了しますか?" & vbLf & _
この部分を見直した方が良いとおもいます。
変更が無ければ、このメッセージは不要なのですから、メッセージを
表示する必要があるかどうかを、
  If Not ThisWorkbooks.Saved Then
    メッセージ処理
  End If
のようにチェックすべきかと。

> Application.DisplayAlert=False  ←ここはわかりましたが…
DisplayAlert ではなく、
DisplayAlerts ですよね。

で、保存確認を抑制したいだけならば、DisplayAlerts を切り替えるのではなく、
  ThisWorkbook.Saved = True
だけで良い気がします。

Workbook.Saved を使わず、Application.DisplayAlerts だけでも同じように動作するのですが、下記のような理由から、ScreenUpdating や ScreenUpdating は、終了直前に True に戻すことが推奨されています。
(そして今回は True に戻すわけには行かないので、Saved の方が安全かと)

http://support.microsoft.com/kb/213606/ja
http://support.microsoft.com/kb/905208/en-us
http://www.relief.jp/itnote/archives/001936.php
》 DisplayAlertsプロパティの規定値は「True」で、プロシージャの実行が
》 終了すると自動的に「True」に戻るはずなのですが、バージョンによっては
》 バグがあって自動的に「True」にならないことあり、上記のように明示的に
》 「Application.DisplayAlerts = True」としておくことがお行儀のいい
》 コーディングとされています。

> Application.Quit
ブックは1つだけなので、Quit は不要です。
Cancel しなければ、勝手に閉じてくれますから。

また、Quit を記述してしまうと、当初の
> ブックの閉じるボタンじゃなく、エクセルの閉じるボタンを押したときのイベント
に反してしまうと思います。

Excel を閉じずに、ブックだけを閉じようとした場合にも、
Excel ごと閉じられてしまいますから。


KG  2009-02-07 06:45:22  No: 141460

>メロディさん
解決したようでなによりです。

>魔界の仮面弁士さん
DisplayAlertに関するツッコミ有り難うございます。
長年疑いも無くそのまま使っておりました。
勉強になります。

#ああ、、ほかにも勘違いしてつかってそうな機能が有るんだろうなぁ、、、


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加