Visual Basic for Applications でのエラー トラップ

文書翻訳 文書翻訳
文書番号: 146864
すべて展開する | すべて折りたたむ

目次

概要

Microsoft Visual Basic for Applications マクロで実行時エラーが発生すると、画面上にエラー メッセージが表示され、マクロが停止するか、予測できない動作をします。

アプリケーションのクラッシュや予測できない動作を回避するため、エラーを遮断してその処理方法を指定するコードをマクロに追加できます。実行時エラーを遮断して処理することを "エラー トラップ" と呼びます。アプリケーションにエラーの処理方法を指定する一連の命令を "エラー処理ルーチン" または "エラー ハンドラ" と呼びます。

詳細

マイクロソフトは、この情報をプログラミング言語の使用方法の一例として提供するだけであり、市場性および特定目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。この資料は、例示されているプログラミング言語やプロシージャの作成およびデバッグに使用するツールについて理解されているユーザーを対象としています。Microsoft Support 担当者は、特定のプロシージャの機能についての問い合わせにはお答えできますが、ユーザー固有の目的に合わせた機能の追加、プロシージャの作成などの内容変更は行っておりません。 Visual Basic コードの実行中、トラップ可能な何種類かのエラーが発生することがあります。Microsoft Excel では、以下の関数とステートメントを使用して、エラー トラップを行うことができます。

On Error ステートメント

On Error ステートメントは、エラー トラップの開始または停止に使用します。また、エラーが発生した場合に実行する一連のステートメントを指定します。

関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
141571 マクロで "On Error" を使用してエラーを処理する方法

Err 関数

Err 関数は、発生したエラーの番号の取得に使用します。

Err 関数の使用例 :
   Msgbox "The most recent error number is " & Err & _
      ". Its message text is: " & Error(Err)
				
