次の方法で共有


実行時エラー処理の要素

エラーとエラー処理

アプリケーションを作成するときには、エラーが発生した場合のことを考慮する必要があります。 アプリケーションでは、エラーは次の 2 つの原因のいずれかにより発生します。 1 つは、アプリケーションが実行中になんらかの理由により、通常なら有効なコードが機能しなくなった場合です。 たとえば、ユーザーが削除したテーブルをコードで開こうとすると、エラーが発生します。 もう 1 つは、コードのロジックが不適切なために、目的を達することができない場合です。 たとえば、コードで 0 での除算を試みると、エラーが発生します。

エラー処理が組み込まれていない場合、Visual Basic コードでエラーが発生すると、実行が停止され、エラー メッセージが表示されます。 このようなことが起きると、アプリケーションのユーザーは困惑し、不満を抱きます。 発生する可能性のあるエラーに対処するエラー処理ルーチンをコードに含めることによって、多くの問題を未然に防ぐことができます。

プロシージャにエラー処理を追加する場合は、エラーが発生した場合にプロシージャの実行をどのように制御するかを考慮する必要があります。 エラー処理ルーチンに実行の制御を渡すには、まずプロシージャになんらかの形式の On Error ステートメントを含めて、エラー処理ルーチンを有効にします。 On Error ステートメントは、エラーが発生した場合に実行の流れを制御します。 On Error ステートメントが含まれていない場合は、エラーが発生すると、単に実行が停止され、エラー メッセージが表示されるだけです。

有効なエラー処理ルーチンがあるプロシージャでエラーが発生すると、通常のエラー メッセージは表示されません。 その代わりに、エラー処理ルーチンが含まれている場合は、それに実行の制御が渡されます。 実行の制御が有効なエラー処理ルーチンに渡されると、そのエラー処理ルーチンがアクティブになります。 アクティブなエラー処理ルーチン内で、発生したエラーの種類を調べ、開発者が選択した方法でエラーに対処できます。 Access には、発生したエラーに関する情報、ADO Error オブジェクト、Visual Basic Err オブジェクト、DAO Error オブジェクトの 3 つのオブジェクトが用意されています。

エラー発生時のルーティング実行

エラー処理ルーチンは、エラーが発生した場合に、プロシージャ内でとる対処方法を示します。 たとえば、特定のエラーが発生したときにプロシージャを終了したり、エラーの原因を修正して、実行を再開することができます。 On Error ステートメントと Resume ステートメントは、エラーが発生した場合の実行の進み方を決定します。

On Error ステートメント

On Error ステートメントは、エラー処理ルーチンを有効または無効にします。 エラー処理ルーチンを有効にすると、エラーが発生した場合、実行の制御はエラー処理ルーチンに渡されます。

On Error ステートメントには、On Error GoTolabelOn Error GoTo 0、および On Error Resume Next の 3 つの形式があります。 On Error GoTolabel ステートメントは、このステートメントがある行からエラー処理ルーチンを有効にします。 エラーが発生する可能性のある最初の行よりも前の位置で、エラー処理ルーチンを有効にしておく必要があります。 エラー処理ルーチンがアクティブのときにエラーが発生すると、実行の制御は label 引数で指定された行に渡されます。

label 引数で指定された行が、エラー処理ルーチンの先頭にある必要があります。 たとえば、次の手順では、エラーが発生した場合、実行がラベル付けされた行に渡されることを指定します。

Function MayCauseAnError() 
    ' Enable error handler. 
    On Error GoTo Error_MayCauseAnError 
    .            ' Include code here that may generate error. 
    . 
    . 
 
Error_MayCauseAnError: 
    .            ' Include code here to handle error. 
    . 
    . 
End Function

On Error GoTo 0 ステートメントは、プロシージャ内でのエラー処理を無効にします。 このステートメントは、プロシージャに 0 という番号の行が含まれている場合でも、エラー処理コードの開始行として行 0 を指定しません。 コードに On Error GoTo 0 ステートメントが含まれていない場合は、プロシージャの実行が完了すると、エラー処理ルーチンは自動的に無効になります。 On Error GoTo 0 ステートメントは、 Err オブジェクトのプロパティをリセットするので、 Err オブジェクトの Clear メソッドと同じ効果があります。

