- ベストアンサー
VBAでエクセル終了
エクセル2000です。 VBAで「閉じる」ボタンを作りました。 Sub closeボタン() myYN = MsgBox("終了しますか?", vbYesNo + vbQuestion, "終了確認") If myYN = vbNo Then Exit Sub ThisWorkbook.Close End Sub ところが作動させると「いいえ」を選ぶとすんなり終了してくれますが、「はい」にすると「変更を保存しますか?」を何故か続けて2回も聞いてきます。 2回目も「はい」にすると今度はブック保存のダイアログが出てきて、ブック名が「:」(半角コロン)になってます。 変だなあ、と思い上記のマクロを別ブックを新たに作って標準モジュールに張ってみると正常に作動します。 もとのブックに何かあって、こんな現象が起きているのでしょうか? とっても困ってます。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>当初の目的は、右上の×を押さずに同じような表示を出すダイアローグがほしかったのです。(教えていただいたVBAですと保存場所や名前などが変更できないので それを最初におっしゃっていただければ良かったのですが、Closeの「×」とか、それは、あまり関係がないように思います。ダイアログが必要なら、ダイアログを出せばよいのですからね。これでいかがでしょうか? Sub Closeボタン() Dim myYN As Integer, myRtn As Integer Dim DlgRtn As Boolean myYN = MsgBox("終了しますか?", vbYesNo + vbQuestion, "終了確認") If myYN = vbYes Then If Saved = False Then myRtn = MsgBox("保存しますか?", vbYesNo + vbQuestion, "保存確認") If myRtn = vbYes Then DlgRtn = Application.Dialogs(xlDialogSaveAs).Show If DlgRtn = False Then Exit Sub 'Sheets("LOG").Protect , UserInterfaceonly:=True 'Sheets("LOG").Range("C1") = False ActiveWorkbook.Close ThisWorkbook.Save End If End If ThisWorkbook.Close False End If End Sub
その他の回答 (4)
- Wendy02
- ベストアンサー率57% (3570/6232)
その後の報告 Sub Auto_Close() End Sub を数日間使いつづけましたが、個人的に、なかなか具合がよいです。merlionXXさんの当初の目的とは違うかもしれませんが。
お礼
お礼が大変遅くなり、申し訳ございません。 とても勉強になりました。 ありがとうございました。
補足
> 数日間使いつづけましたが、個人的に、なかなか具合がよいです。merlionXXさんの当初の目的とは違うかもしれませんが。 そこまでテストしていただいて感謝感激です。 当初の目的は、右上の×を押さずに同じような表示を出すダイアローグがほしかったのです。 (教えていただいたVBAですと保存場所や名前などが変更できないので) でもありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
merlionXXさん、こんにちは。 >BeforeCloseには何も設定してないんです。 >BeforeSaveを消すと正常に作動しました。 私の書いた意味は、そうではなくて、BeforeSave のコードは、そこに書く内容ではなく、内容的に終了(Close)の時に書く内容だということだったのです。だから、BeforeCloseで良いと思ったわけです。 Save = Close ではありませんね。しかし、Close の時は、必ず、Save するか、Saveしないかのフラグが立ちます。だから、そのフラグを、こちらで調整してあげなくてはなりません。 ThisWorkbook.Close True ← SaveChange (保存するかどうかのフラグ) >ThisWorkbook.Close True にすると何も聞かずに保存されてしまうのでだめなんです。 ?よく分かりません。「保存しますか?」という、ダイアログが必要だとすれば、別々のコードとして置いたら、本来必要のない時に、イベントが発行してしまいます。 この内容からすると、これ一本で済むと思います。 もし、後、終了時に必要なら、やはり、Auto_Closeに、イベントを置くべきですね。 Sub closeボタン() Dim myYN As Integer, myRtn As Integer myYN = MsgBox("終了しますか?", vbYesNo + vbQuestion, "終了確認") If myYN = vbYes Then If Saved = False Then '保存フラグ myRtn = MsgBox("保存しますか?", vbYesNo + vbQuestion, "保存確認") If myRtn = vbYes Then Sheets("LOG").Protect , UserInterfaceonly:=True Sheets("LOG").Range("C1") = False ThisWorkbook.Save End If End If ThisWorkbook.Close False End If End Sub これは、Saveする時にだけ、「保存しますか?」のダイアログが現れます。 もし、イベントにするなら、以下のようになるのではないでしょうか? 以下は、<標準モジュール>に書き込みます。ThisWorkbook ではありません。 ThisWorkbook イベントとタイミングが違います。 Sub Auto_Close() Dim myYN As Integer, myRtn As Integer Application.EnableEvents = False myYN = MsgBox("終了しますか?", vbYesNo + vbQuestion, "終了確認") If myYN = vbYes Then If ThisWorkbook.Saved = False Then myRtn = MsgBox("保存しますか?", vbYesNo + vbQuestion, "保存確認") If myRtn = vbYes Then Sheets("LOG").Protect , UserInterfaceonly:=True Sheets("LOG").Range("C1") = False ThisWorkbook.Save End If End If ThisWorkbook.Close False Else Exit Sub End If Application.EnableEvents = True End Sub
- Wendy02
- ベストアンサー率57% (3570/6232)
merlionXXさん、こんにちは。 >Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 内容的には、BeforeSave側ではないようですね。 BeforeClose 側では? それと、 Sub closeボタン() myYN = MsgBox("終了しますか?", vbYesNo + vbQuestion, "終了確認") If myYN = vbNo Then Exit Sub ThisWorkbook.Close True 'ここに、保存をするならTrueを入れるとか? End Sub
補足
いつもお世話になります。 BeforeCloseには何も設定してないんです。 BeforeSaveを消すと正常に作動しました。 でも、別のブックでためすと同じBeforeSaveがあってもなんともないんですが。変ですねえ。 ThisWorkbook.Close True にすると何も聞かずに保存されてしまうのでだめなんです。 ありがとうございました。
- popesyu
- ベストアンサー率36% (1782/4883)
そのワークブックのクローズイベントに変な処理を入れているとか。
補足
クローズイベントではないですが、BeforeSaveだから終了時に保存を選ぶと走りますね。 以下の通りです。 これがまずいとすれば(どうもそうらしいですが)どう記述すればいいのでしょう? Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Sheets("LOG").Protect , UserInterfaceonly:=True Sheets("LOG").Range("C1") = False End Sub
お礼
なんどもありがとうございました。