■
エクセルVBA中級編−VBAでいろんなテクニック
■ エラー処理(例外処理)2
前回に続いて、エラー処理の解説です。
前回は、Errオブジェクトのプロパティまで説明しました。
Err.Raise Errオブジェクトのメソッドです。エラーを意図的に発生させることができます。エラー処理のテストなどに利用できます。
例:
Sub test()
On Error GoTo ErrHandler
Err.Raise 11
Exit Sub
ErrHandler:
Debug.Print Err.Number & vbCrLf & _
Err.Description & vbCrLf & _
Err.Source
Resume Next
End Sub
この例では、Err.Raise 11 で意図的に0除算エラーを発生させ、エラーハンドラ内で対応するエラー情報を出力させた後、終了します。
例:
On Error Resume Next
' 構文1
If Err.Number<>0 Then
Debug.Print Err.Number & vbCrLf & _
Err.Description & vbCrLf & _
Err.Source
End If
この例では、構文1内で何らかのエラーが発生した場合、Err.Numberに0以外の整数がセットされるため、
If Err.Number<>0 Then のIfブロックが実行されます。(0以外ならばなんらかのエラーが発生している)
ちなみにNumberはErrオブジェクトの規定プロパティなので、
・If Err.Number<>0 Then
・If Err<>0 Then
・If Err Then (If文で0以外はTrueに評価されるため)
どの記述をしても、動作は同じになります。
Error関数
エラー番号を引数にして、エラーメッセージを返します。エラー処理ルーチン内だけでなく、プロシージャ内のどこにでも記述が可能です。
またErr.Raiseのように、エラーを発生させることも可能です。
例:
MsgBox Error(11)
「0で除算しました」のメッセージを表示します。
例:
Error 11
0除算エラーを発生させます。
エラー処理が必要なプロシージャ
エラー処理は、すべてのプロシージャに必要なわけではありません。逆に必ずエラー処理が必要なプロシージャも存在します。
一般に、ユーザーから実行させるメインプロシージャや、イベントによって実行されるイベントプロシージャにはエラー処理が必要になります。つまり、プログラムの呼び出し元になるプロシージャには必ずエラー処理を実装しておく必要があります。
これは、呼び出し先のプロシージャ(子・孫プロシージャ)にエラー処理がない場合、さかのぼって呼び出し元のエラーハンドラを利用するためです。
ですので、大元のプロシージャにエラー処理が実装されていない場合、VBAのエラーメッセージが表示されることになります。
ただし、呼び出し先のプロシージャでエラーが発生する可能性があることを分かっている場合は、呼び出し先プロシージャ内でエラートラップを行います。
例えば、呼び出し先プロシージャでファイルをオープンしている場合、エラーが発生したら呼び出し先プロシージャ内でエラートラップし、ファイルをクローズさせるべきです。これを行わずに呼び出し元のエラーハンドラで処理させていると、使用されないファイルハンドラが残ってしまう恐れがあります。
エラー処理で行うべきでない処理
以下のようなエラー処理は間違いです。必要でないエラー処理は極力使用すべきでありません。
例:
Sub test()
Dim MyDate As Date
On Error GoTo ErrHandler
MyDate = CDate(InputBox("Input Date"))
MsgBox "有効な日付です"
Exit Sub
ErrHandler:
MsgBox "有効な日付ではありません"
End Sub
このような処理をエラーハンドラで処理すべきではありません。
Sub test()
Dim MyDate As String
MyDate = InputBox("Input Date")
If IsDate(MyDate) Then
MsgBox "有効な日付です"
Else
MsgBox "有効な日付ではありません"
End If
End Sub
このように記述すれば、エラーハンドラは必要ありません。
VBAの機能でチェックできる内容を、エラー処理を用いて判定すべきではありません。
バグ、デバッグとエラー、エラー処理(例外処理)
よく似た言葉として用いられる、バグとエラー、厳密にはどう違うのでしょう?
バグは、コンピュータが真空管とリレーで構成されていた時代に、真空管の発する光と熱に誘われ内部に入り込んだ小さな虫(bug)が焼死し、炭化して装置の誤作動を招いたことに由来します。
現在ではプログラムのコーディング上のミス・欠陥そのものを指します。つまり、エラーが発生する原因そのものを指すのですが、エラーは必ずしもバグだけで発生するわけではないことに注意してください。コードにバグがなくてもエラーは発生します。
ちなみにコード上のバグを修正・除去する作業をデバッグと呼びます。
エラーはシステムがプログラム動作が正常でないと判断し、処理の中断または停止をさせようとする状態を指します。
エラー処理(例外処理)はエラーが発生した時点で、通常の処理を中断しておこなう「通常とは異なる処理」のことを表します。
以上、エラー処理について解説しました。
エラー処理は、必ず実装させる必要のある処理です。その最大の目的は、
ユーザーの環境およびデータの保護 にあります。
開発の最終フェーズは動作確認テストですが、このテストは開発者(プログラマ)レベルで行えば、それでよいというものではありません。必ず設計者(SE)レベル、使用者(エンドユーザー)レベルでのテストを行ってください。
これは、趣味のフリーソフトの開発であれ、業務用パッケージの受注開発であれ、基本的なスタンスに変わりはありません。
あくまでユーザーへの利益(ユーザーの保護)を最優先すべきです。
Copyright© Gen Muto 武藤 玄 All Rights Reserved,