• ベストアンサー

CloseとQuitについて

こんばんは。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1343464 上記質問のNo.2の回答に >ThisWorkbook.Close SaveChanges:=True '要保存のダイアログが出ません。 >Falseなら、ダイアログが出てきます。ただし、デフォルトは False です。 ●しかし、この場合は、Application.Quit(Excelの終了)は、使えません。 ●Close メソッドではなく、Save メソッドを使ってから、Application.Quit になります。 とありますが、●の行の意味がちょっと分かりません。 後学のため説明願えれば幸いです。 宜しくお願いします。

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

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

quit123さん、こんにちは。 私は、時々、基本的なところで大ポカをしたかもしれないと、今回は、ちょっと動揺しました。(^^; お書きになったコード >Sub test_BookClose() >  Application.Quit >  Range("B2") = 33333 >  ThisWorkbook.Close SaveChanges:=True >End Sub 試してみました。なるほど、そういう問題があるのですね。 >Application.Quitはそれが書かれているプロセデュアーが終了するまでは実行されないという特性があります。 上記のようなコードは、私は書かないけれども、Quit では終わらないということですね。勉強になりました。なるほど、それで、Object変数の戻しや、 Application.EnableEvents の戻しが、利くわけですね。 ちょっと、突っ込んで書いてしまいます。(^^; その現象として、やってみて感じたのは、それはExcelのアプリケーションのWorkbooksコレクション・オブジェクトの終了手続き(Application.Quit)と完全終了までのタイムラグではないか、ということです。 もし、プロシージャーが終わるまでなら、以下のように、プロシージャそのものを止めてしまったら、どうでしょうか?やはり、予定されていたように終わってしまいますよね。Application.Quit が実行されます。また、プロシージャー自体を止める Macro関数 Halt を使っても、終了してしまいます。 Sub test_BookClose()   Application.Quit   Range("B2").Value = 33331   ThisWorkbook.Close SaveChanges:=True   Stop End Sub

quit123
質問者

お礼

おはようございます。 Wendy02さんのことですからたぶん何かツッコミが入るのではと期待して閉めないでおきました・・。(^^;;; >その現象として、やってみて感じたのは、それはExcelのアプリケーションのWorkbooksコレクション・オブジェクトの終了手続き(Application.Quit)と完全終了までのタイムラグではないか、ということです。 >もし、プロシージャーが終わるまでなら、以下のように、プロシージャそのものを止めてしまったら、どうでしょうか?やはり、予定されていたように終わってしまいますよね。 これはタイムラグとかの問題ではなく、Application.Quitの仕様だと思います。 また、プロシージャーを止める、Stopステートメントを実行する、ということはその時点でそのプロシージャーは終了したと判断しているのではないでしょうか。 また違った意見もあろうかとは思いますが、それらはApplication.Quitの実際のロジックが分からなければ全て想像の域をでませんので今回はこれで閉めさせて頂きます。 最後に一言。Wendy02さんのVBAに関しての知識(他もあるかも知れませんが(^^;;;)には回答を見るたび驚かされます、と言うより感心されられます。 これからも素晴らしい回答期待しております。

その他の回答 (2)

  • surounin
  • ベストアンサー率28% (30/106)
回答No.2

参考までに^^; 私はセーブコマンドを使ってます Sub MENU_CLOSE() ActiveWorkbook.Save Application.Quit End Sub

quit123
質問者

お礼

おはようございます。 回答ありがとうございます。 やはりプログラム終了の流れとしては、Application.Quitは最後にあった方が分かり易いですよね。 また何かあった時は宜しくお願いします。

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

その文章を書いた本人です。 >しかし、この場合は、Application.Quit(Excelの終了)は、使えません。 実際、聞くよりも、やってみれば一目瞭然です。 Sub test_SheetDelete()  Application.DisplayAlerts = False 'On Error Resume Next 'ActiveSheet.Delete  Application.DisplayAlerts = True  ThisWorkbook.Close SaveChanges:=True ←ここでマクロはお終いです。  Application.Quit  ←これは使えません。 End Sub Bookが出ていない、黒い画面が残ります。 正しく、こちらだと思っていますが、何か、問題が残るのでしょうか? Sub test_Appquit()  With ThisWorkbook   If .Saved = False Then    .Save '保存して   End If  End With  Application.Quit 'Excelを終了 End Sub

quit123
質問者

お礼

早速の回答ありがとうございます。 やはりそういうことでしたか。 Wendy02さんのことですからもしや別な理由が、 と思い質問してみました。 Application.Quitにはある特性があります。 先ず、以下のコードを試してみてください。 ---------------------------------------------- Sub test_BookClose()   Application.Quit   Range("B2") = 33333   ThisWorkbook.Close SaveChanges:=True End Sub ---------------------------------------------- Sub test_AppQuit()   Application.Quit   Range("E2") = 666666   With ThisWorkbook     If .Saved = False Then       .Save     End If   End With End Sub --------------------------------------------- どうですか? まともに動作しますよね。 このようにApplication.Quitはそれが書かれているプロセデュアーが終了するまでは実行されないという特性があります。 ですから、Closeとも使えるし、またプロセデュアーのどこにあってもOKなのです。 ま、気分的には最後に書きたい気もしますが・・・。 参考になれば幸いです。 Wendy02さんの懇切丁寧かつ的を射た回答は非常に参考になります。これからも目から鱗の回答を期待しています。  

関連するQ&A