はじめに
VBAを使用していると、初心者から上級者まで誰もが一度はエラーに直面したことがあるでしょう。
VBAでよく発生するエラーを何回かに分けて一覧化し、それぞれの原因と具体的な対処法を解説します。
本記事は4回目。
実行時エラー ’91’: オブジェクト変数またはWithブロック変数が設定されていません
主な原因と例
1. オブジェクト変数が未設定
Set
ステートメントでオブジェクトを初期化しないまま使用した場合。
例: ワークシートオブジェクトの未初期化
Sub Example1()
Dim ws As Worksheet
ws.Range("A1").Value = "Test" ' 未初期化のオブジェクト → エラー
End Sub
- 原因:
ws
にWorksheets
オブジェクトをセットしていない。 - 対処:
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
エラーを防ぐ方法
- オブジェクト変数を適切に初期化
- 必ず
Set
ステートメントを使用してオブジェクトを初期化します。
- 必ず
Sub InitializeObject()
Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
ws.Range("A1").Value = "Initialized"
End Sub
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
- Withブロックの前に初期化
With
ブロックを使用する前に、オブジェクトが適切に設定されていることを確認します。
Sub WithInitialization()
Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
With ws
.Range("A1").Value = "With Block Initialized"
End With
End Sub
- エラー処理を追加
- 万一のエラーに備えてエラー処理を組み込みます。
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
チェックを行うことが重要です。また、エラー処理を導入することで、発生時に原因を特定しやすくなります。
コメント