環境: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
-------------------------------------------------------------------
> ブックの閉じるボタンじゃなく、エクセルの閉じるボタンを押したときのイベントを記述しています。
該当するイベントが無いので、
Excel.Application の WorkbookBeforeClose イベント
Excel.Workbook の BeforeClose イベント
のいずれかで代用する事になるでしょうね。
> Cancelを選択すると、そのあとでさらに編集を保存するか確認してきます。
キャンセル処理が行われていないからです。
「Case Cancel」ではなく、
「Case vbCancel」にしてみてください。
# メッセージ表示の所にブレークポイントを貼っておき、
# そこからステップ実行してみれば、一目瞭然だったかも…。
魔界の仮面弁士ありがとうございます。
簡単なミスでした。。甘いですね。気をつけます。
キャンセルは直ったのですが、「いいえ」を選択したときの動作が
上手くいきません。
エクセルを編集ありの時も編集なしの時も、保存確認で「いいえ」
を選択したとき、もう一度選択画面がでてきてしまい、そこでまた
「いいえ」を選択すると、ブックだけが閉じ、アプリケーションが
閉じられません。
「いいえ」を選択すると、ThisWorkBook.Closeまで行って、
プロシージャが初めに戻ってしまいます。
どうしてなのでしょうか?よろしくお願いします。
確認したところ2回目のメッセージはエクセル規定のメッセージが表示
されました。
このメッセージであれば、DisplayAlertプロパティをFalseにすることで
回避できます。
>「いいえ」を選択すると、ThisWorkBook.Closeまで行って、
>プロシージャが初めに戻ってしまいます。
これは
BeforeCloseイベント
Closeイベント
Closeイベント
の順で発生しているということでしょうか?
魔界の仮面弁士さん
先ほどの発言で さん を付け忘れました;;;
失礼しました。
KGさんアドバイスありがとうございます。
DisplayAlert追加してみます。
>「いいえ」を選択すると、ThisWorkBook.Closeまで行って、
>プロシージャが初めに戻ってしまいます。
流れを書くと、こうなります。
Start
①BeforeCloseイベント
②メッセージ表示「いいえ」選択
③ThisWorkBook.Closeまで流れて
④BeforeCloseイベント
⑤メッセージ表示「いいえ」選択
⑥エクセル規定のメッセージが表示「いいえ」選択
End
結果は、ブックは閉じられエクセルアプリケーションだけが残ります。
あ、すいません。
いいえのケースで記述を追加していました。
Case vbNo
ThisWorkbook.Close ←追加
Application,Quit
何度もすみません。
いいえのケースの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
プロシージャの最初に戻ってしまうのは、Colseメソッドをコールした時点で、
BeforeCoseイベントが発生するからだと思いますよ。
DisplayAlertプロパティを使う箇所としては
-------------------------------------
Case vbNo
'保存せずに閉じる
Application.DisplayAlert=False
Application.Quit
-------------------------------------
でしょうか。
KGさん返信ありがとうございます。
>プロシージャの最初に戻ってしまうのは、Colseメソッドをコールした時点で、
>BeforeCoseイベントが発生するからだと思いますよ。
おっしゃるとおりでした。そんなことも知らなくてすいません;;
DisplayAlertプロパティを使う箇所についても
-------------------------------------
Case vbNo
'保存せずに閉じる
Application.DisplayAlert=False ←ここはわかりましたが…
Application.Quit
Application.DisplayAlert=True ←ここに入れちゃいました。
-------------------------------------
閉じるだけなんでいらないのに、付けなきゃいけないと思ってました;;
おかげ様で思い通りの動きになりました。
ありがとうございました。
> 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 ごと閉じられてしまいますから。
>メロディさん
解決したようでなによりです。
>魔界の仮面弁士さん
DisplayAlertに関するツッコミ有り難うございます。
長年疑いも無くそのまま使っておりました。
勉強になります。
#ああ、、ほかにも勘違いしてつかってそうな機能が有るんだろうなぁ、、、
ツイート | ![]() |