カテゴリ: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は、その確認を通過したあとにだけ読みます。
ThisWorkbookはマクロが入っているブックです。今表示しているブックと同じとは限りません。別ブックを検索する処理では、実際の対象ブックを指定してください。
例のAfterは、A2:A4内の最後のセルです。検索範囲を変えるときは、この指定も範囲内の1セルに合わせます。検索条件の一部は前回の設定が引き継がれるため、例では条件を明示しています。LookAt:=xlWholeはセル全体の一致を調べる指定です。
3.ある値とない値の両方で確かめる
このデータでA002を探す場合、表示される行番号は3です。検索範囲の中で何番目かではなく、シート上の行番号になります。
コードのWhatだけをA999へ変えた場合は、「対象が見つかりませんでした。」で終了することを確認します。確かめるために元データを書き換える必要はありません。
既存マクロへ組み込むときは、今の検索範囲・検索条件を保ち、結果の受け取り方と分岐を直します。見つからない場合に転記や更新へ進まないようにし、もともと必要な終了処理があれば、それを通るようにします。
元のマクロを再実行する前には、転記や保存が途中まで済んでいないか確認してください。コピーで試す場合も、コード内のブック名や出力先が原本を指していないか確かめます。
On Error Resume Nextでエラーを隠したり、見つからない代わりに先頭行を使ったりすると、誤った行を処理するおそれがあります。
この例は文字列の検索に絞っています。日付の検索、重複する値の全件処理、Find以外で起きるエラー91は別に確認が必要です。
カスタマイズやご要望がある場合は、お気軽にご相談ください。