01-VBA

Excel VBA の エラー処理(Part.2)| 現役エンジニア&プログラミングスクール講師

目標

VBAのいろいろなエラー処理の方法を理解して利用できる

VBA エラー処理の概要と利用方法の復習

VBA エラー処理の概要と利用方法の復習

Excel VBA の エラー処理(Part.1)| 現役エンジニア&プログラミングスクール講師Excel VBA の2部構で書いています「エラー処理」の記事のうち最初の記事です。「エラー処理」「エラートラップ」「On Error Resume Nextステートメント」「Errオブジェクト」「Numberプロパティ」について取り上げています。...

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

エラートラップの有効範囲を「On Error Resume Nextステートメント」と「On Error GoTo 0ステートメント」で挟んで記述します。

サンプルプロシージャ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 Resume Nextステートメント」利用時にErrオブジェクトのNumberプロパティを利用し、エラー番号を取得して別の処理を行わせることを行いました。今回の「On Error GoToステートメント」ではエラー番号が分からなくてもエラーが起きたときに別の処理へ移すことが可能になります。

On Error GoTo ステートメントの利用方法

On Error GoTo ステートメント」の利用方法は、「On Error GoTo ラベル名」として「エラーが起こる処理の直前」に記述します。「On Error GoTo ラベル名」の後が「エラートラップの有効範囲」となります。「エラートラップの終了」には「Exit Sub」を利用します。

エラーが起きた時は「On Error GoTo」の後に記述した「ラベル名」を利用して処理を外へ飛ばすことができます。

これまでエラートラップの開始には「On Error Resume Nextステートメント」を利用してきましたが、ラベル先へ処理を飛ばすには「On Error GoTo ラベル名」のステートメントを利用します。

On Error GoTo ステートメントの構文

Sub プロシージャ()
処理1
処理2
On Error GoTo sampleLabel
処理3
処理4

Exit Sub
sampleLabel:(ここのことを行ラベルという)
処理5
(ここのことをエラー処理ルーチンという)
End Sub

「On Error GoTo ステートメント」では、次のにでてくる「Resumeステートメント」を一緒に利用することが多いので「Exit Sub」 を必ずつけるようにします。忘れてしまうと「Resumeステートメント」利用時に無限ループになってしまいます。

サンプルプロシージャ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

「On Error GoTo ラベル名」でエラー処理のプログラムを作成した場合、処理をラベル名の位置まで飛ばしてしまうので「Err.Number」を利用していても返されたエラー番号の処理は行われません。

実行結果

Resumeステートメント

Resumeステートメントとは

エラー処理が発生したときに処理をエラートラップ開始地点に戻して処理を繰り返すことを可能にしてくれるステートメントです。

Resumeステートメントの利用方法

「On Error GoTo ステートメント」の行ラベル内に「Resumeステートメント」を記述します。

Sub プロシージャ()
処理1
処理2
On Error GoTo sampleLabel
処理3
処理4

Exit Sub
sampleLabel:(ここのことを行ラベルという)
処理5
(ここのことをエラー処理ルーチンという)
Resume(処理が処理3へ戻ります。)

End Sub

Exit 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

エラー処理の間は「緑の矢印」のループを繰り返します。エラーがない場合は「水色の矢印」の通りに処理が行われます。(プロシージャ内にErr.Numberの取得を行っていますが、この部分は動きません。)

実行結果

複数の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」によって、ふたつ目のエラートラップへ処理が移動します。

実行結果

左はエラーが起こらない場合、右はひとつ目のエラートラップでエラーが発生した場合です。Resume Nextによってふたつ目のエラートラップに処理が戻されます。

今回は以上となります。

初心者も実践で通用!「VBA・VBS」おすすめ書籍5選 | 現役エンジニア&プログラミングスクール講師「VBA・VBS」初心者の方が実践業務の中でそれらを活用しt活躍できるために必要な知識を習得できる書籍を紹介しています。ページの下部には「おすすめのITスクール情報」「おすすめ求人サイト」について情報を掲載中。...

ブックマークのすすめ

「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。

「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】| 現役エンジニア&プログラミングスクール講師「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】について解説している記事です。削除方法も掲載しています。...
【パソコン選び】失敗しないための重要ポイント | 現役エンジニア&プログラミングスクール講師【パソコン選び】失敗しないための重要ポイントについての記事です。パソコンのタイプと購入時に検討すべき点・家電量販店で見かけるCPUの見方・購入者が必要とするメモリ容量・HDDとSSDについて・ディスプレイの種類・バッテリーの持ち時間や保証・Officeソフト・ウィルス対策ソフトについて書いています。...
RELATED POST
01-VBA

初心者のためのExcelVBAのオブジェクト | 現役エンジニア&プログラミングスクール講師

2022年8月8日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

印刷機能|Excel VBA (Part.1)【PageSetupプロパティ/PrintPreviewメソッド/PrintOutメソッド】編 | 現役エンジニア&プログラミングスクール講師

2022年12月5日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

VBScriptを利用したVBAプロシージャの呼び出し(Part.2)| 現役エンジニア&プログラミングスクール講師

2023年2月15日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

ExcelVBAの変数 (Part.1) 基本編 | 現役エンジニア&プログラミングスクール講師

2022年9月13日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

Excel VBA の 配列(サンプルプロシージャの利用)| 現役エンジニア&プログラミングスクール講師

2022年12月25日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

Excel VBA の イベント編(Part.1)3つのプロシージャ /引数のByVal(値渡し)とByRef(参照渡し)| 現役エンジニア&プログラミングスクール講師

2022年12月29日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site