[教えて!VBA] 第6回 エクセルVBAマクロで、マクロを終了するにはどうすればいいの??
概要

この記事について
かんたんな概要と結論
(解釈次第で他にも存在するでしょう)。
副作用として起こる結果も考慮して、最適な方法を選択すると良いでしょう。
こんにちは、dedeです。
この記事では、
VBAマクロに関する質問のうち、
皆が疑問に思っているトピックについて解説いたします。
今回は、
VBAコードからマクロを終了する方法
を解説いたします。
※この記事は、Office VBAマクロのうち
Excel VBAマクロに関するトピックです。
レベル:初級者向け
マクロを終了するとは?(それぞれの要望の違い)
「マクロを終了」という手続きは、
表現したい処理別に、様々に解釈できると思いますが、
大きく分けて次の3つに分類されると思っています(他にも色々とあるでしょうが)。
- 現在の関数から抜け出す。
- マクロ全体の実行を終了する
- Excelアプリケーションを閉じる。
下記では、
1~3のそれぞれについて
どのようなことが起こっているかの説明と書き方、副作用について
記載します。
それぞれの方法についての説明と書き方
Exit(関数の途中で抜け出す)
ABOUT

関数の内部でExit Sub、もしくはExit Function(プロシージャの種類ごとに決定)を呼び出すことで、
現在実行中の関数から抜け出すことができます。
上の図のように、
親関数から呼び出した子関数においてExit Subを呼び出すことで、
子関数のそれ以降の処理を無視して、
親関数における子関数呼び出し行以降の処理を再開することができます。
コード
1Sub 親関数()
2 Debug.Print "親関数 " & 1
3 Call 子関数
4 Debug.Print "親関数 " & 2
5End Sub
6
7Sub 子関数()
8 Debug.Print "子関数 " & 1
9 Exit Sub
10 Debug.Print "子関数 " & 2
11 Debug.Print "子関数 " & 3
12End Sub
親関数を実行すると、
イミディエイトウィンドウにログが表示されます。
1親関数 1
2子関数 1
3親関数 2
関数の途中でexitしているため、
「子関数 2」の行以降は無視されています。
その後、親関数の「親関数 2」以降の行が順次実行されています。
End(マクロ全体を実行終了)
ABOUT

関数の内部でEndステートメントを呼び出すことで、
VBAマクロ全体を終了します。
上の図のように、
親関数から呼び出した子関数においてEndを呼び出すことで、
子関数のそれ以降の処理を無視して、
親関数の処理も無視してマクロ自体を終了します。
※※後述するように、
この方法にはいくつか副作用があるため、
注意が必要です。
コード
1Sub 親関数()
2 Debug.Print "親関数 " & 1
3 Call 子関数
4 Debug.Print "親関数 " & 2
5End Sub
6
7Sub 子関数()
8 Debug.Print "子関数 " & 1
9 End
10 Debug.Print "子関数 " & 2
11 Debug.Print "子関数 " & 3
12End Sub
親関数を実行すると、
イミディエイトウィンドウにログが表示されます。
1親関数 1
2子関数 1
Endを宣言した後のすべての行は実行されなくなります。
子関数のみならず、親関数(さらに親関数を呼び出している関数など、再帰的にすべての関数)も同様です。
そのため、「親関数 2」ログは出力されません。
副作用
この方法はマクロ全体の実行を終了するため、
いくつかの副作用があります。
①VBAが占有していたメモリが解放される。
変数の値がクリアされ、すべてのオブジェクトが初期化されます。
そのため、モジュール変数に値が格納されていることが想定されたマクロの実行などは、
End実行の後は正常に動作しません(再度変数に値をセットするところから始めないといけません)。
②Openしていたファイルが閉じられる。
編集したり読み取りしたりしていたファイルが強制的に遮断されます。
書き込み内容がブツ切れにならないように、
ファイルI/Oに関連した処理でEndを使用するのは(可能であれば)避けたほうが良いでしょう。
Quit(Excelアプリを終了して閉じる)
ABOUT

Excelアプリ自体を閉じる方法です。
Application.Quitを実行することで、
マクロだけでなくExcelアプリケーション自体を終了することになるので、
他に開いているブックを保存するか・しないか、
また、終了前の処理は何を行うべきか、などをあわせて
検討すると良いでしょう。
コード
1Sub 親関数()
2 Debug.Print "親関数 " & 1
3 Call 子関数
4 Debug.Print "親関数 " & 2
5End Sub
6
7Sub 子関数()
8 Debug.Print "子関数 " & 1
9 Application.Quit
10 Debug.Print "子関数 " & 2
11 Debug.Print "子関数 " & 3
12End Sub
親関数を実行すると、
子関数のQuit実行行で、Excelが閉じられます。
それ以降の処理は実行されないままExcelが終了されます。
終わりに
「マクロを終了する」という一つの要望に対しても、
付帯する様々な結果があることがわかります。
終了処理が不十分なままマクロを終了しないように注意して、
適切な方法を選択するようにできれば、
マクロの品質が上がるでしょう。
関連記事
- [教えて!VBA] 第5回 ブックの最初のシートの最初のセルを選択した状態にするにはどうすればいいの??
- [教えて!VBA] 第4回 シート上の図形をコピーして他のセル上に貼り付けするにはどうすればいいの??
- [Excel VBA] セルの文字色・背景色だけをコピーして貼り付けるマクロを作成しました
- [教えて!VBA] 第2回 一つのセルの値が「東京都」であることを条件として別のアクションを行うにはどうすればいいの??
- [Excel VBA] 年度に関わらず営業日数を算出する方法について紹介