1. fuk101

    No comment

    fuk101
Changes in body
Source | HTML | Preview
@@ -1,126 +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で変数を解放する
+## おまけ: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は必ず通るので、この中で変数の解放をしてあげるとよいと思います。