以下に、Err 関数の使用時に発生する可能性があるトラップ可能なエラー コードの一覧を示します。
   エラー コード   エラー メッセージ
   ----------   -------------
   3            Return に対応する GoSub がありません。
   5            プロシージャの呼び出し、または引数が不正です。
   6            オーバーフローしました。
   7            メモリが不足しています。
   9            インデックスが有効範囲にありません。
   10           宣言が重複しています。 (バージョン 5.0 および 7.0)
   10           この配列は固定されているか、または一時的にロックされています。 (バージョン 97)
   11           0 で除算しました。
   13           型が一致しません。
   14           文字列領域が不足しています。
   16           文字式が複雑すぎます。(バージョン 5.0 および 7.0)
   16           式が複雑すぎます。 (バージョン 97)
   17           要求された操作は実行できません。
   18           ユーザーによる割り込みが発生しました。
   20           エラーが発生していないときに Resume を実行することはできません。
   28           スタック領域が不足しています。
   35           Sub または Function が定義されていません。 (バージョン 5.0 および 7.0)
   35           Sub、Function、または Property が定義されていません。(バージョン 97)
   47           DLL のクライアント アプリケーションの数が多すぎます。 (バージョン 97)
   48           DLL 読み込み時のエラーです。
   49           DLL が正しく呼び出せません。
   51           内部エラーです。
   52           ファイル名または番号が不正です。
   53           ファイルが見つかりません。
   54           ファイル モードが不正です。
   55           ファイルは既に開かれています。
   57           デバイス I/O エラーです。
   58           既に同名のファイルが存在しています。
   59           レコード長が一致しません。
   61           ディスクの空き容量が不足しています。
   62           ファイルにこれ以上データがありません。
   63           レコード番号が不正です。
   67           ファイルが多すぎます。
   68           デバイスが準備されていません。
   70           書き込みできません。
   71           ディスクが準備されていません。
   74           ディスク名は変更できません。
   75           パス名が無効です。
   76           パスが見つかりません。
   91           オブジェクト変数が設定されていません。(バージョン 5.0 および 7.0)
   91           オブジェクト変数または With ブロック変数が設定されていません。
                  (バージョン 97)
   92           For ループが初期化されていません。
   93           パターン文字列が不正です。
   94           Null の使い方が不正です。
   95           アプリケーション定義またはオブジェクト定義のエラーです。 (バージョン 5.0 および 7.0 のみ)
   298          システム DLL をロードできません。(バージョン 97)
   320          キャラクタ デバイスは使えません。
                  (バージョン 97)
   321          不正なファイル形式です。 (バージョン 97)
   322          必要なテンポラリ ファイルを作成できません。 (バージョン 97)
   323          形式が不正です。モジュールをロードできません。 (バージョン 5.0 および 7.0)
   325          リソース ファイルの形式が不正です。 (バージョン 97)
   327          データ値が見つかりません。(バージョン 97)
   328          不正なパラメータです。配列に書き込めません。 (バージョン 97)
   335          システム レジストリにアクセスできません。 (バージョン 97)
   336          ActiveX コンポーネントが正しく登録されていません。(バージョン 97)
   337          ActiveX コンポーネントが見つかりません。(バージョン 97)
   338          ActiveX コンポーネントが正常に実行されませんでした。(バージョン 97)
   360          このオブジェクトは既にロードされています。 (バージョン 97)
   361          このオブジェクトは、ロードまたはアンロードすることはできません。 (バージョン 97)
   363          指定された ActiveX コントロールが見つかりません。(バージョン 97)
   364          既にアンロードされています。(バージョン 97)
   365          現在アンロードできません。(バージョン 97)
   368          ファイルは古い形式で作成されています。このプログラムには新しい形式のファイルが必要です。
                  (バージョン 97)
   371          指定されたオブジェクトは、Show メソッドのオーナー フォームとして使用できません。
                  (バージョン 97)
   380          プロパティの値が不正です。 (バージョン 97)
   381          プロパティ配列のインデックスが不正です。 (バージョン 97)
   382          プロパティは、実行時には設定できません。 (バージョン 97)
   383          値を設定できません。値の取得のみ可能なプロパティです。
                  (バージョン 97)
   385         プロパティ配列インデックスが必要です。 (バージョン 97)
   387          値を設定できません。 (バージョン 97)
   393          実行時には値を取得できません。 (バージョン 97)
   394          プロパティは値の取得のみ可能です。
                  (バージョン 97)
   400          既にフォームは表示されています。モーダルにできません。(バージョン 97)
   402          一番手前 (前面) のモーダル フォームを先に閉じてください。(バージョン 97)
   419          オブジェクトを利用できません。(バージョン 97)
   422          プロパティが見つかりません。 (バージョン 97)
   423          プロパティまたはメソッドが見つかりません。
   424          オブジェクトが必要です。
   425          オブジェクトの使い方が不正です。(バージョン 97)
   429          ActiveX コンポーネントはオブジェクトを
                  作成できません。(バージョン 97)
   430          このクラスは OLE オートメーションをサポートしていません。
   430          クラスはオートメーションをサポートしていません。 (バージョン 97)
   432          オートメーションの操作中にファイル名またはクラス名を見つけられませんでした。
                  (バージョン 97)

   438          オブジェクトは、このプロパティまたはメソッドをサポートしていません。
   440          OLE オートメーションのエラー。
   440          オートメーション エラーです。(バージョン 97)
   442          リモート プロセス用のタイプ ライブラリまたはオブジェクト ライブラリへの参照は失われました。
                  参照設定を解除して [OK] を押してください。 (バージョン 97)
   443          オートメーション オブジェクトには既定値がありません。
                  (バージョン 97)
   445          オブジェクトはこの動作をサポートしていません。
   446          オブジェクトは名前付き引数をサポートしていません。
   447          オブジェクトは現在の国別情報の設定をサポートしていません。
   448          名前付き引数が見つかりません。
   449          引数は省略できません。
   449          引数は省略できません。または不正なプロパティを指定しています。
                  (バージョン 97)
   450          引数の個数が一致していません。
   450          引数の数が一致していません。または不正なプロパティを指定しています。
                  (バージョン 97)
   451          このオブジェクトがコレクションではありません。
   452          序数が不正です
   453          関数は指定された DLL には定義されていません。
   454          コード リソースが見つかりません。
   455          コード リソースのロック エラーです。
   457          このキーは既にこのコレクションの要素に割り当てられています。
                  (バージョン 97)
   458          Visual Basic でサポートされていないオートメーションが変数で使用されています。
                  (バージョン 97)
   459          このコンポーネントでは、イベントはサポートされていません。 (バージョン 97)
   460          クリップボードのデータ形式が不正です。 (バージョン 97)
   461          データの形式が一致しません。
                  (バージョン 97)
   480          AutoRedraw イメージを作成できません。 (バージョン 97)
   481          ピクチャが不正です。(バージョン 97)
   482          プリンタ エラーです。(バージョン 97)
   483          プリンタ ドライバは指定されたプロパティをサポートしていません。
                  (バージョン 97)
   484          システムからプリンタ情報を受けるときに問題が発生しました。
                  プリンタが正しく設定されているかを確かめてください。(バージョン 97)
   485          ピクチャの形式が不正です。(バージョン 97)
   486          フォームのイメージをこのプリンターで印刷することはできません。
                  (バージョン 97)
   735          テンポラリ ファイルに保存できません。 (バージョン 97)
   744          検索文字列が見つかりませんでした。(バージョン 97)
   746          置換後の文字列が長すぎます。(バージョン 97)
   1000         Classname には propertyname プロパティはありません。
                  (バージョン 5.0 および 7.0)
   1001         Classname には methodname メソッドはありません。
                  (バージョン 5.0 および 7.0)
   1002         引数 argumentname を指定する必要があります。
                  (バージョン 5.0 および 7.0)
   1003         引数の数が正しくありません。(バージョン 5.0 および 7.0)
   1004         classname クラスの Methodname メソッドが失敗しました。
                  (バージョン 5.0 および 7.0)
   1005         classname クラスの propertyname プロパティを設定できません。
                  (バージョン 5.0 および 7.0)
   1006         classname クラスの propertyname プロパティを取得できません。

                  (バージョン 5.0 および 7.0)
   31001        メモリが不足しています (バージョン 97)
   31004        オブジェクトがありません。(バージョン 97)
   31018        クラスが設定されていません。 (バージョン 97)
   31027        オブジェクトをアクティブにできません。(バージョン 97)
   31032        埋め込みオブジェクトが作成できません。(バージョン 97)
   31036        ファイルへの書き込み中にエラーが発生しました。(バージョン 97)
   31037        ファイルの読み込み中にエラーが発生しました。(バージョン 97)
				
