• ベストアンサー

VBAでエクセル終了

エクセル2000です。 VBAで「閉じる」ボタンを作りました。 Sub closeボタン() myYN = MsgBox("終了しますか?", vbYesNo + vbQuestion, "終了確認") If myYN = vbNo Then Exit Sub ThisWorkbook.Close End Sub ところが作動させると「いいえ」を選ぶとすんなり終了してくれますが、「はい」にすると「変更を保存しますか?」を何故か続けて2回も聞いてきます。 2回目も「はい」にすると今度はブック保存のダイアログが出てきて、ブック名が「:」(半角コロン)になってます。 変だなあ、と思い上記のマクロを別ブックを新たに作って標準モジュールに張ってみると正常に作動します。 もとのブックに何かあって、こんな現象が起きているのでしょうか? とっても困ってます。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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

merlionXX
質問者

お礼

なんどもありがとうございました。

その他の回答 (4)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

その後の報告 Sub Auto_Close()   End Sub を数日間使いつづけましたが、個人的に、なかなか具合がよいです。merlionXXさんの当初の目的とは違うかもしれませんが。

merlionXX
質問者

お礼

お礼が大変遅くなり、申し訳ございません。 とても勉強になりました。 ありがとうございました。

merlionXX
質問者

補足

> 数日間使いつづけましたが、個人的に、なかなか具合がよいです。merlionXXさんの当初の目的とは違うかもしれませんが。 そこまでテストしていただいて感謝感激です。 当初の目的は、右上の×を押さずに同じような表示を出すダイアローグがほしかったのです。 (教えていただいたVBAですと保存場所や名前などが変更できないので) でもありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

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)
回答No.2

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

merlionXX
質問者

補足

いつもお世話になります。 BeforeCloseには何も設定してないんです。 BeforeSaveを消すと正常に作動しました。 でも、別のブックでためすと同じBeforeSaveがあってもなんともないんですが。変ですねえ。 ThisWorkbook.Close True にすると何も聞かずに保存されてしまうのでだめなんです。 ありがとうございました。

  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.1

そのワークブックのクローズイベントに変な処理を入れているとか。

merlionXX
質問者

補足

クローズイベントではないですが、BeforeSaveだから終了時に保存を選ぶと走りますね。 以下の通りです。 これがまずいとすれば(どうもそうらしいですが)どう記述すればいいのでしょう? Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Sheets("LOG").Protect , UserInterfaceonly:=True Sheets("LOG").Range("C1") = False End Sub

関連するQ&A