エラーステートメントに関するVBA | エラーを処理するための上位3つの方法

エラーステートメントのExcelVBA

VBA On Errorステートメントは、エラー処理メカニズムの一種であり、何らかのタイプのエラーが発生した場合にコードが何をするかをガイドするために使用されます。通常、コードでエラーが発生すると実行は停止しますが、コード内のこのステートメントを使用すると、エラーが発生したときに実行する一連の命令があるため、コードは続行されます。

コードのエラーを予測することで、VBAコーディングのプロになります。何らかの方法でコードに自信があり、エラーが発生する可能性がある場合でも、コードを100%効率的にすることはできません。

あらゆる種類のエラーを特定して処理することはほとんど不可能な作業ですが、VBAでエラーを処理する方法はさまざまです。コードを書いている間、エラーコードの種類がスローされるとは思わないかもしれませんが、エラーが発生した場合は、コード自体を書くよりもデバッグに多くの時間を費やすことになります。

エラーとは何ですか?

エラーは、機能または間違ったコードのためにコード行を実行できないことに他なりません。したがって、エラーを予測して処理するようにしてください。

たとえば、そこにないシートを削除しようとすると、明らかにそのコード行を実行できません。

エラーには3つのタイプがあり、1つは宣言されていない変数によるコンパイル済みエラーです。2つ目は、コーダーによる誤った入力によるデータ入力エラーであり、3つ目は、VBAがコード行を認識できないことによる実行時エラーです。そこにないワークシートまたはワークブックにアクセスしたり、作業したりするため。

ただし、VBAには、これらすべての種類のエラーを処理するためのステートメント、つまり「エラー時」ステートメントがあります。

エラーステートメントの種類

VBAでエラーを処理する際の重要なポイントは、「OnError」ステートメントです。たとえば、エラーが発生した場合、「次の行を再開」、「別の行に移動またはジャンプ」など…

On Errorステートメントには、3種類のステートメントがあります。

  1. GoTo 0 は、実行時エラーが発生するたびにExcelまたはVBAが発生したエラーの種類を示すエラーメッセージボックスを表示する必要があることを意味します。VBAがコードを実行するとすぐに、コード上のその特定のブロック内のすべてのエラーハンドラーが無効になります。
  2. [次再開]は、エラーが発生するたびに、このステートメントがExcelにそのエラーを無視し、エラーメッセージを表示せずに次のコード行に進む(次を再開する)ように指示することを意味します。エラーを修正するという意味ではなく、エラーを無視するだけです。
  3. GoTo [label]は、VBAでエラーが発生するたびに、割り当てられたラベルに移動することを意味します。これにより、コードはコーダーによって提供された特定の行にジャンプします。

VBAでエラーを処理するためのトップ3の方法

このVBAOn Errorテンプレートはここからダウンロードできます– VBA On Error Template

#1-エラー時に次を再開

20の値を0で除算し、除算の結果を割り当てる変数を宣言したとします。

コード:

 Sub OnError_Example1()Dim i As Integer i = 20/0 End Sub 

このコードを実行すると、以下のエラーがスローされます。

したがって、数値をゼロ値で除算することはできません。実行時エラー数は11、つまりゼロ除算です。

次に、コードにもう1行追加します。

コード:

 Sub OnError_Example1()Dim i As Integer、j As Integer i = 20/0 j = 20/2 End Sub 

次に、「エラー時に再開」というステートメントを上部に追加します。

コード:

 Sub OnError_Example1()Dim i As Integer、j As Integer On Error Resume Next i = 20/0 j = 20/2 End Sub 

このコードを実行してもエラーメッセージは表示されず、次のコード行、つまりj = 20/2が実行されます。

#2 –エラー時のGoToラベル

私は3つの変数を宣言しました。

コード:

 Sub OnError_Example1() Dim i As Integer , j As Integer , k As Integer 

For all these three variables I will assign division calculation.

Code:

 Sub OnError_Example1() Dim i As Integer , j As Integer , k As Integer i = 20 / 0 j = 20 / 2 k = 10 / 5

The result of all these three calculations will be shown in the message box.

Code:

 Sub OnError_Example1() Dim i As Integer , j As Integer , k As Integer i = 20 / 0 j = 20 / 2 k = 10 / 5 MsgBox "The value of i is " & i & vbNewLine & "The value of j is " & j & _ vbNewLine & "The value of k is " & k & vbNewLine End Sub 

Now I will try to execute this code since the calculation of “I” is not proper we will get run time error 11.

Now I will add the “On Error Resume Next” statement.

Code:

 Sub OnError_Example1() Dim i As Integer , j As Integer , k As Integer On Error Resume Next i = 20 / 0 j = 20 / 2 k = 10 / 5 MsgBox "The value of i is " & i & vbNewLine & "The value of j is " & j & _ vbNewLine & "The value of k is " & k & vbNewLine End Sub 

If I execute this it will skip “I” calculation and execute the remaining two calculations and the result is as follows.

Now instead of “On Error Resume Next” I will add “On Error GoTo KCalculation”

Code:

 Sub OnError_Example1() Dim i As Integer , j As Integer , k As Integer On Error GoTo KCalculation: i = 20 / 0 j = 20 / 2 KCalculation: k = 10 / 5 MsgBox "The value of i is " & i & vbNewLine & "The value of j is " & j & _ vbNewLine & "The value of k is " & k & vbNewLine End Sub 

Note: Here “KCalculation” is the label name I had given, you can give your own label name without any space.

Now if I execute this line of code it will not jump to the next line rather it will jump to the label name I have entered i.e. “KCalcualtion”. Here it will ignore the error given by “I” and also it will not execute “j” calculation but straight away it jumps to “KCalcualtion”.

#3 – Print Error Number in VBA

At the end of the code, we can also print the error number in a separate message box. The following line of code will do this job.

Code:

Err.Number

Now I will run this code first message box will show the calculation results.

Click on OK, it will show one more message box to show the error number.

We go 11 as the result i.e. Division by Zero.

We can also get the error description instead of the number. We just need to change the code, below is the code.

Code:

Err.Description

It will show a description like this.

Things to Remember

  • After entering “On Error Resume Next” at the end of code don’t forget to add the statement “On Error GoTo 0”
  • The label name should be the same in both places.
  • Label names need not be defined well in advance.
  • In the end, always see what was the error occurred through the separate message box.