関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
142138 [OFF] Visual Basic for Applications のトラップできるエラーについて

Error 関数

Error 関数は、特定のエラー番号に対応するエラー メッセージの取得に使用します。

Error 関数の使用例 :
   Msgbox "The message text of the error is: " & Error(Err)
				

Error ステートメント

Error ステートメントでは、Error 関数にカスタムのエラー番号を割り当てることによってエラーの発生がシミュレートされます。このようなユーザー定義のエラー値は、プロシージャ用に定義する値で、この値は常に Variant データ型の変数に格納されます。この種類のエラー値は、一般に、いくつかの引数を受け付けて 1 つの値を返すプロシージャで使用します。たとえば、引数の値が特定の範囲に含まれている場合にのみ戻り値が有効なプロシージャでは、指定される引数をテストして、引数が受け入れ可能な範囲にない場合は適切なエラー値を返すことができます。

Error は、Variant データ型のサブタイプであり、"エラー値" という用語が使用されるときは、通常、変数が Variant 型であり、この変数が Visual Basic for Applications でユーザー定義のエラーと認識される値を含んでいることを意味します。エラー値は、プロシージャでエラー条件が発生したことを示すために使用されます。通常の実行時エラーと異なり、このエラーはエラーとは認識されずに通常の変数と認識されるため、コードの実行が中断しません。プロシージャでこれらのエラーをテストして、適切な修正処理を実行できます。

