Excel VBA の実行時エラー辞典
実行時エラー '91':オブジェクト変数または With ブロック変数が設定されていません
Set で参照先を設定したか、検索結果が Nothing になっていないか確認します。
よくある原因
- Worksheet や Range を Dim しただけで、Set せずに使っています。
- Find で見つからなかった結果に対して Row などを使っています。
- Nothing に戻した変数を、後の処理で参照しています。
- With の対象を設定する行を通らずに処理へ入っています。
直し方
- 停止した行の左側にあるオブジェクト変数を特定します。
- Set する行が実行されたか確認し、Find の結果なら Nothing を先に判定します。
- 対象がない場合は案内して処理を分け、見つかった場合だけプロパティを使います。
元のブックや入力ファイルを残し、コピーで試してください。以下は一つの原因を扱う例です。Sub 全体を示していないコードは、練習用の Sub の中に記述します。
最初のシートで「合計」を探す例です。検索対象がない場合を通常の分岐として扱います。
修正前
Dim hit As Range
Set hit = ThisWorkbook.Worksheets(1).Range("A1:A100").Find( _
What:="合計", LookIn:=xlValues, LookAt:=xlWhole)
Debug.Print hit.Row
修正後
Dim hit As Range
Set hit = ThisWorkbook.Worksheets(1).Range("A1:A100").Find( _
What:="合計", LookIn:=xlValues, LookAt:=xlWhole)
If hit Is Nothing Then
MsgBox "合計の行が見つかりません"
Else
Debug.Print hit.Row
End If
調べ方
- エラー画面の「デバッグ」が使える場合は押し、黄色で止まった行とメッセージ全文を記録します。Windows では Alt+F11 で VBE を開けます。
- 停止行の少し前を選び、F9 でブレークポイントを設定します。再実行して止めたら、F8 で一行ずつ進めます。
- Set の直後にブレークポイントを置いて、検索結果が Nothing か確認します。
- Ctrl+G でイミディエイトウィンドウを開き、下の式を入力して Enter を押します。例の変数があるプロシージャ内で停止し、変数名は自分のコードに合わせてください。
? hit Is Nothing
Err の情報はエラーが起きた直後に確認します。修正後は、正常な入力と問題が起きた入力の両方で結果を照合してください。
関連エラー
- 実行時エラー '9':インデックスが有効範囲にありません
- 実行時エラー '424':オブジェクトが必要です
- 実行時エラー '438':オブジェクトは、このプロパティまたはメソッドをサポートしていません