On Error ステートメント

エラー処理ルーチンを有効にして、プロシージャ内のルーチンの場所を指定します。エラー処理ルーチンを無効にする目的でも使用できます。

構文

[エラー GoTo] 行
On Error Resume Next
On Error GoTo 0

On Error ステートメントの構文では、次の形式を使用できます。

Statement 説明
[エラー GoTo] 行 必要な引数で指定されたから始まるエラー処理ルーチンを有効にします。

line 引数は、任意の行ラベルまたは行番号です

実行時エラーが発生した場合は、制御がに分岐し、エラー ハンドラーがアクティブになります。

指定された は、 On Error ステートメントと同じプロシージャ内にある必要があります。それ以外の場合は、 コンパイル時 エラーが発生します。
On Error Resume Next 実行時エラーが発生した場合に、エラーが発生し、実行が続行される ステートメント の直後のステートメントに制御が移動することを指定します。 オブジェクトにアクセスするときは、 On Error GoTo の代わりにこの形式を使用してください。
On Error GoTo 0 現在のプロシージャですべての有効なエラー ハンドラーを無効にします。

解説

On Error ステートメントを使用しない場合は、発生するすべての実行時エラーが致命的となります。つまり、エラー メッセージが表示され、実行が停止します。

"enabled" エラー ハンドラーは、 On Error ステートメントによってオンにされるエラー ハンドラーです。"アクティブ" エラー ハンドラーは、エラーを処理する処理中の有効なハンドラーです。 エラー ハンドラーがアクティブな間にエラーが発生した場合 (エラーの発生と 、ResumeExit SubExit Function、または Exit Property ステートメントの間)、現在のプロシージャのエラー ハンドラーはエラーを処理できません。 コントロールは呼び出し元のプロシージャに戻ります。

呼び出し元のプロシージャに有効なエラー ハンドラーがある場合は、エラーを処理するためにアクティブ化されます。 呼び出し元のプロシージャのエラー ハンドラーもアクティブな場合、コントロールは、有効になっているが非アクティブなエラー ハンドラーが見つかるまで、以前の呼び出し元のプロシージャを渡します。 非アクティブで有効なエラー ハンドラーが見つからない場合、エラーは実際に発生した時点で致命的です。

エラー ハンドラーが呼び出し元のプロシージャにコントロールを渡すたびに、そのプロシージャが現在のプロシージャになります。 プロシージャ内のエラー ハンドラーによってエラーが処理された後、 Resume ステートメントによって指定された時点の現在のプロシージャで実行が再開されます。

注:

エラー処理ルーチンは、 Sub プロシージャまたは Function プロシージャではありません。 これは、行ラベルまたは行番号でマークされたコードのセクションです。

エラー処理ルーチンは、エラーの原因を特定するために Err オブジェクトの Number プロパティの値に依存します。 エラー処理ルーチンは、その他のエラーが発生する前、またはエラーを発生させる可能性があるプロシージャを呼び出す前に、 Err オブジェクト内の関連するプロパティ値をテストあるいは保存する必要があります。 Err オブジェクト内のプロパティ値は、最新のエラーのみを反映します。 Err.Number に対応するエラー メッセージは Err.Description に含まれます。

[エラー再開の次へ] では 、実行時エラーの原因となったステートメントの直後、または On Error Resume Next ステートメントを含むプロシージャの最新の呼び出しの直後に ステートメントを使用して、実行を続行します。 このステートメントを使用すると、実行時エラーが発生した場合でも実行を続行できます。 プロシージャ内の別の場所に制御を転送するのではなく、エラー処理ルーチンをエラーが発生する場所に配置できます。 On Error Resume Next ステートメントは、別のプロシージャが呼び出されると非アクティブになるため、そのルーチン内でインライン エラー処理を行う場合は、呼び出された各ルーチンで On Error Resume Next ステートメントを実行する必要があります。

注:

他のオブジェクトへのアクセス中に生成されたエラーを処理するときに、On Error GoTo よりも On Error Resume Next 構成要素が適している場合があります。 オブジェクトの操作後に Err を確認すると、エラーの発生時にコードがアクセスしていたオブジェクトを明確にできます。 Err.Number にエラー コードを設定したオブジェクトと、最初にエラーを生成したオブジェクト (Err.Source で指定されるオブジェクト) についても確認できます。

