[Excel VBA] 特定条件を満たすセルを見つける

Excel で以下の様な番号と名前のデータがあったときに、番号をキーにして名前を取得するようなことは多いだろう。
このようなケースを処理するためには、Find メソッドを使用するとうまくできる。
特定条件を満たすセルを見つけた後、削除するような処理では以下の方法が使用できない。
この様な場合には、[Excel VBA] 特定条件を満たすセルを見つける2を参照いただきたい。

下記のようなケースを想定する。

  番号 名前
  1 2
A 0001 佐藤
B 0002 鈴木
C 0003 田中
D 0004 小林

※1 番号は書式指定で "0000" とし、 1 を 0001 としている

たとえば、番号 "0003" の田中さんを取得したい場合には以下のように処理をする。

Sub 番号3番の田中さんを見つける()
    Const NameCol = 2
    Dim SearchArea As Range             ' 検索範囲
    Dim c As Range                      ' 検索結果
    Dim firstAddress As String          ' 最初に見つかったセルのアドレス
    
    ' 検索範囲
    With ThisWorkbook.Sheets("Sheet1").Range("A1").CurrentRegion
        Set c = .Columns(1).Find(3)     ' 検索範囲の最初のカラムから番号を検索
        If Not c Is Nothing Then        ' 発見すれば結果にセルが、見つからなければ Nothing が返る
            firstAddress = c.Address    ' 最初のアドレスを覚えておく ※2
            Do
                MsgBox .Cells(c.Row, NameCol), vbOKOnly, "発見"
                Set c = .FindNext
            Loop While Not c Is Nothing And (c.Address <> firstAddress)
        End If
    End With
End Sub

※2 同じ番号が複数回出現するなどでループにて処理を行う場合、最後のセルの次を検索すると最初のセルが見つかる。
このため、最初に見つかったセルのアドレスを覚えておく必要がある。

この方法で、検索を行うと if 文を利用して検索するよりも断然早く処理を完了させることができる。
応用として、見つけたセルを削除する処理を考えてみたが、このループの中ではできない。
削除処理自体は、

Rows(c.Row).Delete Shift:= xlUp

で可能だが、この処理を行うと Loop 判定行で c が見つからずに例外が発生する。

コメント (0件)


くろねこ研究所
http://www.blackcatlab.com/article.php/ProgFAQ-Xls_FindCell