Microsoft Excel VBA のエラー ステートメントについて

Bilal Shahid 2024年2月15日
  1. VBA の On Error ステートメントとは
  2. On Error Goto 0
  3. On Error Goto <ラベル>
  4. On Error Resume Next
  5. まとめ
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 ステートメントがあります。

  1. On Error GoTo 0
  2. On Error Goto <label>
  3. On Error Resume Next

それらを1つずつ説明しましょう。

On Error Goto 0

On Error Goto 0 ステートメントは、例外が発生したときに VBA の既定のアクションを使用して標準のエラー メッセージを表示するため、エラー処理が行われていないようなものです。 エラー メッセージには、ランタイム エラーのタイプと名前、および関連する番号が表示されます。

また、コードで次に何をすべきかについて、ユーザーにいくつかのオプションを提供します。 これらのオプションは次のとおりです。

  1. 続行: このオプションを押すと、エラーを無視してコードを続行します。 ただし、毎回そうするのは不可能であり、実行を継続できない場合、オプションはグレー表示され、非対話型になります。
  2. End: このオプションは、プログラムを終了し、実行を終了します。
  3. デバッグ: このオプションは、コードをデバッグしてエラーの原因を見つけて解決するのに役立ちます。 これを押すと、プログラムは例外が発生した行からデバッグ モードに移行します。
  4. ヘルプ: このオプションは、例外に関する情報を提供する 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 ステートメントがエラー処理に使用されるさまざまな方法を学習していただければ幸いです。

著者: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

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

関連記事 - VBA Error