エラー処理

戻る

プログラム実行中に起きるエラーはいくつかのケースがある。プログラムの基本的なバグはテストを繰り返して修正していくしかない。異常終了はしなくても正しい結果が得られない場合なども含め、バグ修正は大変な作業だがプログラミングの一環として避けられない。プログラムが問題無く動いたとして、実行時に生じうる例外的な現象への対応策を盛り込むことを推奨する。方法が正確に明示されており、使用者が正しく操作する場合は問題は起きないであろうが、ミスは付き物であるし、エラー時にデバッグモードに入ってしまうと混乱を招く恐れがある。

しばしば生じるエラーとしては、0で割り算を行うとか、マイナスの数値の平方根を求めるなど、数式にエラーを生じてしまうデータが存在する、あるいは、入力されてしまうケースがある。これらは条件判断により回避することができる。0での割り算を回避し、その場合の結果を0としてしまうサンプルは下記の通りである。

If A = 0 Then
C = 0
else
C = B / A
End If

次に、計算に使うべきセルのデータが文字列であった場合のエラー回避策として、メッセージを出してプログラムを終了するサンプルを示す。プログラム終了時に行うべき処理があれば、それらを盛り込まねばならないのは言うまでも無い。

If IsNumeric(Worksheets("Sheet1").Cells(1,1)) = False Then
I = MsgBox("セルA1が数値ではないので終了します")
Exit Sub
End If

ほぼ同じものであるが、セルの値がエラーであった場合に停止する物は次のようになる。

If IsError(Worksheets("Sheet1").Cells(1,1)) = False Then
I = MsgBox("セルA1が数式エラーのため終了します")
Exit Sub
End If

上記のケースは全て例外処理であり、プログラムエラーを未然に防ぐ方法である。こうした工夫でも防げなかったエラーが発生してしまった場合の対処方法として、「On Error」を使うこともできる。プログラム実行時に何らかのエラーが発生した場合に、あらかじめ準備したエラー処理を行うための物である。具体的には「On Error Goto XXXX」と記述しておき、ラベル「XXXX:」以降にエラー処理を含める。予測していなかったエラーもあり、実際には大した回復策は採れないだろうから、メッセージを表示した後に終了処理を行うのが精一杯であろう。余談であるが、「Goto」は指定したラベルのある位置まで処理を飛ばすものだが、普通は使わないものだと考えて欲しい。

Sub Main()
On Error Goto ABEND
--- 通常処理 ---
Exit Sub
ABEND:
--- 異常時処理 ---
End Sub

これらのエラー対策はプログラムが正しく動作することを確認した後に追加するものだ。当たり前なのだが、デバッグの前にいれてしまうとデバッグがうまく行かなくなる。ワークシート上の式を工夫することでもエラーへの対策が採れるので、プログラムとワークシートの双方を組み合わせていく。例外処理にばかりかまけて本筋を忘れないように注意も必要だ。エラーが頻発する場合や多くの例外処理を盛り込まねばならない場合は、構想段階まで遡って考え直すべきかもしれない。