On Error GoTo 0 は、現在のプロシージャでエラー処理を無効にします。 このステートメントは、プロシージャに 0 という番号の行が含まれている場合でも、エラー処理コードの開始行として行 0 を指定しません。 On Error GoTo 0 ステートメントがない場合、プロシージャが終了するときに、エラー ハンドラーは自動的に無効にされます。

エラーが発生しなかったときに、エラー処理コードが実行されないようにするには、以下のように、エラー処理ルーチンの直前に、Exit SubExit Function、または Exit Property ステートメントを挿入します。

Sub InitializeMatrix(Var1, Var2, Var3, Var4) 
 On Error GoTo ErrorHandler 
 . . . 
 Exit Sub 
ErrorHandler: 
 . . . 
 Resume Next 
End Sub

ここでは、エラー処理コードは Exit Sub ステートメントに従い、 End Sub ステートメントの前に置いてプロシージャ フローから分離します。 エラー処理コードは、プロシージャ内の任意の場所に配置できます。

オブジェクトが実行可能ファイルとして実行中の場合、オブジェクト内の未トラップのエラーは、制御アプリケーションに戻されます。 開発環境では、適切なオプションが設定されている場合のみ、未トラップのエラーは制御アプリケーションに戻されます。 デバッグ中に、どのオプションを設定する必要があるか、設定の方法、そしてホストがクラスを作成できるかどうかの詳細については、ホスト アプリケーションの文書を参照してください。

その他のオブジェクトにアクセスするオブジェクトを作成する場合、そこから未処理で戻されたエラーの処理を試行する必要があります。 このようなエラーを処理できない場合は、Err.Number 内でエラー コードを自分のエラーの 1 つにマップして、それをオブジェクトの呼び出し元に戻します。 vbObjectError 定数にエラー コードを追加することにより、エラーを指定する必要があります。 たとえば、エラー コードが 1052 の場合、以下のように割り当てます。

Err.Number = vbObjectError + 1052 

注:

Windows ダイナミック リンク ライブラリ (DLL) または Macintosh コード リソースの呼び出し中にシステム エラーが発生しても、例外は発生せず、Visual Basic エラー トラップでトラップすることはできません。 DLL 関数を呼び出すときは、成功または失敗の各戻り値を (API 仕様に従って) チェックし、失敗した場合は Err オブジェクトの LastDLLError プロパティの値をチェックする必要があります。 LastDLLError は 常に Macintosh で 0 を返します。

この例では、最初に On Error GoTo ステートメントを使用して、プロシージャ内のエラー処理ルーチンの場所を指定します。 この例では、開かれたファイルを削除しようとしたときに、エラー番号 55 が生成されます。 エラーはエラー処理ルーチンで処理され、次に、制御がエラーを起こしたステートメントに戻されます。 On Error GoTo 0 ステートメントは、エラー トラッピングをオフにします。

に、エラー再開時 ステートメントを使用してエラー トラップを延期し、次のステートメントによって生成されたエラーのコンテキストを特定できるようにします。 エラーが処理された後で、 Err.Clear が使用され、 Err オブジェクトのプロパティを消去していることに注意してください。

Sub OnErrorStatementDemo() 
 On Error GoTo ErrorHandler ' Enable error-handling routine. 
 Open "TESTFILE" For Output As #1 ' Open file for output. 
 Kill "TESTFILE" ' Attempt to delete open 
 ' file. 
 On Error Goto 0 ' Turn off error trapping. 
 On Error Resume Next ' Defer error trapping. 
 ObjectRef = GetObject("MyWord.Basic") ' Try to start nonexistent 
 ' object, then test for 
'Check for likely Automation errors. 
 If Err.Number = 440 Or Err.Number = 432 Then 
 ' Tell user what happened. Then clear the Err object. 
 Msg = "There was an error attempting to open the Automation object!" 
 MsgBox Msg, , "Deferred Error Test" 
 Err.Clear ' Clear Err object fields 
 End If 
Exit Sub ' Exit to avoid handler. 
ErrorHandler: ' Error-handling routine. 
 Select Case Err.Number ' Evaluate error number. 
 Case 55 ' "File already open" error. 
 Close #1 ' Close open file. 
 Case Else 
 ' Handle other situations here... 
 End Select 
 Resume ' Resume execution at same line 
 ' that caused the error. 
End Sub

関連項目

サポートとフィードバック

Office VBA またはこの説明書に関するご質問やフィードバックがありますか? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。