次には、VBAプログラムのさまざまなデバッグツールとエラー処理の操作方法を紹介し、いくつかの基本的な例を挙げます。
VBAを使用してExcelでプログラムを作成する場合、プログラムが実行されないまたは実行結果が正しくないなどのエラーが発生することは避けられません。一般的に、プログラムのエラーは2つの種類に分けられます。1つは、プログラム開発者のミスでバグ(bug)が生じます。例えば、不十分なプログラミング、コードの誤入力ミスなどです。この状況では、プログラムの開発時に問題を見つけるためにVBAのさまざまなデバッグツールを使用する必要があります。
もう1つは、プログラム自体はエラーがないですが、開発過程での誤操作をエラー(error)に致します。例えば、データの誤入力または読み取りのファイルが見つからないなどです。このようなエラーが発生した場合は、VBAのエラー処理コードを作成する必要があり、さまざまなエラーを適切に処理します。
目次
デバッグツール(Debug)
通常、VBAプログラムを開発するとき、コードを記述した後、最初にテストして実行結果を確認します。VBAコードの実行をテストする場合は、Visual Basic開発ツールを活用するのが最も便利な方法です。
サブプログラム(Sub)の実行をテストするには、カーソルをサブプログラムに移動すると、今のサブプログラムの名前が表示されます。また、ツールバーの実行ボタンをクリックして、このサブプログラムをすぐに実行します。実行結果を確認できます。
プログラムはエラーがある場合、このようなエラーメッセージウィンドウが表示されます。この場合にコードを確認したい場合は、[デバッグ]を選択します。
[デバッグ]をクリックすると、[中断]モードが開き、今のプログラムにある誤入力したコードが表示されます。
文法が正しくないまたは誤入力など、簡単なエラーが発生した場合は、そのコードを見つけて、エラーを解決できますが、論理的なエラーが発生した場合は、プログラムを実行する時に各変数の内容を確認する必要があります。
中断モードでは、確認する変数にマウスを移動し、変数の内容をすぐに確認でき、エラーの場所を見つけます。
コードに複雑な演算過程がある場合、その数式を選択すると、計算結果が表示されます。
プログラムのブレークポイント
プログラムの実行過程にエラーがありませんが、実行結果が予想と異なり、どこに問題があるのかわからない場合は、プログラムにブレークポイントを設定して、エラーを見つけます。
まず、エラーが発生する可能な位置にブレークポイントを追加し、設定してからプログラムを実行します。
ブレークポイントを設定した後、プログラム実行時にブレークポイントまで一時停止するため、開発者は各変数の内容をゆっくりと確認できます。
ステップイン
プログラムに確認する場所がたくさんある場合は、ステップインでデバッグできます。
F8ボタンを押すと、プログラムは1行目から1行ずつ実行され、一度押すと一行が実行されます。プログラムの実行中は、マウスを使用していつでも各変数の内容を表示でき 、問題を見つけます。
プログラムの実行を中断する
ループを作成するときに誤って無限ループを作成した場合、次のように実行後に停止することはできません。
Dim x As Long
x = 5
' 無限ループ
Do While x > 2
x = x + 1
Loop
止められない場合は、EscキーまたはCtrl + break を押すと、プログラムをすぐに停止できます。
ウォッチ式
プログラムのデバッグの過程で、複数の変数や式の内容の変化を観察する必要があるかもしれません。このとき、興味のある式を選択し、右クリックして、[ウォッチ式の追加]をクリックします。
観察したい式を記入します。
設定したウォッチ式がウォッチウィンドウに表示されるので、複数の変数や式を同時にウォッチできます。
エラー処理(Error Handling)
完全なVBAプログラムは、コード自体には設計上の問題がなくても、エラーも発生するかもしれません。例えば、入力データが間違いデータ、読み取るファイルが存在しないまたはユーザーの不適当な操作によるエラーです。
プログラムの実行中に発生するエラーを処理する場合は、エラー処理(error handling)を使用して、さまざまなエラー対策を自動的に実行し、プログラムを実行し続けるか、直接終了するかを決定できます。
デフォルトでは、プログラムを実行する時、エラーが発生すると、エラーメッセージウィンドウが表示し、プログラムの実行が終了します。(上記の例と同じです。)エラー処理のOn Errorを使用し、処理方法をカスタマイズできます。次には簡単な例を挙げます。
Sub Hello()
On Error GoTo ErrorHandler ' エラー処理を有効にする
Dim x, y, z As Integer
x = 10
y = 0
z = x / y ' 0で除算エラーが発生した
MsgBox "z = " & z
Exit Sub ' サブプログラムを終了する
ErrorHandler: ' エラー処理のコード
MsgBox "ミス" & Err.Number & ":" & Err.Description
Resume Next ' 実行し続ける
End Sub
ここでのコードは2つの部分に分けることができます。上部は普通のコードで、下部はエラーを処理するため、特別に使用されるコードです。
コードの上半分の最初の行では、On Errorを使用して、エラーが発生したときの処理方法を設定します。エラーを処理する方法はいくつかあります。よく使われるのは、GoToを使用してエラー処理コードの場所を設定することです。(ここのErrorHandlerです。)このように設定すると、プログラムを実行する際にエラーが発生すると、エラーを処理するため、下記のErrorHandler:の位置に移動します。
このプログラムでは、わざと0で除算エラーを生成させます。エラーが発生した場合は、下記のErrorHandler:に移動し、MsgBoxでエラー番号とエラーの説明を表示します。
また、Resume Nextを呼び出して上記の普通のコードに戻り、エラーが発生した次の行から実行します。つまり、zの値を出力しますが、zの値が誤って計算されたため、その値は無意味になりました。
エラー処理コードの部分を調整して、プログラムを直接続行するか終了するかを自分で決定できます。 エラーが処理された直後にサブプログラムを終了する場合は、Resume Nextの行を削除すればいいです。プログラムはいつもの通りにサブプログラムを終了します。
エラーを無視する
プログラムがエラーを無視したい場合は、On Errorの処理方式をResume Nextとして指定できます。
On Error Resume Next ' エラーを無視して続ける
Dim x, y, z As Integer
x = 10
y = 0
z = x / y ' 0で除算エラーが発生した
MsgBox "z = " & z
このように、プログラムの実行は、何かエラーが発生しても、エラーメッセージは表示されず、プログラムが終了するまで実行し続けます。
コメントを残す