目標
VBAのいろいろなエラー処理の方法を理解して利用できる
VBA エラー処理の概要と利用方法の復習
VBA エラー処理の概要と利用方法の復習
VBA いろいろなエラー処理 作業シートの準備
シートの準備
エラー処理のプログラムを動かすために次のようなシートを準備します。
VBA エラー処理のいろいろな利用方法
On Error GoTo 0ステートメント
On Error GoTo 0ステートメントとは
「On Error Resume Nextステートメント」では記述後の処理全てがエラートラップの有効範囲となりました。「On Error GoTo 0ステートメント」を利用すると「On Error Resume Nextステートメント」で有効にしたエラートラップを途中で無効にすることができます。
「On Error Resume Nextステートメント」と「On Error GoTo 0ステートメント」を利用することでプロシージャ内の処理の一部のみをエラートラップの有効範囲にすることができます。
On Error GoTo 0ステートメントの利用方法
「On Error Resume Nextステートメント」を「エラートラップ」を「有効」にしたい処理の前に記述し、「On Error GoTo 0ステートメント」を「エラートラップ」を「無効」にしいたい処理の直前(エラートラップの終了位置)に記述します。次のように記述すると「処理3」と「処理4」がエラートラップの有効範囲となります。
Sub プロシージャ()
処理1
処理2
On Error Resume Next
処理3
処理4
On Error GoTo 0
処理5
End Sub
サンプルプロシージャ1
Sub exampleError()
Dim item As Long
Dim empColumns As Range
Dim hitEmp As Range
Set empColumns = Range(Cells(2, 1), Range("A1").End(xlDown))
On Error Resume Next
item = InputBox("検索する社員の社員番号を入力してください。")
If Err.Number = 13 Then
MsgBox "正しい値を入力してください"
End If
Set hitEmp = empColumns.Find(item, LookAt:=xlWhole)
MsgBox Cells(hitEmp.Row, hitEmp.Column + 1).Value
On Error GoTo 0
MsgBox "検索を終了します。"
End Sub
実行結果
On Error GoTo ステートメント
On Error GoTo ステートメントとは
エラー発生時に別の処理を行わせることができるステートメントです。「On Error Resume Nextステートメント」ではエラーが発生した場合はその後の処理をエラートラッの有効範囲として、これが無効になるまでの処理は無視されていました。
「On Error GoTo ステートメント」を利用するとエラーが起きた時に、任意の別の処理に移行させる事が可能になります。これによって、エラーの時にはエラー専用の別の処理を行わせることが可能となります。
On Error GoTo ステートメントの利用方法
「On Error GoTo ステートメント」の利用方法は、「On Error GoTo ラベル名」として「エラーが起こる処理の直前」に記述します。「On Error GoTo ラベル名」の後が「エラートラップの有効範囲」となります。「エラートラップの終了」には「Exit Sub」を利用します。
エラーが起きた時は「On Error GoTo」の後に記述した「ラベル名」を利用して処理を外へ飛ばすことができます。
On Error GoTo ステートメントの構文
Sub プロシージャ()
処理1
処理2
On Error GoTo sampleLabel
処理3
処理4
Exit Sub
sampleLabel:(ここのことを行ラベルという)
処理5(ここのことをエラー処理ルーチンという)
End Sub
サンプルプロシージャ2
Sub exampleError()
Dim item As Long
Dim empColumns As Range
Dim hitEmp As Range
Set empColumns = Range(Cells(2, 1), Range("A1").End(xlDown))
On Error GoTo sampleLabel
item = InputBox("検索する社員の社員番号を入力してください。")
If Err.Number = 13 Then
MsgBox "正しい値を入力してください"
End If
Set hitEmp = empColumns.Find(item, LookAt:=xlWhole)
MsgBox Cells(hitEmp.Row, hitEmp.Column + 1).Value
Exit Sub
sampleLabel:
MsgBox "検索を終了します。"
End Sub
実行結果
Resumeステートメント
Resumeステートメントとは
エラー処理が発生したときに処理をエラートラップ開始地点に戻して処理を繰り返すことを可能にしてくれるステートメントです。
Resumeステートメントの利用方法
「On Error GoTo ステートメント」の行ラベル内に「Resumeステートメント」を記述します。
Sub プロシージャ()
処理1
処理2
On Error GoTo sampleLabel
処理3
処理4
Exit Sub
sampleLabel:(ここのことを行ラベルという)
処理5(ここのことをエラー処理ルーチンという)
Resume(処理が処理3へ戻ります。)
End Sub
サンプルプロシージャ3
Sub exampleError()
Dim item As Long
Dim empColumns As Range
Dim hitEmp As Range
Set empColumns = Range(Cells(2, 1), Range("A1").End(xlDown))
On Error GoTo sampleLabel
item = InputBox("検索する社員の社員番号を入力してください。")
If Err.Number = 13 Then
MsgBox "正しい値を入力してください"
End If
Set hitEmp = empColumns.Find(item, LookAt:=xlWhole)
MsgBox Cells(hitEmp.Row, hitEmp.Column + 1).Value
Exit Sub
sampleLabel:
MsgBox "再検索をします。"
Resume
End Sub
実行結果
複数のOn Error GoToステートメントの利用方法
On Error GoToステートメントはエラーが起こる場所ごとにエラー処理を設けることができます。次のプロシージャでは二ヶ所のエラー処理を設けています。
Sub プロシージャ()
処理1
処理2
On Error GoTo sampleLabel1
処理3
On Error GoTo sampleLabel2
処理4
Exit Sub
sampleLabel1:
処理5
Resume
sampleLabel2:
処理6
End Sub
サンプルプロシージャ4
Sub exampleError()
Dim item As Long
Dim empColumns As Range
Dim hitEmp As Range
Set empColumns = Range(Cells(2, 1), Range("A1").End(xlDown))
On Error GoTo sampleLabel1
item = InputBox("検索する社員の社員番号を入力してください。")
On Error GoTo sampleLabel2
Set hitEmp = empColumns.Find(item, LookAt:=xlWhole)
MsgBox Cells(hitEmp.Row, hitEmp.Column + 1).Value
Exit Sub
sampleLabel1:
MsgBox "再検索をします。"
Resume
sampleLabel2:
MsgBox "該当する社員番号はありません。"
End Sub
実行結果
左はエラーが起こらない場合、右はひとつ目のエラートラップでエラーが発生した場合です。
次はふたつ目のエラートラップでエラーが発生している場合の動きです。
Resume Nextステートメント
Resume Nextステートメントとは
エラー処理が発生すると、これまでと同様に処理が行ラベルに移動します。その後、Resume Nextステートメントで現在の行ラベルに該当するステートメントの次の処理へ処理を移してくれるステートメントです。
Resume Nextステートメントの利用方法
「On Error GoTo ステートメント」の行ラベル内にResume Nextステートメントを記述します。
Sub プロシージャ()
処理1
処理2
On Error GoTo sampleLabel1
処理3
On Error GoTo sampleLabel2
処理4
Exit Sub
sampleLabel1:
処理5
Resume Next(最初のエラートラップではなく次のエラートラップに戻ります。)
sampleLabel2:
処理6
End Sub
サンプルプロシージャ5
Sub exampleError()
Dim item As Long
Dim empColumns As Range
Dim hitEmp As Range
Set empColumns = Range(Cells(2, 1), Range("A1").End(xlDown))
On Error GoTo sampleLabel1
item = InputBox("検索する社員の社員番号を入力してください。")
On Error GoTo sampleLabel2
Set hitEmp = empColumns.Find(item, LookAt:=xlWhole)
MsgBox Cells(hitEmp.Row, hitEmp.Column + 1).Value
Exit Sub
sampleLabel1:
MsgBox "6桁の数値で指定してください。"
Resume Next
sampleLabel2:
MsgBox "該当する社員番号はありません。"
End Sub
実行結果
左はエラーが起こらない場合、右はひとつ目のエラートラップでエラーが発生した場合です。Resume Nextによってふたつ目のエラートラップに処理が戻されます。
今回は以上となります。
ブックマークのすすめ
「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。