1. fuk101

    Posted

    fuk101
Changes in title
+VBAで例外処理 try-catch-finally を使う方法
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,126 @@
+# やりたい事
+VBAで例外処理のtry-catch-finally構文みたいな事をやりたい。
+
+# サンプルコード
+try-catch-finally構文のサンプルコードです
+
+```VB
+Sub test()
+'エラーが起きたときはErrorHandler:へ飛ぶ
+On Error GoTo ErrorHandler
+
+ '何かの処理
+ XXXXX
+ XXXXX
+ XXXXX
+ XXXXX
+
+ 'Finally:へ飛ぶ
+ GoTo Finally
+
+'例外処理
+ErrorHandler:
+
+ 'エラーメッセージを表示する
+ Msgbox "[No:" & Err.Number & "]" & Err.Description, VbCritical & VbOkOnly, "エラー"
+
+ 'Finally:へ飛ぶ
+ Resume Finally
+
+'最終処理
+Finally:
+
+ '必ず通る処理
+ XXXXX
+ XXXXX
+
+ '変数の開放をするetc..
+ If Not XXXXX Is Nothing Then
+ Set XXXXX = Nothing
+ End If
+
+End Sub
+```
+
+# 解説
+VBAにはtry-catch-finally構文がありません。
+なので、「行ラベル」と「On Error ステートメント」を用いてtry-catch-finally構文のようなことをします。
+
+## 行ラベルとは
+[Office VBA リファレンス - 行ラベル](https://docs.microsoft.com/ja-jp/office/vba/language/glossary/vbe-glossary#line-label)
+
+1コード行を示すために使用される。
+
+```VB
+'指定した行ラベルまでジャンプすることができる。
+GoTo 行ラベル名
+```
+
+```VB
+'ラベルは、文字で開始してコロン (:) で終了する必要がある。
+行ラベル名:
+```
+
+```VB
+'行ラベルを使用したサンプルコード
+Sub test()
+
+ MsgBox ("hoge1")
+
+ GoTo Label 'Label:に飛ぶ
+
+ MsgBox ("hoge2") '実行されない
+
+'ここに飛ぶ
+Label:
+
+ MsgBox ("hoge1")
+
+End Sub
+```
+
+## On Error ステートメントとは
+[Office VBA リファレンス - On Error ステートメント](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/on-error-statement)
+
+エラーが起きたときに、エラーを無視したり、別の処理に分岐したりできる。
+
+```VB
+'エラーが無視される
+On Error Resume Next
+```
+
+```VB
+'エラーが起きたときに、指定した行ラベルまでジャンプすることができる。
+On Error GoTo 行ラベル名
+```
+
+```VB
+'On Error ステートメントを使用したサンプルコード
+Sub test()
+'エラーが起きたときはErrorHandler:へ飛ぶ
+On Error GoTo ErrorHandler
+
+ MsgBox ("hoge1")
+
+ MsgBox ("hoge2")
+
+ '何もエラーが起きなければここで処理を終了する
+ Exit Sub
+
+'もしエラーが起きたらここにとぶ
+ErrorHandler:
+
+ MsgBox ("hoge1")
+
+End Sub
+```
+
+## finallyで変数を解放する
+VBAでExcelオブジェクトを操作するようなコードを書いていると、気づいたらプロセスにExcelが大量に溜まってしまうことがあると思います。
+![0001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230850/f8fd5316-7946-2d5a-2a75-b9e160732724.jpeg)
+
+
+プロセスが溜まっていくのは、プログラムの実行中にエラーなどで処理が止まってしまい、プロセスが正しく終了されないまま放置されるのが原因です。
+なので、エラーが起きたときにもプロセスを解放してあげる必要があります。
+
+try-catch-finally構文を使用すれば、例外が起きようと起きまいとfinallyは必ず通るので、この中で変数の解放をしてあげるとよいと思います。