- ベストアンサー
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 になります。 とありますが、●の行の意味がちょっと分かりません。 後学のため説明願えれば幸いです。 宜しくお願いします。
- みんなの回答 (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
その他の回答 (2)
- surounin
- ベストアンサー率28% (30/106)
参考までに^^; 私はセーブコマンドを使ってます Sub MENU_CLOSE() ActiveWorkbook.Save Application.Quit End Sub
お礼
おはようございます。 回答ありがとうございます。 やはりプログラム終了の流れとしては、Application.Quitは最後にあった方が分かり易いですよね。 また何かあった時は宜しくお願いします。
- Wendy02
- ベストアンサー率57% (3570/6232)
その文章を書いた本人です。 >しかし、この場合は、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
お礼
早速の回答ありがとうございます。 やはりそういうことでしたか。 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さんの懇切丁寧かつ的を射た回答は非常に参考になります。これからも目から鱗の回答を期待しています。
お礼
おはようございます。 Wendy02さんのことですからたぶん何かツッコミが入るのではと期待して閉めないでおきました・・。(^^;;; >その現象として、やってみて感じたのは、それはExcelのアプリケーションのWorkbooksコレクション・オブジェクトの終了手続き(Application.Quit)と完全終了までのタイムラグではないか、ということです。 >もし、プロシージャーが終わるまでなら、以下のように、プロシージャそのものを止めてしまったら、どうでしょうか?やはり、予定されていたように終わってしまいますよね。 これはタイムラグとかの問題ではなく、Application.Quitの仕様だと思います。 また、プロシージャーを止める、Stopステートメントを実行する、ということはその時点でそのプロシージャーは終了したと判断しているのではないでしょうか。 また違った意見もあろうかとは思いますが、それらはApplication.Quitの実際のロジックが分からなければ全て想像の域をでませんので今回はこれで閉めさせて頂きます。 最後に一言。Wendy02さんのVBAに関しての知識(他もあるかも知れませんが(^^;;;)には回答を見るたび驚かされます、と言うより感心されられます。 これからも素晴らしい回答期待しております。