Microsoft Excel VBA のエラー ステートメントについて
Excel VBA は、さまざまな機能と機能を開発者に提供します。 この記事では、VBA の On Error
ステートメントについて学習します。
VBA の On Error
ステートメントとは
VBA の On Error
ステートメントは、エラーが発生した場合に次に何をすべきかをコンパイラに指示するために使用されます。 これは、VBA コードでエラー処理を実行する方法です。
エラー処理は、エラーが発生する前にエラーを予測して解決するプロセスです。 これは通常、コードの実行中に発生する実行時エラーに対して行われます。たとえば、存在しない Excel のブックを参照する場合などです。
このようなエラーは例外をスローし、コードの実行を停止します。 したがって、これを回避するには、エラーを生成する可能性のあるコードを予測し、それらに対して適切なエラー処理を実行する必要があります。
Excel VBA で例外を処理する簡単な方法の 1つは、On Error
ステートメントを使用することです。 VBA には、次の構文を持つ 3 種類の On Error
ステートメントがあります。
On Error GoTo 0
On Error Goto <label>
On Error Resume Next
それらを1つずつ説明しましょう。
On Error Goto 0
On Error Goto 0
ステートメントは、例外が発生したときに VBA の既定のアクションを使用して標準のエラー メッセージを表示するため、エラー処理が行われていないようなものです。 エラー メッセージには、ランタイム エラーのタイプと名前、および関連する番号が表示されます。
また、コードで次に何をすべきかについて、ユーザーにいくつかのオプションを提供します。 これらのオプションは次のとおりです。
続行
: このオプションを押すと、エラーを無視してコードを続行します。 ただし、毎回そうするのは不可能であり、実行を継続できない場合、オプションはグレー表示され、非対話型になります。End
: このオプションは、プログラムを終了し、実行を終了します。デバッグ
: このオプションは、コードをデバッグしてエラーの原因を見つけて解決するのに役立ちます。 これを押すと、プログラムは例外が発生した行からデバッグ モードに移行します。ヘルプ
: このオプションは、例外に関する情報を提供する Microsoft の公式ヘルプ ページにユーザーを誘導します。
Book1.xlsx
がアクティブなワークブック リストに存在しない場合、エラーが発生する次のコードを実行してみましょう。
Sub ExampleGoto0()
On Error GoTo 0
Workbooks("Book1.xlsx").SaveAs
End Sub
エラーの場合、次のメッセージ ボックスが表示されます。
On Error Goto <ラベル>
On Error Goto <label>
ステートメントは、例外が発生したときにコード内の特定の行に移動するようコンパイラーに指示することにより、エラー処理と Goto
ステートメントを組み合わせます。
行は、行番号またはラベルによって指定されます。 エラーが発生すると、プログラム制御はラベルが続く行に移され、その間に書かれたコードはスキップされます。
ラベルは、次の構文を使用して VBA で宣言されます。
labelname:
注:
Goto
ステートメントで指定された行またはラベルは、On Error Goto
ステートメントと同じプロシージャ内にある必要があります。そうしないと、コンパイル時エラーが生成されます。
エラー時にラベルを使用して特定の行に移動する方法を見てみましょう。
Sub ExampleGotoLabel()
On Error GoTo errorhandler
Workbooks("Book1.xlsm").SaveAs
MsgBox "This line will not be executed"
Exit Sub
errorhandler:
Range("A1") = "Error handled"
End Sub
注: ラベルの直後に
Exit Sub
コマンドを使用して、ラベルの後の行がエラーがなくても毎回実行されるのを防ぐ必要があります。
On Error Resume Next
On Error Resume Next
ステートメントは、エラーが発生した行をスキップし、次の行から実行を継続します。 このステートメントはエラーを処理したり解決したりしないことに注意してください。 むしろ、コード内に存在しないかのように、誤ったステートメントを無視します。
したがって、On Error Resume Next
ステートメントは、正しく実装されていないと非常に扱いにくいものになる可能性があります。 これは、変数の初期化など、実行されるコードに不可欠な行をスキップする可能性があるためです。
このような状況に対処するために、すべての例外を追跡する Err
オブジェクトの Err.Number
プロパティを使用します。
例外が発生すると、Err.Number
に何らかの値が割り当てられます。 それ以外の場合、0
に設定されます。 この情報は、例外を追跡し、それに応じてエラー処理を実行できます。
注: オブジェクトを操作する場合は、
On Error Goto
の代わりにOn Error Resume Next
ステートメントを使用することをお勧めします。
次のコードを見てみましょう。存在しないブックを保存しようとすると、例外がスローされます。 On Error Resume Next
ステートメントにより、誤ったステートメントは無視されます。
Sub ExampleResumeNext1()
On Error Resume Next
Workbooks("Book1.xlsx").Save
Range("A1") = "Error skipped"
End Sub
次に、Err.Number
プロパティを使用して、コード行をスキップすることが有害な状況を処理する方法を示す別の例を見てみましょう。
Sub ExampleResumeNext2()
On Error Resume Next
N = 1 / 0 ' This line will cause an exception because of division by zero
If Err.Number <> 0 Then
N = 1 ' Some default value of N, so that it is not used uninitialized in the following lines
End If
For i = 1 To N
Range("A1") = i
Next i
End Sub
まとめ
これは、Microsoft Office ユーザーの貴重な時間を節約する便利なプログラミング言語である VBA の On Error
ステートメントに関する議論を要約したものです。 On Error
ステートメントがエラー処理に使用されるさまざまな方法を学習していただければ幸いです。
Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!
GitHub