10秒で解決する方法
おそらく Set キーワードを忘れているのが原因です。VBAでは、IntegerやStringのような標準的なデータ型は直接代入できますが、Range、Worksheet、Workbookなどのオブジェクトを変数に代入して初期化するには Set が必要です。これがないと、VBAは参照先のメモリアドレスを特定できません。
' 誤り - エラー 91 が発生します
Dim rng As Range
rng = Range("A1")
' 正解 - オブジェクトが正しくリンクされます
Dim rng As Range
Set rng = Range("A1")
.Find を使用している場合、このエラーは検索結果が空だったことを意味することがよくあります。結果を使用する前に、必ず値が Nothing でないか確認してください。
このエラーが発生する理由
オブジェクト変数をリモコンに例えてみましょう。リモコンを使うには、まず特定の機器とペアリングする必要があります。VBAのエラー 91は、まだ何もペアリングされていないリモコンのボタンを押そうとしたときに発生します。
技術的には、変数が Nothing を指している状態です。デフォルト値が 0 になる数値型とは異なり、オブジェクト変数は単なるポインタ(参照)です。そのポインタが有効なメモリアドレスに割り当てられていない場合、プロパティやメソッドを呼び出した瞬間にVBAは行き止まりに突き当たります。
以下のようなよくある落とし穴に注意してください:
- 「Set」の書き忘れ: 単純な等号(=)でオブジェクトを代入しようとしている。
- 見つからない検索結果:
Cells.Findが常にデータセット内で一致するものを見つけると仮定している。 - 変数のリセット: コードの途中でオブジェクトを
Nothingに設定した後、後でそれを呼び出そうとしている。 - 空の「With」ブロック:
MyObjectが作成される前にWith MyObjectを使用している。
一般的なシナリオの修正
1. 必須の「Set」キーワード
これは最も頻繁にある間違いです。変数が Range、Worksheet、Chart、またはカスタムクラスを表す場合、Set は必須です。オブジェクトを割り当てるたびに必ず使用してください。
Sub FixMissingSet()
Dim ws As Worksheet
' "Set" がないと、ここでエラー 91 が発生します
Set ws = ThisWorkbook.Sheets("Annual_Report_2024")
MsgBox ws.Name
End Sub
2. .Find による安全な検索
.Find メソッドは、クラッシュの典型的な原因です。検索語(例:「Invoice_999」)がシート内にない場合、Find は Nothing を返します。その直後に .Address にアクセスしようとすると、マクロは即座に失敗します。
Sub SafeFind()
Dim foundRng As Range
Dim targetValue As String
targetValue = "Missing_ID_5505"
Set foundRng = Cells.Find(What:=targetValue)
' 常に最初に検索結果を検証します
If Not foundRng Is Nothing Then
MsgBox "Found at: " & foundRng.Address
Else
MsgBox "Value " & targetValue & " was not found."
End If
End Sub
3. カスタムクラスのインスタンス化
カスタムクラスモジュールを使用する場合、変数を宣言するだけでは不十分です。メモリ内にそのクラスの新しいインスタンスを明示的に作成する必要があります。
Sub ClassExample()
Dim emp As clsEmployee
' エラー 91 を避けるために New キーワードを使用します
Set emp = New clsEmployee
emp.Name = "Jane Smith"
End Sub
スマートなデバッグ戦略
原因がすぐに見当たらない場合は、以下の組み込みツールを使用して初期化されていない変数を特定してください。
ローカルウィンドウを確認する
- VBAエディタで、表示 > ローカルウィンドウ をクリックします。
- F8 キーを押して、コードを1行ずつステップ実行します。
- 「値」列に注目してください。クラッシュする直前に
Nothingと表示されているオブジェクト変数がないか探します。
Option Explicit で変数を厳格に管理する
コードモジュールの最上部に Option Explicit を追加してください。これにより、すべての変数を宣言することが強制されます。単純なタイポ(打ち間違い)によって初期化されないままの「幽霊変数」が作成され、エラー 91 につながるのを防ぐことができます。
修正を確認する方法
コードが万全であることを確認するために、以下の3つのシナリオでテストしてください:
- 「検索結果ゼロ」テスト: 絶対に存在しない値で検索コードを実行します。エラーを出さずに終了する必要があります。
- 空のシートでのテスト: 新規の空のワークシートでマクロを試します。
UsedRangeなどの参照が問題を起こさないか確認してください。 - イミディエイトウィンドウでのクエリ: エラーが表示されたら「デバッグ」を押します。Ctrl+G を押し、
?VariableName Is Nothingと入力して Enter を押します。Trueが返ってくれば、それが犯人です。
まとめ表
シナリオ
間違い
修正方法
直接代入
`rng = Range("B2")`
`Set rng = ...` を使用する
検索失敗
`Find(...).Value`
`If Not ... Is Nothing` かどうかを確認する
手動リセット
`Set x = Nothing`
再利用する前に `Set` で再代入する