Error ステートメントを使用して実行時エラーをシミュレートすることもできます。特に、アプリケーションをテストしているとき、または特定の条件を実行時エラーと同様に扱うとき、この機能が役に立ちます。Error ステートメントでエラー コードを指定することで、Visual Basic for Applications のあらゆる実行時エラーをシミュレートできます。また、Visual Basic for Applications の実行時エラーに対応しないエラー コードを指定して、独自のユーザー定義エラーを作成することもできます。この資料の「Err 関数」に、組み込みエラーの一覧表があります。Visual Basic for Applications では、現時点でまだ組み込みエラーに使用されていない番号があります。Visual Basic for Applications の今後のリリースで組み込み関数が追加されるときは、これらの未使用の番号が使用されます。将来、番号が競合することを防ぐため、独自のエラーには 50,000 から 65,535 までのエラー番号を使用することをお勧めします。

Error ステートメントを使用した実行時エラーのシミュレートの例 :
   Sub Test()

      On Error Resume Next
      Error 50000          'set the value of Err to 50000

      If Err = 50000 Then
         MsgBox "my own error occurred"
      End If

   End Sub
				
Test マクロを実行すると、"my own error occurred" というメッセージを含むメッセージ ボックスが表示されます。

CVErr 関数

CVErr 関数は、エラー値の作成に使用します。CVErr 関数には、引数として、整数または整数を含む変数を指定します。
   NoRadius = CVErr(2010)

   NotANumber = 2020
   InvalidArgument = CVErr(NotANumber)
				
CVErr 関数の使用例 :
   Public NoRadius, NotANumber

   Sub AreaOfCircle()
      Const PI = 3.142
      NoRadius = CVErr(2010)
      NotANumber = CVErr(2020)
      Radius = CheckData(InputBox("Enter the radius: "))
      If IsError(Radius) Then
         Select Case Radius
            Case NoRadius
               MsgBox "Error: No radius given."
            Case NotANumber
               MsgBox "Error: Radius is not a number."
            Case Else
               MsgBox "Unknown Error."
         End Select
      Else
         MsgBox "The area of the circle is " & (PI * Radius ^ 2)
      End If
   End Sub

   Function CheckData(TheRadius)
      If Not IsNumeric(TheRadius) Then
         CheckData = NotANumber
      ElseIf TheRadius = 0 Then
         CheckData = NoRadius
      Else
         CheckData = TheRadius
      End If
   End Function
				

組み込みエラー値の使用

Microsoft Excel には、7 つの組み込みエラー値があります。以下に、エラー番号 (定数)、リテラルのエラー値および変換後のエラー値の一覧を示します。
エラー番号 (定数)             リテラルのエラー値           変換後のエラー値
-----------------------------------------------------------------------

