エラー処理
<< VBAのGoToステートメント :前の記事
前回はVBAのGoToステートメントについて、解説しました。今回は、エクセルVBAのエラー処理ついて詳しく解説していきます。
目次
エラーの種類
マクロを実行すると以下のようなエラーが表示されることがあります。エラーメッセージにはエラーの詳細が記載されていまので、エラーの内容を理解することが解決策の近道です。また、エラーなどのプログラムの不具合のことをバグと言い、バグを修正する作業のことをデバッグと言います。
エラーにも大きく分けると「コンパイルエラー」「実行時エラー」「論理エラー」の3種類があります。こちらでは、その3つについて解説します。
- コンパイルエラー:プログラムがそもそもに動かないエラー
- 実行時エラー:プログラムが動いてはいるが予期しない処理のエラー
- 論理エラー:プログラム構文は正しいが期待した結果と異なる結果となるエラー
コンパイルエラー
コンパイルエラーは、構文に間違いがある場合に表示されます。VBAコードの入力時には自動的に構文のチェックをしているため、入力ミスやダブルクォーテーションなどの記号の入力不足などがあった場合にすぐに警告ができます。
以下の事例では、MsgBox関数の正しい記述は「MsgBox "メッセージ文字列"」ですが、関数名のMsgBoxが「nsgBox」となっています。こちらを実行するとコンパイルエラーの「コンパイルエラー:SubまたはFunction が定義されていません。」と表示されます。こちらは、関数名が間違っているというエラーです。
Sub sample()
nsgBox "msgbox関数"
End Sub
続いてこちらの事例では、文字列を「"(ダブルクォーテーション)」で括らなければいけないのに片方だけ記述されています。こちらも実行するとコンパイルエラーで「コンパイルエラー:構文エラー」と表示されます。こちらは構文が間違っているというエラーです。
Sub sample()
msgbox msgbox関数"
End Sub
実行時エラー
実行時エラーは、プログラムが動いている状態で予期しない処理の場合に表示されるエラーです。VBAコードの構文は正しいのですが、実行できない処理が含まれている場合によく表示されます。以下の事例では、変数iは整数型(Integer)で宣言されていますので、整数値しか格納できないところ文字列を格納しようとしています。こちらを実行すると実行時エラーで「実行時エラー'13':型が一致しません。」と表示されます。こちらは、宣言した型と格納する値が間違っているというエラーです。
Sub sample()
Dim i As Integer
i = "文字列"
End Sub
論理エラー
論理エラーは、プログラムの構文自体は正しく記述しているのにかかわらず、期待した結果とは異なった結果を返す場合のエラーです。正しい結果を導き出すまでの処理手順に間違いがある場合に発生します。無限ループに陥る場合も論理エラーですので、その際は一時中断しましょう。
エラー処理について
コンパイルエラーの場合は、主に記述ミスによるエラーですので、プロパティ・メソッド・VBA関数名の間違いや構文の書き方に間違いがないかをチェックしましょう。
実行時エラーの場合は、エラーメッセージで「デバッグ」のボタンがあります。こちらをクリックすると以下のようにエラーと思われる部分に背景色が付きます。これはこの部分にエラーがあるというわけではないので、その前後の行でエラーが発生している場合もありますので、注意が必要です。
よくある典型的な原因は以下になります。
- 設定した制御構文が意図した通りの流れで処理が実行されない
- 変数や条件式などの値が意図した通り取得や変更ができていない
意図したとおりの流れができているかのチェックはVBEのデバッグ機能であるステップ実行を利用することでどのような流れになっているのかを確認できます。
変数の値の確認などはローカルウィンドウやウォッチウィンドウを利用することで確認できます。こちらについては後ほど解説していきます。
エラーの色
エラー表示は色でそれぞれ違います。以下はだいたいの目安になりますので、参考にしてください。
- 赤は、プロシージャを記述している際に発生する文法エラー
- 青は、プロシージャの実行時に発生する文法エラー
- 黄は、プロシージャの実行途中で発生するエラー
エラー処理の記述
エクセルVBAにはエラーが発生した場合の処理を記述することもできます。エラーが発生した場合の処理を行っておくことで、エラーによるプロシージャの停止を回避することができます。
こちらは、On Errorステートメントを利用して、処理方法になります。1つ目はOn Error Resume Nextステートメントです。通常であれば、変数iはInteger型ですので文字列を代入することはできません。しかし、こちらを記述すると例えエラーが発生してもその次の処理へ移り強制的に処理を実行させます。
Sub sample()
On Error Resume Next
Dim i As Integer
i = "文字列"
Debug.Print i
End Sub
2つ目はOn Error Gotoステートメントです。こちらはエラーが発生した時に、特別な処理をしたい場合に利用します。Gotoステートメントと同様に行ラベルをつけてGotoの後に行ラベルを指定します。
Sub sample()
On Error GoTo ErrorHandler
Dim i As Integer
i = "文字列"
Exit0:
Debug.Print i
Exit Sub
ErrorHandler:
i = 5
Resume Exit0
End Sub
近田 伸矢, 植木 悠二, 上田 寛
IEのデータ収集&自動操作のプログラミング本はこの1冊だけ!IEの起動やポップアップウィンドウ、表示を制御する基本的なコードはもちろん、テキストボックスやラジオボタン、表、ハイパーリンクなどのHTML部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。