Vba-error-handling

提供:Dev Guides
移動先:案内検索

VBA-エラー処理

プログラミングには、(a)構文エラー、(b)ランタイムエラー、(c)論理エラーの3種類のエラーがあります。

構文エラー

構文エラーは解析エラーとも呼ばれ、VBScriptの解釈時に発生します。 たとえば、次の行では閉じ括弧が欠落しているため、構文エラーが発生します。

Function ErrorHanlding_Demo()
   dim x,y
   x = "finddevguides"
   y = Ucase(x
End Function

ランタイムエラー

ランタイムエラーは、例外とも呼ばれ、実行中に解釈後に発生します。

たとえば、次の行は実行時エラーを引き起こします。ここでは構文は正しいのですが、実行時にfnmultiplyを呼び出そうとしていますが、これは存在しない関数です。

Function ErrorHanlding_Demo1()
   Dim x,y
   x = 10
   y = 20
   z = fnadd(x,y)
   a = fnmultiply(x,y)
End Function

Function fnadd(x,y)
   fnadd = x + y
End Function

論理エラー

論理エラーは、追跡が最も難しいタイプのエラーです。 これらのエラーは、構文エラーまたは実行時エラーの結果ではありません。 代わりに、スクリプトを駆動するロジックを間違えたときに発生し、期待した結果が得られません。

これらのエラーをキャッチすることはできません。これは、ビジネス要件によってプログラムにどのタイプのロジックを配置するかによって異なるためです。

たとえば、数値をゼロで除算したり、無限ループに入るスクリプトを記述したりします。

エラーオブジェクト

実行時エラーがある場合、エラーメッセージを表示して実行を停止します。 開発者として、エラーをキャプチャする場合は、 Error オブジェクトが使用されます。

次の例では、 Err.Number はエラー番号を示し、 Err.Description はエラーの説明を示します。

Err.Raise 6   ' Raise an overflow error.
MsgBox "Error # " & CStr(Err.Number) & " " & Err.Description
Err.Clear   ' Clear the error.

エラー処理

VBAはエラー処理ルーチンを有効にし、エラー処理ルーチンを無効にするためにも使用できます。 On Errorステートメントがないと、発生するランタイムエラーは致命的です。エラーメッセージが表示され、実行が突然停止します。

On Error { GoTo [ line | 0 | -1 ] | Resume Next }
Sr.No. Keyword & Description
1

GoTo line

必要な行引数で指定された行から始まるエラー処理ルーチンを有効にします。 指定された行は、On Errorステートメントと同じ手順である必要があります。そうでない場合、コンパイル時エラーが発生します。

2

GoTo 0

現在のプロシージャで有効なエラーハンドラを無効にし、Nothingにリセットします。

3

GoTo -1

現在のプロシージャで有効な例外を無効にし、それをNothingにリセットします。

4

Resume Next

実行時エラーが発生すると、エラーが発生したステートメントの直後のステートメントに制御が移り、そのポイントから実行が継続することを指定します。

Public Sub OnErrorDemo()
   On Error GoTo ErrorHandler   ' Enable error-handling routine.
   Dim x, y, z As Integer
   x = 50
   y = 0
   z = x/y   ' Divide by ZERO Error Raises

   ErrorHandler:    ' Error-handling routine.
   Select Case Err.Number   ' Evaluate error number.
      Case 10   ' Divide by zero error
         MsgBox ("You attempted to divide by zero!")
      Case Else
         MsgBox "UNKNOWN ERROR  - Error# " & Err.Number & " : " & Err.Description
   End Select
   Resume Next
End Sub