こんばんは。

http://oshiete1.goo.ne.jp/kotaeru.php3?q=1343464

上記質問のNo.2の回答に

>ThisWorkbook.Close SaveChanges:=True '要保存のダイアログが出ません。
>Falseなら、ダイアログが出てきます。ただし、デフォルトは False です。
●しかし、この場合は、Application.Quit(Excelの終了)は、使えません。
●Close メソッドではなく、Save メソッドを使ってから、Application.Quit になります。

とありますが、●の行の意味がちょっと分かりません。
後学のため説明願えれば幸いです。
宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (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
    • good
    • 0
この回答へのお礼

おはようございます。

Wendy02さんのことですからたぶん何かツッコミが入るのではと期待して閉めないでおきました・・。(^^;;;

>その現象として、やってみて感じたのは、それはExcelのアプリケーションのWorkbooksコレクション・オブジェクトの終了手続き(Application.Quit)と完全終了までのタイムラグではないか、ということです。
>もし、プロシージャーが終わるまでなら、以下のように、プロシージャそのものを止めてしまったら、どうでしょうか?やはり、予定されていたように終わってしまいますよね。

これはタイムラグとかの問題ではなく、Application.Quitの仕様だと思います。
また、プロシージャーを止める、Stopステートメントを実行する、ということはその時点でそのプロシージャーは終了したと判断しているのではないでしょうか。

また違った意見もあろうかとは思いますが、それらはApplication.Quitの実際のロジックが分からなければ全て想像の域をでませんので今回はこれで閉めさせて頂きます。

最後に一言。Wendy02さんのVBAに関しての知識(他もあるかも知れませんが(^^;;;)には回答を見るたび驚かされます、と言うより感心されられます。
これからも素晴らしい回答期待しております。

お礼日時:2005/04/23 08:59

参考までに^^;


私はセーブコマンドを使ってます
Sub MENU_CLOSE()
ActiveWorkbook.Save
Application.Quit
End Sub
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/04/23 09:04

その文章を書いた本人です。



>しかし、この場合は、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
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。

やはりそういうことでしたか。
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さんの懇切丁寧かつ的を射た回答は非常に参考になります。これからも目から鱗の回答を期待しています。
 

お礼日時:2005/04/22 00:15

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング