エラー内容
VBAの実行時に「実行時エラー ’91’: オブジェクト変数または With ブロック変数が設定されていません。」というエラーになることがあります。
オブジェクト変数を扱う際に出るエラーで、発生頻度は結構高いです。
このエラーはSetの付け忘れが一番多い原因と思われますが、Setによる代入結果がNothingの場合の判定処理も必要になってきます。詳細は後述しています。
エラーの原因
エラーの原因は、オブジェクト変数の値が未設定のためです。
未設定になる原因には大きく2つあります。
1つは、Setステートメントの記述漏れです。
もう1つは、Setステートメントは記述していても代入結果がNothingの場合です。
Setステートメントの記述漏れの場合
4行目にSetが抜けています。
1 2 3 4 5 6 |
Sub Err91Test1() Dim r r = Cells.Find("test") r.Select End Sub |
代入結果がNothingの場合
「test」と書いてあるセルがない場合はFindの結果がNothingになります。
その場合、5行目では期待しているRangeオブジェクトではなくNothingになっているためSelectを行うとエラーになります。
1 2 3 4 5 6 |
Sub Err91Test2() Dim r Set r = Cells.Find("test") r.Select End Sub |
エラーの対応方法
エラー91の対応方法は大きく2点あります。
Setステートメントを使って代入することと、代入結果がNothingの場合は処理をしない判定をすることです。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub Err91Test3() Dim r Set r = Cells.Find("test") '// セルが見つかった場合 If Not r Is Nothing Then r.Select Else Call MsgBox("セルが見つかりません") End If End Sub |
4行目でSetでの代入処理を正しく行っています。
その直後の7行目で代入結果がNothingかどうかの判定を行っています。
CreateObject関数を利用する場合などでほぼ確実に代入されることが分かっている場合はNothingの判定処理は不要としてもよいですが、上記例のように結果が定まらないFind関数を利用するような場合は判定処理は必須になります。