On Error Resume Next ステートメントは、エラーの原因となった行を無視し、その次の行に実行の制御を移します。 実行は中断されません。 エラーが発生すると予想される行の直後に Err オブジェクトのプロパティをチェックし、エラー ハンドラーではなくプロシージャ内でエラーを処理する場合は、On Error Resume Next ステートメントを使用します。

Resume ステートメント

Resume ステートメントは、エラー処理ルーチン内からプロシージャの本体に実行を戻します。 プロシージャ内の特定の時点で実行を続行する場合は、エラー処理ルーチン内に Resume ステートメントを含めることができます。 ただし、 Resume ステートメントは必要ありません。また、エラー処理ルーチンの後にプロシージャを終了することもできます。

Resume ステートメントには、次の 3 つの形式があります。 Resume または Resume 0 ステートメントは、エラーが発生した行に実行の制御を戻します。 Resume Next ステートメントは、エラーが発生した次の行に実行の制御を戻します。 Resumelabel ステートメントは、label 引数で指定された行に実行の制御を戻します。 label 引数には、行ラベルまたは行番号を指定する必要があります。

Resume または Resume 0 ステートメントは、通常、ユーザーが修正を行う必要がある場合に使用します。 たとえば、開くテーブルの名前をプロンプトで要求したときに、存在しないテーブルの名前をユーザーが入力した場合は、もう一度プロンプトを表示し、エラーの原因となったステートメントから実行を再開することができます。

コードのエラー処理ルーチン内でエラーを修正し、エラーの原因となった行を再度実行しないで実行を続行する場合は、Resume Next ステートメントを使用します。 プロシージャ内の label 引数で指定された別の行から実行を続行するには、Resumelabel ステートメントを使用します。 たとえば、以下に説明するように、終了ルーチンから実行を再開する場合などがあります。

プロシージャの終了

プロシージャ内にエラー処理ルーチンを含めるときは、エラーが発生した場合にのみエラー処理ルーチンが実行されるように終了ルーチンを含める必要があります。 行ラベルでエラー処理ルーチンを指定する場合と同様に、行ラベルで終了ルーチンを指定できます。

たとえば、前の例に終了ルーチンを追加することができます。 エラーが発生しない場合は、プロシージャの本体の終了後に終了ルーチンが実行されます。 エラーが発生した場合は、エラー処理ルーチンのコードの実行後に終了ルーチンに実行の制御が渡されます。 終了ルーチンには、Exit ステートメントが含まれています。

Function MayCauseAnError() 
    ' Enable error handler. 
    On Error GoTo Error_MayCauseAnError 
    .            ' Include code here that may generate error. 
    . 
    . 
 
Exit_MayCauseAnError: 
    Exit Function 
 
Error_MayCauseAnError: 
    .            ' Include code to handle error. 
    . 
    . 
    ' Resume execution with exit routine to exit function. 
    Resume Exit_MayCauseAnError 
End Function

入れ子になったプロシージャでのエラーの処理

有効なエラー ハンドラーを持たない入れ子になったプロシージャでエラーが発生すると、Visual Basic は、単に実行を停止するのではなく、別のプロシージャで有効なエラー ハンドラーの呼び出しリストを後方に検索します。 これにより、コードに別のプロシージャ内のエラーを修正する機会が提供されます。 たとえば、プロシージャ A がプロシージャ B を呼び出し、プロシージャ B がプロシージャ C を呼び出したとします。プロシージャ C でエラーが発生し、有効なエラー ハンドラーがない場合、Visual Basic は、有効なエラー ハンドラーのプロシージャ B、プロシージャ A をチェックします。 存在する場合、実行はそのエラー ハンドラーに渡されます。 そうでない場合は、実行が停止し、エラー メッセージが表示されます。

