VBAの条件分岐とエラー処理(On Errorとの組み合わせ方)

VBAでは、If 文や Select Case 文を使った条件分岐に加えて、適切なエラー処理を組み合わせることで、より安定したプログラム を作成することができます。本記事では、On Error を活用したエラー処理と条件分岐の組み合わせ方について解説します。


1. エラー処理の基本 (On Error の使い方)

VBAでは、実行中にエラーが発生するとプログラムが停止してしまいます。そのため、On Error ステートメントを使い、適切なエラー処理を行うことが重要です。

(1) On Error Resume Next(エラーを無視して続行)

この方法では、エラーが発生してもプログラムを止めずに処理を続行できます。

On Error Resume Next
Dim x As Integer
x = 1 / 0 '0で割るエラーが発生するが、プログラムは停止しない
If Err.Number <> 0 Then
    MsgBox "エラー発生: " & Err.Description
    Err.Clear 'エラー情報をクリア
End If

⚠ 注意: On Error Resume Nextエラーを無視するため、原因を特定しにくくなる ことがあります。使用する際は、Err.Number を確認する処理を組み込むことを推奨します。


(2) On Error GoTo(エラーハンドラへジャンプ)

特定のエラーが発生した場合、指定したエラーハンドラへジャンプできます。

Sub TestErrorHandling()
    On Error GoTo ErrorHandler 'エラー時に ErrorHandler にジャンプ
    Dim x As Integer
    x = 1 / 0 '0で割るエラー
    Exit Sub  '正常終了時はエラーハンドラをスキップ

ErrorHandler:
    MsgBox "エラー発生: " & Err.Description
    Err.Clear 'エラーをクリア
End Sub

On Error GoTo は、エラー処理を明確にできるため、安全なエラー管理に適しています。


2. If 文と On Error の組み合わせ

If 文を使うことで、エラー発生時の処理をより柔軟に制御できます。

(1) エラーが発生した場合のみ処理を実行

On Error Resume Next
Dim result As Double
result = 1 / 0 'ここでエラーが発生
If Err.Number <> 0 Then
    MsgBox "エラー発生: " & Err.Description
    Err.Clear
Else
    MsgBox "計算結果: " & result
End If

Err.Number をチェックすることで、エラー時の処理を明確に制御できます。


(2) 条件分岐で特定のエラーを処理

特定のエラーに対して異なる処理を行うことも可能です。

On Error Resume Next
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("存在しないシート") 'シートが存在しないとエラー発生

If Err.Number = 9 Then '「インデックスが有効範囲外です」エラー
    MsgBox "指定されたシートが見つかりません"
ElseIf Err.Number <> 0 Then
    MsgBox "その他のエラー: " & Err.Description
End If
Err.Clear

If 文を活用すると、特定のエラーに対して適切な処理を実装できます。


3. Select Case 文と On Error の組み合わせ

エラーコードに応じた処理を分岐させたい場合、Select Case 文を使うと可読性が向上します。

On Error Resume Next
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("存在しないシート")

Select Case Err.Number
    Case 0
        MsgBox "シートが正常に取得されました"
    Case 9
        MsgBox "エラー: 指定されたシートが存在しません"
    Case Else
        MsgBox "その他のエラー: " & Err.Description
End Select
Err.Clear

Select Case を使用すると、エラー処理が整理されて見やすくなります。


4. Err.Raise を使ったカスタムエラー処理

エラー処理をより厳密に行いたい場合、自分でエラーを発生させることもできます。

Sub CustomErrorTest(ByVal value As Integer)
    If value = 0 Then
        Err.Raise Number:=9999, Description:="値が0のため、処理できません"
    End If
End Sub

Sub Test()
    On Error GoTo ErrorHandler
    CustomErrorTest 0
    Exit Sub

ErrorHandler:
    MsgBox "カスタムエラー発生: " & Err.Description
    Err.Clear
End Sub

Err.Raise を使用すると、独自のエラーメッセージを作成できるため、デバッグしやすくなります。


5. まとめ

VBAの条件分岐 (IfSelect Case) と On Error を組み合わせることで、エラーの発生を適切に処理し、より安定したプログラム を作成できます。

  • On Error Resume Nextエラーを無視する が、Err.Number のチェックが必要
  • On Error GoTo を使用すると 明確なエラー処理が可能
  • If 文と組み合わせることで 特定のエラーに応じた処理が可能
  • Select Case を使うと エラー処理の整理がしやすい
  • Err.Raise を使うと カスタムエラーを発生させることができる

適切なエラー処理を組み込むことで、VBAのコードをより堅牢にしましょう!

コメント

タイトルとURLをコピーしました