VBAエラー91|Findで値が見つからないとき

VBAエラー91|Findで値が見つからないとき

記事
IT・テクノロジー
カテゴリ:VBA・マクロ

検索する値があると動くのに、ないと「実行時エラー91」で止まる。Findの直後に.Rowや.Valueを読んでいるなら、検索結果がNothingになっていないか確認しましょう。

止まった行を確認できている方に向けて、Findで検索したセルを使う処理の直し方を紹介します。

1.見つからなかった場合を分ける

Findは、値が見つからないとNothingを返します。その結果に続けて.Rowや.Valueを読むと、読み取るセルがないため、エラー91の原因になります。

DimでRange変数を宣言しただけでは、セルへの参照は入りません。Setで検索結果を受け取り、そのあとにNothingかどうかを調べます。Setを付けても、値が見つかるとは限らない点が大切です。

編集前のブックを別に残してから、該当する部分を直します。

2.Nothingを確認してから行番号を読む

次は、セルへの書き込みや保存をせず、検索結果を表示する説明例です。マクロを入れたブックの「商品」シートで、A2:A4にA001、A002、A003が順に並んでいるものとします。

Sub FindProduct()
Dim ws As Worksheet
Dim searchRange As Range
Dim found As Range

Set ws = ThisWorkbook.Worksheets("商品")
Set searchRange = ws.Range("A2:A4")

Set found = searchRange.Find( _
What:="A002", After:=searchRange.Cells(3), _
LookIn:=xlValues, LookAt:=xlWhole, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, MatchByte:=False, SearchFormat:=False)

If found Is Nothing Then
MsgBox "対象が見つかりませんでした。"
Exit Sub
End If

MsgBox "見つかった行: " & found.Row
End Sub

見つからなければメッセージを出して終了します。found.Rowは、その確認を通過したあとにだけ読みます。

02_Find結果の処理分岐_説明図.png
ThisWorkbookはマクロが入っているブックです。今表示しているブックと同じとは限りません。別ブックを検索する処理では、実際の対象ブックを指定してください。

例のAfterは、A2:A4内の最後のセルです。検索範囲を変えるときは、この指定も範囲内の1セルに合わせます。検索条件の一部は前回の設定が引き継がれるため、例では条件を明示しています。LookAt:=xlWholeはセル全体の一致を調べる指定です。

3.ある値とない値の両方で確かめる

このデータでA002を探す場合、表示される行番号は3です。検索範囲の中で何番目かではなく、シート上の行番号になります。

コードのWhatだけをA999へ変えた場合は、「対象が見つかりませんでした。」で終了することを確認します。確かめるために元データを書き換える必要はありません。

既存マクロへ組み込むときは、今の検索範囲・検索条件を保ち、結果の受け取り方と分岐を直します。見つからない場合に転記や更新へ進まないようにし、もともと必要な終了処理があれば、それを通るようにします。

元のマクロを再実行する前には、転記や保存が途中まで済んでいないか確認してください。コピーで試す場合も、コード内のブック名や出力先が原本を指していないか確かめます。

On Error Resume Nextでエラーを隠したり、見つからない代わりに先頭行を使ったりすると、誤った行を処理するおそれがあります。

この例は文字列の検索に絞っています。日付の検索、重複する値の全件処理、Find以外で起きるエラー91は別に確認が必要です。

カスタマイズやご要望がある場合は、お気軽にご相談ください。

サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す