アクティブなエラー処理ルーチン内でエラーが発生した場合も、呼び出しリスト内を逆方向に有効なエラー処理ルーチンが検索されます。 アクティブなエラー ハンドラー内で Err オブジェクトの Raise メソッドを使用してエラーを発生させることにより、Visual Basic で呼び出しリストを後方に検索するように強制できます。 これは、予期していなかったエラーをエラー処理ルーチン内で処理する場合に役に立ちます。 予期していなかったエラーが発生し、そのエラーがエラー処理ルーチン内で再度発生する場合は、呼び出しリストが逆方向に検索され、実行の制御は、そのエラーを処理できるほかのエラー処理ルーチンに渡されます。

たとえば、プロシージャ C のエラー処理ルーチンが有効でも、発生したエラーを処理できないとします。 この場合、予期していたすべてのエラーをエラー処理ルーチンがチェックした後も、元のエラーが再度発生します。 その結果、プロシージャ B にエラー処理ルーチンがあると、実行の制御は、呼び出しリスト内の次のプロシージャ B に渡され、このエラー処理ルーチンがエラーを修正します。 プロシージャ B にエラー処理ルーチンがない場合、またはエラーを修正できず、そのエラーが再度発生する場合は、実行の制御は、プロシージャ A にエラー処理ルーチンがあれば、そのエラー処理ルーチンに渡されます。

別の方法でこの概念を説明するために、型の不一致エラーに対するエラー処理を含む入れ子になったプロシージャがあるとします。これは、予期していたエラーです。 ある時点で、予期していない 0 除算エラーがプロシージャ C 内で発生します。元のエラーを再生成するステートメントを含めた場合、実行は呼び出しリストを別の有効なエラー ハンドラー (存在する場合) に戻します。 呼び出しリスト内の別のプロシージャで 0 除算エラーを修正した場合、エラーは修正されます。 コードでエラーが再生成されない場合、プロシージャは引き続き 0 除算エラーを修正せずに実行されます。 これにより、入れ子になったプロシージャのセット内で他のエラーが発生する可能性があります。

要約すると、Visual Basic では、次の場合に呼び出しリスト内で逆方向に有効なエラー処理ルーチンが検索されます。

  • 有効なエラー処理ルーチンがないプロシージャでエラーが発生した。

  • アクティブなエラー処理ルーチンでエラーが発生した。 エラーを発生させるために Err オブジェクトの Raise メソッドを使用する場合は、Visual Basic で呼び出しリスト内で逆方向に有効なエラー処理ルーチンを検索させることができます。

エラーに関する情報の取得

エラー処理ルーチンに実行の制御が渡された後で、コードでエラーの種類を調べ、対処する必要があります。 Visual Basic および Access には、特定のエラーについての情報を得るための言語要素がいくつか用意されています。 各要素は、異なる種類のエラーに対応しています。 エラーはアプリケーションの異なる部分で発生するので、発生する可能性のあるエラーに応じて、コードで使用する言語要素を決める必要があります。

エラー処理に使うことのできる言語要素には、次のものがあります。

  • Err オブジェクト

  • ADO Error オブジェクトと Errors コレクション

  • DAO Error オブジェクトと Errors コレクション

  • AccessError メソッド

  • エラー イベント

Err オブジェクト

Visual Basic には、Err オブジェクトが用意されています。 Visual Basic でエラーが発生すると、エラーについての情報は Err オブジェクトに格納されます。 Err オブジェクトには、一度に 1 つのエラー情報のみ格納できます。 新しいエラーが発生すると、そのエラーの情報が格納されるので Err オブジェクトは更新されます。

特定のエラーに関する情報を取得するには、 Err オブジェクトのプロパティとメソッドを使用します。

  • Number プロパティは、 Err オブジェクトの既定のプロパティで、発生したエラーの識別番号を返します。
  • Err オブジェクトの Description プロパティは、Visual Basic エラーに関連する説明文字列を返します。
  • Clear メソッドは、 Err オブジェクトの現在のエラー情報をクリアします。
  • Raise メソッドは、特定のエラーを発生させ、Err オブジェクトのプロパティにエラーについての情報を設定します。

次の例は、型の不一致エラーが発生する可能性のあるプロシージャで、Err オブジェクトの使い方を示しています。

Function MayCauseAnError() 
    ' Declare constant to represent likely error. 
    Const conTypeMismatch As Integer = 13 
 
    On Error GoTo Error_MayCauseAnError 
        .            ' Include code here that may generate error. 
        . 
        . 
 
