【VBA】実行時エラー ’91’ 原因&対処法

VBA

はじめに

VBAを使用していると、初心者から上級者まで誰もが一度はエラーに直面したことがあるでしょう。

VBAでよく発生するエラーを何回かに分けて一覧化し、それぞれの原因と具体的な対処法を解説します。

本記事は4回目。

実行時エラー ’91’: オブジェクト変数またはWithブロック変数が設定されていません

主な原因と例

1. オブジェクト変数が未設定

Setステートメントでオブジェクトを初期化しないまま使用した場合。

例: ワークシートオブジェクトの未初期化

Sub Example1()
    Dim ws As Worksheet
    ws.Range("A1").Value = "Test" ' 未初期化のオブジェクト → エラー
End Sub
  • 原因: wsWorksheetsオブジェクトをセットしていない。
  • 対処: Setを使ってオブジェクトを初期化します。
Sub FixedExample1()
    Dim ws As Worksheet
    Set ws = Worksheets("Sheet1")
    ws.Range("A1").Value = "Test"
End Sub

2. Findメソッドの結果がNothing

Range.Findメソッドが一致するセルを見つけられなかった場合にエラーが発生します。

Sub Example2()
    Dim foundCell As Range
    Set foundCell = Worksheets("Sheet1").Cells.Find("NonExistentValue")
    MsgBox foundCell.Address ' Nothingへのアクセス → エラー
End Sub
  • 原因: Findの結果がNothingであるにも関わらず、アクセスしようとしています。
  • 対処: 結果がNothingかどうかを確認します。
Sub FixedExample2()
    Dim foundCell As Range
    Set foundCell = Worksheets("Sheet1").Cells.Find("NonExistentValue")
    If Not foundCell Is Nothing Then
        MsgBox foundCell.Address
    Else
        MsgBox "値が見つかりませんでした。"
    End If
End Sub

3. Withブロック内のオブジェクトが無効

Withブロックで指定したオブジェクトが正しく設定されていない場合。

Sub Example3()
    Dim ws As Worksheet
    With ws
        .Range("A1").Value = "Test" ' 未初期化のオブジェクト → エラー
    End With
End Sub
  • 原因: wsが初期化されていないため、Withブロック内の操作が無効です。
  • 対処: Setを使って初期化してから使用します。
Sub FixedExample3()
    Dim ws As Worksheet
    Set ws = Worksheets("Sheet1")
    With ws
        .Range("A1").Value = "Test"
    End With
End Sub

4. 未初期化のコレクションオブジェクト

コレクションオブジェクトを使用する場合も、初期化が必要です。

Sub Example4()
    Dim dict As Object
    dict.Add "Key1", "Value1" ' 未初期化の辞書オブジェクト → エラー
End Sub
  • 原因: dictにオブジェクトがセットされていない。
  • 対処: 初期化処理を追加します。
Sub FixedExample4()
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")
    dict.Add "Key1", "Value1"
End Sub

エラーを防ぐ方法

  1. オブジェクト変数を適切に初期化
    • 必ずSetステートメントを使用してオブジェクトを初期化します。
Sub InitializeObject()
    Dim ws As Worksheet
    Set ws = Worksheets("Sheet1")
    ws.Range("A1").Value = "Initialized"
End Sub
  1. Nothingチェックを徹底
    • オブジェクトがNothingでないことを確認してから操作します。
Sub CheckObject()
    Dim foundCell As Range
    Set foundCell = Worksheets("Sheet1").Cells.Find("Value")
    If Not foundCell Is Nothing Then
        MsgBox foundCell.Address
    Else
        MsgBox "対象が見つかりません。"
    End If
End Sub
  1. Withブロックの前に初期化
    • Withブロックを使用する前に、オブジェクトが適切に設定されていることを確認します。
Sub WithInitialization()
    Dim ws As Worksheet
    Set ws = Worksheets("Sheet1")
    With ws
        .Range("A1").Value = "With Block Initialized"
    End With
End Sub
  1. エラー処理を追加
    • 万一のエラーに備えてエラー処理を組み込みます。
Sub HandleError()
    On Error Resume Next
    Dim ws As Worksheet
    Set ws = Worksheets("NonExistentSheet")
    If ws Is Nothing Then
        MsgBox "シートが存在しません。"
        Exit Sub
    End If
    ws.Range("A1").Value = "Error Handled"
    On Error GoTo 0
End Sub

まとめ

「実行時エラー ’91’」は、オブジェクト変数の未初期化が主な原因です。解決するには、Setステートメントでオブジェクトを初期化し、操作前にNothingチェックを行うことが重要です。また、エラー処理を導入することで、発生時に原因を特定しやすくなります。

コメント

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