xlErrDiv0                   [#DIV/0!]               CVErr(xlErrDiv0)
xlErrNA                     [#N/A]                  CVErr(xlErrNA)
xlErrName                   [#NAME?]                CVErr(xlErrName)
xlErrNull                   [#NULL!]                CVErr(xlErrNull)
xlErrNum                    [#NUM!]                 CVErr(xlErrNum)
xlErrRef                    [#REF!]                 CVErr(xlErrRef)
xlErrValue                  [#VALUE!]
CVErr(xlErrValue)
				
これらのワークシートの組み込みエラーも、ユーザー定義のエラーと同様に扱います。つまり、CVErr 関数を使用して番号からエラー値に変換します。唯一の違いは、ワークシート エラーの場合、Visual Basic for Applications により、エラー番号が組み込み定数として提供され、リテラルのエラー値も提供されている点です。これらは、ユーザー定義のエラー値の場合は提供されていません。リテラルのエラー値は、上の表に示すように角かっこで囲む必要があります。

組み込みエラー値の使用例 :
   Function Commission(SharesSold,PricePerShare)
      If Not (IsNumeric(SharesSold) And IsNumeric(PricePerShare)) Then
         Commission = CVErr(xlErrNum)
      Else
         TotalSalePrice = ShareSold * PricePerShare
         If TotalSalePrice <= 15000 Then
            Commission = 25 + 0.03 * SharesSold
         Else
            Commission = 25 + 0.03 * (0.9 * SharesSold)
         End If
      End If
   End Function
				

エラー処理プロシージャの利用

Visual Basic for Applications マクロにエラー処理コードを追加するとき、同じエラーを何度も処理していることに気付きます。共通のエラーを処理するプロシージャをいくつか作成してエラー処理コードから呼び出すことで、コードのサイズを小さくし、コーディングの作業量を軽減できます。

以下のサンプルは、発生したエラーに対応するメッセージを表示する関数プロシージャです。このプロシージャは、可能な場合、ユーザーが特定のボタンをクリックして次の処理を指定できるようにします。その後、呼び出し元のプロシージャにコード番号を返します。
   Public Const RESUME_STATEMENT = 0   'Resume
   Public Const RESUME_NEXT = 1        'Resume Next
   Public Const UNRECOVERABLE = 2      'Unrecoverable error
   Public Const UNRECOGNIZED = 3       'Unrecognized error
   Public Const ERR_DEVICEUNAVAILABLE = 68
   Public Const ERR_BADFILENAMEORNUMBER = 52
   Public Const ERR_PATHDOESNOTEXIST = 76
   Public Const ERR_BADFILEMODE = 54


  Function FileErrors(errVal As Integer) As Integer
   Dim MsgType As Integer, Msg As String, Response As Integer
      MsgType = vbExalamation
      Select Case errVal
         Case ERR_DEVICEUNAVAILABLE     'Error #68
            Msg = "That device is unavailable."
            MsgType = MsgType + vbAbortRetryIgnore
         Case BADFILENAMEORNUMBER      'Errors #64 & 52
            Msg = "That filename is not valid."
            MsgType = MsgType + vbOKCancel
         Case PATHDOESNOTEXIST      'Error #76
            Msg = "That path does not exist."
            MsgType = MsgType + vbOKCancel
         Case BADFILEMODE      'Error #54
            Msg = "Can not open the file for that type of access."
            MsgType = MsgType + vbOKCancel
         Case Else
            FileErrors = UNRECOGNIZED
            Exit Function
      End Select
      Response = MsgBox(Msg, MsgType, "Disk Error")
      Select Case Response
         Case vbOK, vbRetry
            FileErrors = RESUME_STATEMENT
         Case vbIgnore
            FileErrors = RESUME_NEXT
         Case vbCancel, vbAbort
            FileErrors = UNRECOVERABLE
         Case Else
            FileErrors = UNRECOGNIZED
      End Select
   End Function
				

ユーザーによる割り込みの処理

ユーザーは Ctrl + Break キーまたは Esc キー (Macintosh ではコマンド キーとピリオド キーの組み合わせ) を押して Visual Basic for Applications プロシージャの実行を中断できます。完成したアプリケーションでプロシージャに対する割り込みを無効にすることができます。完成したプロシージャでユーザーによる割り込みを無効にしない場合は、割り込みの発生をプロシージャに通知して、アプリケーションの制御をユーザーに戻す前に、ファイルを閉じる、共有リソースから切断する、変更した変数を元に戻すなどの処理をプロシージャで実行できます。

EnableCancelKey プロパティを xlErrorHandler に設定すると、プロシージャ内でユーザーによる割り込みをトラップできます。このプロパティが設定されていると、割り込みが発生するたびに実行時エラー番号 18 が生成され、このエラーを On Error ステートメントでトラップできます。このエラーを処理して、プロシージャを一時停止したり、プログラムを終了したりできます。実行時エラーをトラップした後に Resume ステートメントを使用してプロシージャを継続すると、割り込みは無視されます。

また、EnableCancelKey プロパティを xlDisabled に設定して、ユーザーによる割り込みを完全に無視することもできます。この状態では、実行中のプロシージャをユーザーが中断しようとしても常に無視されます。デフォルトの割り込み処理に戻すには、EnableCancelKey プロパティを xlInterrupt に変更します。プロシージャに対するユーザーの割り込みが恒久的に無効になることがないように、Microsoft Excel では、プロシージャの実行が完了するたびに EnableCancelKey プロパティのデフォルトの設定が xlInterrupt に戻されます。コード内で割り込みが正しく処理されるようにするには、プロシージャを実行するたびに割り込みを明示的に無効にするか、トラップする必要があります。1 つのプロシージャでは割り込みハンドラを 1 つしか使用できないため、そのプロシージャで発生するすべての実行時エラーに同じハンドラが使用される点に注意してください。

次のサンプルは、処理が完了するまでに長い時間がかかります。ユーザーがプロシージャを中断しようとすると、エラーがトラップされます。このとき、プロシージャを実際に一時停止するかどうかの確認が行われた後、適切な方法でプロシージャが終了します。
   Sub ProcessData()
      'Set up a user interrupt trapping as a run-time error
      On Error GoTo UserInterrupt
      Application.EnableCancelKey = xlErrorHandler

      'Start a long duration task
      For x = 1 to 1000000
         For y = 1 to 10
         Next y
      Next x

      Exit Sub
   UserInterrupt:
      If Err = 18 Then
         If MsgBox ("Stop processing records?", vbYesNo) = vbNo Then
            'Continue running at the point procedure was interrupted
            Resume
         Else
            'Handle other errors that occur
            MsgBox Error(Err)
         End If
      End If
   End Sub
				
ProcessData マクロを実行し、直ちに Ctrl + Break キーを押すと、レコードの処理を停止するかどうかを確認するメッセージ ボックスが表示されます。[はい] をクリックすると、"ユーザーによる割り込みが発生しました" という別のメッセージ ボックスが表示されます。このメッセージ ボックスで [OK] をクリックすると、マクロが終了します。最初のメッセージ ボックスで [いいえ] をクリックすると、マクロの処理が継続されます。

Resume ステートメント

Resume ステートメントは、エラー処理ルーチンの完了後にコードの実行を再開するために使用します。

関連情報

Excel 97

マクロ エラーのトラップの詳細を参照するには、Microsoft Excel 97 Visual Basic ヘルプの [キーワード] タブで次のテキストを入力します。
トラップできるエラー
選択されたテキストをダブルクリックして、「トラップできるエラー」の内容を表示します。

Excel 7.0

マクロ エラーのトラップの詳細を参照するには、Microsoft Excel 7.0 Visual Basic ヘルプの [キーワード] タブで次のテキストを入力します。
エラーをトラップする
選択されたテキストをダブルクリックして、「エラーをトラップする」の内容を表示します。

Excel 5.0

バージョン 5 の『Visual Basic User's Guide』の「Chapter 9 Handling Errors and Error Values」で、以下のトピックを参照してください。
  • Preventing Your Code From Halting or Acting Unpredictably
  • Creating Error Values That Don't Interrupt Your Code
  • Using the Built-in Error Values of Microsoft Excel
  • Advanced Error-Handling Techniques

関連情報

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 146864 (最終更新日 2005-08-17) を基に作成したものです。

この資料に含まれているサンプル コード/プログラムは英語版を前提に書かれたものをありのままに記述しており、日本語環境での動作は確認されておりません。

プロパティ

文書番号: 146864 - 最終更新日: 2011年9月19日 - リビジョン: 3.0
キーワード:?
kbhowto kbprogramming kbdtacode kbfaq KB146864
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com