Exit_MayCauseAnError: 
    Exit Function 
 
Error_MayCauseAnError: 
    ' Check Err object properties. 
    If Err = conTypeMismatch Then 
        .            ' Include code to handle error. 
        . 
        . 
    Else 
        ' Regenerate original error. 
        Dim intErrNum As Integer 
        intErrNum = Err 
        Err.Clear 
        Err.Raise intErrNum 
    End If 
    ' Resume execution with exit routine to exit function. 
    Resume Exit_MayCauseAnError 
End Function

前の例では、Raise メソッドを使って、元のエラーを再度発生させています。 型の不一致以外のエラーが発生した場合、実行の制御は、呼び出しリスト内を逆方向にたどって検索された有効なエラー処理ルーチンに渡されます。

Err オブジェクトは、Visual Basic エラーについての必要なすべての情報を提供します。 ただし、Access エラーや Access データベース エンジン エラーに関する完全な情報は提供されません。 Access オブジェクトと Data Access Objects (DAO)) には、これらのエラーに役立つ追加の言語要素が用意されています。

Error オブジェクトと Errors コレクション

Error オブジェクトと Errors コレクションは、ADO と DAO によって提供されます。 Error オブジェクトは、ADO または DAO エラーを表します。 1 つの ADO または DAO 操作によって、特に DAO ODBC 操作を実行している場合に、いくつかのエラーが発生する可能性があります。 特定のデータ アクセス操作中に発生する各エラーには、 Error オブジェクトが関連付けられています。 特定の ADO または DAO 操作に関連付けられている すべての Error オブジェクトは Errors コレクションに格納され、最も低いレベルのエラーはコレクション内の最初のオブジェクトであり、最上位のエラーはコレクション内の最後のオブジェクトです。

ADO エラーまたは DAO エラーが発生すると、Visual Basic の Err オブジェクトには、Errors コレクションの最初のオブジェクトのエラー番号が含まれます。 さらに ADO エラーまたは DAO エラーが発生したかどうかを調べるには、Errors コレクションをチェックします。 Errors コレクションの最初の Error オブジェクトの ADO の Number プロパティまたは DAO の Number プロパティ、および ADO の Description プロパティまたは DAO の Description プロパティの値は、Visual Basic の Err オブジェクトの Number プロパティおよび Description プロパティの値に一致する必要があります。

AccessError メソッド

Err オブジェクトの Raise メソッドを使用して、実際に発生していない Visual Basic エラーを生成し、そのエラーに関連付けられている説明的な文字列を特定します。 ただし、 Raise メソッドを使用して、Access エラー、ADO エラー、または DAO エラーを生成することはできません。 Access エラー、ADO エラー、または実際に発生していない DAO エラーに関連する説明文字列を特定するには、 AccessError メソッドを使用します。

エラー イベント

Error イベントを使用して、Access フォームまたはレポートで発生したエラーをトラップします。 たとえば、データ型が日付/時刻型のフィールドにテキストの入力を試みると、Error イベントが発生します。 たとえば、Error イベント プロシージャを [社員] フォームに追加してから、[入社日] フィールドにテキストを入力すると、Error イベント プロシージャが実行されます。

Error イベント プロシージャには、整数の引数である DataErr があります。 Error イベント プロシージャが実行されると、DataErr 引数には発生した Access エラーの番号が返されます。 イベント プロシージャ内で DataErr 引数の値をチェックすることが、発生したエラーの番号を確認する唯一の方法です。 Error イベントが発生した後、 Err オブジェクトにエラー情報が設定されません。 DataErr 引数の値を AccessError メソッドと共に使用して、エラーの数とその説明文字列を決定します。

注:

Error ステートメントと Error 関数は、下位互換性のためにのみ提供されます。 新しいコードを記述する場合、エラーについての情報を得るには、 Err オブジェクト、 Error オブジェクト、 AccessError 関数、および Error イベントを使用してください。

投稿者について

Community Member Icon the ElevateAccess コミュニティによって提供されるリンク

UtterAccess は非常に優れた Microsoft Access wiki およびヘルプ フォーラムです。

関連項目

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

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