エラーメッセージ「実行時エラー ’91’: オブジェクト変数またはWithブロック変数が設定されていません」の原因と解決方法を紹介します!

目次
よくある原因パターン
原因のパターン | 説明 |
---|---|
1. Set を使っていない | オブジェクト変数(例:Range、Workbookなど)を正しく初期化していない |
2. Find の戻り値が Nothing | 検索結果が見つからなかったのに .Address などを呼び出している |
3. With ブロック内が空 | With で使うオブジェクトが未設定(Nothing) |
4. オブジェクトが未取得 | Workbooks.Open に失敗していたのに変数にアクセスしている |
原因①Setを使っていない
NGコード例(Set し忘れ)
Sub Example1()
Dim ws As Worksheet
ws.Name = "シート1" ' ← ここでエラー
End Sub
ws はオブジェクト型なのに、中身が設定されていない(Nothing)ためエラーになります。
OKコード例(Set を使う)
Sub Example1()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("シート1")
ws.Name = "シート1" ' 正常に動作
End Sub
原因②Finfの戻り値が Nothing
NGコード例(FindでNothingを確認せずアクセス)
Sub Example1()
Dim rng As Range
Set rng = Cells.Find("商品名")
MsgBox rng.Address ' 見つからなければここでエラー
End Sub
OKコード例(Find結果をチェックする)
Sub Example1()
Dim rng As Range
Set rng = Cells.Find("商品名")
If Not rng Is Nothing Then
MsgBox rng.Address
Else
MsgBox "見つかりませんでした"
End If
End Sub
原因③With ブロック内が空
NGコード例(ブロック内のオブジェクトが未設定)
Sub Example1()
Dim rng As Range
With rng
.Value = "テスト" ' ← ここでエラー '91' が発生
End With
End Sub
rng には何も代入されていないため、With rngは Nothing に対して操作しようとして失敗します。
OKコード例(オブジェクトを設定)
Sub Example1()
Dim rng As Range
Set rng = Range("A1") ' オブジェクトを正しく設定
With rng
.Value = "テスト" ' 正常に動作
End With
End Sub
With を使う前に必ずSet でオブジェクトを初期化しましょう。
原因④オブジェクトが未取得
NGコード例(ファイルやオブジェクトが取得できなかったのにアクセスしている)
Sub Example1()
Dim wb As Workbook
Set wb = Workbooks.Open("C:\存在しないファイル.xlsx")
Debug.Print wb.Name ' ← ファイルが開けなければここでエラー
End Sub
Workbooks.Open が失敗して Nothing が返っているため、.Name にアクセスするとエラー ’91’。
OKコード例(Is Nothingで取得できたかチェック)
Sub Example1()
Dim wb As Workbook
On Error Resume Next
Set wb = Workbooks.Open("C:\存在しないファイル.xlsx")
On Error GoTo 0
If wb Is Nothing Then
MsgBox "ファイルが開けませんでした。"
Else
Debug.Print wb.Name ' 正常に動作
End If
End Sub
ファイルが開けるかどうか不確定なときは Is Nothing で必ずチェックしましょう。
補足:Nothing チェックの基本パターン
If オブジェクト Is Nothing Then
' 未設定・失敗時の処理
Else
' 正常に処理を続ける
End If
このパターンを覚えておくだけで、実行時エラー ’91’ はほぼ回避できます。