Application.Quitの誤解

マクロの処理が終わる段階でExcelも終了させたいということで、「Quitメソッド」を発行させるわけですが、この瞬間に終了するとの誤解があるようです。
テストをしていただくのに、3種類のサンプルを用意しました。
Application.Quitの3種類のテスト
(画像をクリックすると、実際にExcel上で確認ができます)
テストしていただく内容は、以下の通りです。
いずれも「保存しますか」の確認メッセージを避けるため、「ThisWorkbook.Saved=True」を発行させてから終了処理することと、他にワークブックが開いている場合はExcelの終了は行なわないようにしています。
下記の説明の他、メッセージ表示だけのAuto_Close,Workbook_BeforeCloseプロシージャを用意してあります。

@
Closeメソッドを発行しないままでQuitメソッドを発行する。
Option Explicit

'-------------------------------------------------------------------------------
' ■CloseはせずにQuitを発行します。
Sub Quit_TEST1()
    MsgBox "CloseはせずにQuitを発行します。"
    Call Quit_TEST1_Sub
    MsgBox "終わらないよ!!(TEST1)"
End Sub

' Closeはしないで終了するサブ処理
Private Sub Quit_TEST1_Sub()
    ' 保存確認を避けるため、保存済みにする
    ThisWorkbook.Saved = True
    ' 他にブックが開いていなければ、Excelを終了する
    If Workbooks.Count <= 1 Then Application.Quit
End Sub
Quit_TEST1」プロシージャを起動させると、「Quit_TEST1_Sub」が呼び出され、その中でQuitメソッドが発行されます。そこでExcelが終了してしまえばそれまでですが、終了しなければ呼び元プロシージャに戻って、「終わらないよ!!」メッセージが表示されます。
A
Closeメソッドを発行させてから、Quitメソッドを発行する。
Option Explicit

'-------------------------------------------------------------------------------
' ■CloseしてからQuitを発行します。
Sub Quit_TEST2()
    MsgBox "CloseしてからQuitを発行します。"
    Call Quit_TEST2_Sub
    MsgBox "終わらないよ!!(TEST2)"
End Sub

' Quitの前でClose
Private Sub Quit_TEST2_Sub()
    ' 保存確認を避けるため、保存済みにする
    ThisWorkbook.Saved = True
    ' 本ブックをClose
    ThisWorkbook.Close False
    ' 他にブックが開いていなければ、Excelを終了する
    If Workbooks.Count <= 1 Then Application.Quit
End Sub
Quit_TEST2」プロシージャを起動させると、「Quit_TEST2_Sub」が呼び出され、その中でCloseメソッドQuitメソッドが発行されます。そこでExcelが終了してしまえばそれまでですが、終了しなければ呼び元プロシージャに戻って、「終わらないよ!!」メッセージが表示されます。
B
Quitメソッドを発行させてから、Closeメソッドを発行する。
Option Explicit

'-------------------------------------------------------------------------------
' ■QuitしてからCloseを発行します。
Sub Quit_TEST3()
    MsgBox "QuitしてからCloseを発行します。"
    Call Quit_TEST3_Sub
    MsgBox "終わらないよ!!(TEST3)"
End Sub

' Quitの後でClose
Private Sub Quit_TEST3_Sub()
    ' 保存確認を避けるため、保存済みにする
    ThisWorkbook.Saved = True
    ' 他にブックが開いていなければ、Excelを終了する
    If Workbooks.Count <= 1 Then Application.Quit
    ' 本ブックをClose
    ThisWorkbook.Close False
End Sub
さて、動作結果です。
@
この方法は、一番誤解が多い方法です。なぜならヘルプでもこの方法で終了するように記載されているからです。結果は、こうなりました。
Quit_TEST1の処理結果
左から順に表示されました。Auto_Closeの後になってからExcelが終了しました。
このことから、Quitメソッドは、その瞬間にExcelを終了させるのではなく、終了を「予約」しておいて、その後の一連のプロシージャが終わった所で機能することが解ります。
Auto_Close」は本来、マクロから閉じられる動作では機能しないのですが、Closeメソッドが発行されたわけではないので動作したものと考えれば良いでしょう。
A
この方法も誤解が多い方法です。先にCloseさせておけば邪魔ものなしでExcelが終了するだろうとの考え方でしょうか。結果は、こうなりました。
Quit_TEST2の処理結果
Workbook_BeforeCloseが起動した後、ブックのみCloseされ、Excelは終了しませんでした。
つまり、「ThisWorkbook.Close False」の段階でCloseされ、以降の記述を行なわずに閉じられたことになります。
B
Quitメソッドをその段階で機能させるためには、この方法が良いようです。実際はCloseメソッドの段階で終了されます。
Quit_TEST3の処理結果
Workbook_BeforeCloseが起動した後、Excelも終了しました。
ちなみに、Excelのバージョンにより動作が違うと考えている人がいるようです。
実際に記述によってはバージョンで動作が違うことがあるようですが、このテストの結果はExcel97,Excel2000,Excel2002,Excel2003で確認したところ、全く同じでした。
これらのことからお解りだと思いますが、実行時エラーなどでメッセージ表示やログ出力させた後、以降の記述を動作させたくない場合は、Bの方法で記述するようにして下さい。