今回はRange型変数を使用している時にでよく見る「実行時エラー’91’:オブジェクト変数またはWithブロック変数が設定されていません。」の原因と対処法を紹介します。
どういうエラーか
Range型の変数を使用している時に「実行時エラー’91’:オブジェクト変数またはWithブロック変数が設定されていません。」というエラーが出ることがあります。
![どういうエラーか_1](https://masashi-blog418.com/wp-content/uploads/2023/01/image-11.png)
VBAを使っている方であれば1回は見たことがあるエラーかもしれませんね。
とりあえず例としてコードを用意しました。実行すると上記エラーが発生します。
Sub testCheckNothing()
Dim Rng As Range
With ThisWorkbook.ActiveSheet
Rng.Offset(1, 0) = "エラーになります"
End With
End Sub
エラーが発生する原因
![](https://masashi-blog418.com/wp-content/uploads/2022/09/b0261.png)
具体的にどういうエラーなんだろう?
と思う方も多いと思います。実際私もよくそうなってました。
エラーが発生する原因はRange型変数の中身がNothingになっていることが多いです。実際に変数に何もセットせずに中身を確認してみるとNothingになっているはずです。
![エラーが発生する原因_1](https://masashi-blog418.com/wp-content/uploads/2023/01/image-13-1024x269.png)
メソッドを確認してみるとエラーメッセージが表示されるのが確認できます。
![エラーが発生する原因_2](https://masashi-blog418.com/wp-content/uploads/2023/01/image-12.png)
対処法
対処法ですが、IF文を使ってRange型変数の中身をチェックするのがおすすめです。
![](https://masashi-blog418.com/wp-content/uploads/2022/09/b0261.png)
具体的にどうするの?
ってなると思うので、先程の例を使って紹介します。
Sub testCheckNothing()
Dim Rng As Range
With ThisWorkbook.ActiveSheet
If Rng Is Nothing Then
Set Rng = .Range("A1")
End If
Rng.Offset(1, 0) = "エラーになります"
End With
End Sub
先程のコードに以下の部分を追加しました。
If Rng Is Nothing Then
Set Rng = .Range("A1")
End If
何となく読めばわかる方もいると思いますが、
要は「Rngの中身がNothing(何も格納されていない)か」をIF文で判定し、TrueであればRngにA1セルをセットする。といった処理になります。
こうして事前にチェックしておくことでRangeに何も格納されていないことによるエラーを防ぐことができるわけです。
まとめ
今回はRange型変数でよく見るエラーの原因と対処法を紹介しました。
「実行時エラー’91’:オブジェクト変数またはWithブロック変数が設定されていません。」が出る時は、変数の中身がNothingになっていないか(何も格納されていない状態)確認するようにしましょう。
また、当ブログではVBAに関する記事を不定期で投稿していますので、良ければ是非ご覧ください!
コメント