VBAのFindで日付を検索すると、検索日付に合致するセルが存在するのに見つけてくれずに「実行時エラー 91 オブジェクト変数またはWithブロック変数が設定されていません。」が出るようになってしまいました。
以前実行した時は問題なく動作していたのに、突然エラーとなり実行できなくなってしまいました。
今回はその時の対処方法を覚え書き。
以前も同じことがあって、その時どうやって直したか覚えてなくて無駄な時間を使ったので今回はちゃんと記録に残しておきます。
エラーの出たVBAのコード
以下はD列全体を選択して、変数に指定した日付が存在する場合その行番号を取得するコードです。
lngRowNum = ThisWorkbook.Worksheets("休日カレンダー").Range("D:D").Find(dtFindVal, LookAt:=xlWhole).ROW
Findの引数に指定した検索日付がD列上に存在するにも関わらず、「実行時エラー '91': オブジェクト変数またはWithブロック変数が設定されていません。」のエラーが発生してしまいます。
このプログラムは前回実行時はなんの問題もなく実行されていて、検索値に指定した日付の行番号をちゃんと返していたのですが、今日実行すると突然上記のエラーが出るようになってしまいました。
ちなみに手動で[検索と置換]で検索しても該当するセルがあるのに「検索対象が見つかりません」になってしまします。
解決策
解決策と言うか、やったらちゃんと動くようになったというレベルの話です。
まずExcelで[Ctrl] + [F]で[検索と置換]ダイアログボックスを表示します。
[検索する文字列]ボックスの右の四角の欄が「プレビュー*」となっていたら右の[書式]ドロップダウンをクリックし、一覧から[書式検索のクリア]を選択します。
[検索する文字列]ボックスの右の四角の欄が「書式セットなし」に変わるはずです。
まずはこの状態で手動で検索して該当セルをちゃんと見つけてくれるか確認しましょう。
該当セルを見つけてくれるようになってたら、VBAを実行してもエラーとならないはずです。
Findを使う場合の補足
もともとこのコードは、検索値が本当に存在しない場合エラーとなって止まってしまうのであまり良くないコードです。
これを作った人は、検索値に指定された日付が必ず存在することを前提にコードを書いているため考慮が足りない状態です。
もしFindを使用して同じようなコードを書くなら、以下のように該当するセルがなかった場合のことも考慮するように記述するべきだと思います。
Findを使ったサンプルプログラムの一例
以下のように該当セルがなかった場合の処理を記載して、正しく実行を制御する必要があります。
Sub procFind_TEST()
Dim dtFindVal As Date, Rng As Range
dtFindVal = "2022/02/02"
Set Rng = ThisWorkbook.Worksheets("休日カレンダー").Range("D:D").Find(dtFindVal, LookAt:=xlWhole)
If Rng Is Nothing Then
MsgBox "該当するセルはありませんでした。", vbExclamation
Else
lngRowNum = Rng.Row
MsgBox lngRowNum, vbInformation
End If
End Sub
この記事のまとめ
昨日まで動作してたのに、VBAのFindで存在するはずの値を検索しても実行時エラー91となってしまう、手動で[検索と置換]ダイアログボックスの「書式セットなし」にしたら直った、というお話でした。
コメント