On Errorステートメント
<< エクセルVBAのIE制御に利用したステートメント一覧(VBAのIE制御入門) :前の記事
<< エクセルVBAのプログラムの制御構文(VBAの初心者入門) :前の記事
こちらでは、VBAのIE(InternetExplorer)操作に利用されたOn Errorステートメントの解説になります。On Errorステートメントは、エラー処理ルーチンを有効にし、プロシージャ内でのエラー処理ルーチンの位置を指定するステートメントです。
また、ステートメントとは「命令文」と訳されるようにコンピュータに具体的な動作を指定する最小単位のプログラムです。主にマクロの挙動を制御する構文や文法を指します。通常は1行で完結する部分を指しますが、If~Thenなど複数行にまたがる部分を意味することもあります。
目次
On Errorステートメントとは
On Errorステートメントは、エラー処理ルーチンを有効にし、プロシージャ内でのエラー処理ルーチンの位置を指定するステートメントです。
On Error 行ラベル
処理
行ラベル:
処理
構文 | On Error GoTo line On Error Resume Next On Error GoTo 0 | |
---|---|---|
キーワード | 省略 | 説明 |
line | × | こちらは必須キーワードです。引数 line に指定した行から始まるエラー処理ルーチンを有効にします。引数 line は必ず指定します。引数 line には任意の行ラベルまたは行番号を指定します。実行時エラーが生成されると、ここで設定したエラー処理ルーチンにプログラムの制御が移り、エラー処理ルーチンがアクティブになります。引数 line に指定する行は、On Error ステートメントと同じプロシージャ内に存在しなければなりません。この制限に従わなければ、コンパイル時エラーが発生します。 |
On Error ステートメントを使用していない場合に実行時エラーが発生すると、そのエラーは致命的エラーになり、エラー メッセージが表示されてプログラムの実行が停止します。
"使用可能な" エラー処理ルーチンとは、On Error ステートメントによって有効になっている処理ルーチンのことです。"アクティブな" エラー処理ルーチンとは、エラー処理中の使用可能な処理ルーチンのことです。エラー処理ルーチンがアクティブになっている間 (エラーの発生と Resume、Exit Sub、Exit 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 Resume Next ステートメントを実行する必要があります。
他のオブジェクトを操作しているときに発生したエラーを処理する場合は、On Error GoTo ステートメントよりも On Error Resume Next 構造の方が適しています。オブジェクトとの各やり取りの後で Err オブジェクトを調べることにより、どのオブジェクトをコードで操作したのかどうかを確認します。Err オブジェクトの Number プロパティにエラー コードを設定したオブジェクト、および最初にエラーを発生させたオブジェクトを Err オブジェクトの Source プロパティで調べることができます。
On Error GoTo 0 ステートメントは、現在のプロシージャ内のエラー処理を無効にします。プロシージャに番号が 0 の行が含まれていても、その行はエラー処理コードの先頭として指定されません。On Error GoTo 0 ステートメントを指定していない場合、エラー処理ルーチンはプロシージャの終了時に自動的に無効になります。
エラーの発生時以外にエラー処理コードが実行されないようにするには、そのエラー処理ルーチンの直前に Exit Sub、Exit 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
ダイナミック リンク ライブラリ (DLL)または Macintosh のコード リソースを呼び出しているときに発生するエラーは、Visual Basic のエラー トラップではトラップされません。DLL 関数を呼び出す場合、各関数の戻り値を API の仕様を基に確認し、処理が完了したかどうか、または失敗したかどうかを判断します。次に、エラーが発生したイベントで Err オブジェクトの LastDLLError プロパティの値を確認します。Macintosh では、LastDLLError プロパティは、常に 0 の値を返します。
On Error Resume Nex
実行時エラーが発生してもプログラムを中断せず、エラーが発生したステートメントの次のステートメントから実行を継続します。オブジェクトを操作する場合は、On Error GoTo ステートメントではなく、このステートメントを使ってください。
On Error GoTo 0
現在のプロシージャに含まれる使用可能なエラー処理ルーチンを無効にします。
On Error ステートメントの分岐先は、同じプロシージャ内だけで、他のプロシージャには分岐することはできませんのでご注意ください。
On Errorステートメントのサンプルコード
Sub sample()
MsgBox "1回目のメッセージボックスです。"
MsgBox "2回目のメッセージボックスです。"
On Error label01
MsgBox "3回目のメッセージボックスです。"
MsgBox "4回目のメッセージボックスです。"
label01:
MsgBox "5回目のメッセージボックスです。"
End Sub
実行結果
解説
sampleのSubステートメントは引数設定はされていません。処理の内容を確認するとMsgBox関数でメッセージを順に表示させているだけですが、途中にOn Errorステートメントで「label01」の行ラベルを設定しています。これにより「label01:」まで処理をジャンプさせています。
通常の処理であれば5つのMsgBox関数の処理が実行されますが、On Errorステートメントにより3つだけしか処理されていないのを確認してください。
On Error ステートメントを多用するとプログラムの可読性が落ちバグが発生する可能性が高くなります。できる限り構造化された制御ステートメント(If~Then~Else文、For~Next文、Select Case文、Do~Loop文)を利用するようにしましょう。
エクセルVBAのプログラム制御構文一覧
次の記事: エクセルVBAのデバッグについて >>
近田 伸矢, 植木 悠二, 上田 寛
IEのデータ収集&自動操作のプログラミング本はこの1冊だけ!IEの起動やポップアップウィンドウ、表示を制御する基本的なコードはもちろん、テキストボックスやラジオボタン、表、ハイパーリンクなどのHTML部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。