【EXCEL VBA | Findメソッド】条件に一致するセルを検索する!

スポンサーリンク

セルを検索するFindメソッド

指定したセル範囲の中で、条件に合致するセルを検索出来ます(^o^)

また、条件に当てはまるセルだけを処理したい場合にも便利に使えます!

Findメソッド

構文

Rangeオブジェクト.Find(検索条件などを設定する引数諸々)

返り値は、条件に一致したRnageオブジェクトです(^o^)

引数

引数名説明
What検索するデータの指定(必須)
After検索開始のセルの指定。ここで指定したセルの次のセルから検索します。
LookIn検索する対象を指定する。xlValues(値)・xlFormulas(数式)・xlComments(コメント)
LookAt検索条件を指定。xlWole(完全一致)・xlPart(部分一致)
SearchOrder検索方向の指定。xlByColumns(列方向)・xlByRows(行方向)
SearchDirection検索の向きの指定。xlNext(上から下)・xlPrevious(下から上)
MatchCase大文字と小文字の区別。True(区別する)・False(区別しない)
MatchByte全角と半角の区別。 True(区別する)・False(区別しない)
SearchFormat書式の検索をするかどうかの指定。 True(する)・False(しない)

引数の指定方法は、引数名に続けて「:=」を入力して、その後に引数の値を指定します。

次のような感じです。

ThisWorkbook.Worksheets(1).Range("A1:D20")_

.Find(What:="ひらちん", LookAt:=xlWhole, SearchOrder:=xlByRows)

注意点

Findメソッドの引数は、What以外は任意ですが、省略した場合ワークシート上で設定されている”検索”の条件が反映されてしまいます。こちらは、VBAで設定してもワークシートで設定しても生きになりますので、思わぬ挙動を防ぐためにも、できるだけ引数は設定する方が良いと思います。

検索と置換

実際の使い方サンプル

それでは実際の使い方のサンプルです。

次のような一覧があったとします。

完全一致で検索する

商品名列(A1:A10)から、”ひらちん”を検索してヒットしたセルのB列に”○”を入力するということをやってみましょう。

完全一致で検索する場合は、「LookAt」の引数に「xlWhole」を指定します。

ここでは、「SearchDirection」の引数に「xlNext(上から下に検索)」を指定しています。

「What」の引数に指定した”ひらちん”を、指定範囲の上から下に検索して、見つかったセルからOffsetで1列右にずらしたセルに”○”を入力するという感じです。

Sub sample()

  'シートの指定
    Dim sheet As Worksheet
  Set sheet = ActiveSheet 
  
    '”ひらちん”を完全一致で探す
    sheet.Range("A1:A10").Find(What:="ひらちん", _
                 After:=sheet.Range("A1"), _
                               LookAt:=xlWhole, _
                               SearchDirection:=xlNext _
                               ).Offset(0, 1) = "○"
End Sub

実行すると、次のような結果になります。

3行目の”ひらちん”のB列に”○”が入力されました。

お気づきの方もいると思いますが、9行目の”ひらちん”のB列には何も入力されていません。

Findメソッドは、最初に条件に一致したセルが見つかった時点でそのセルを返します。

ここでは、 「SearchDirection」の引数に「xlNext(上から下に検索)」を指定し ましたので、上から(A2セルから)順番に検索して、3行目の”ひらちん”が最初にヒットしたわけです。

「SearchDirection」の引数に「xlPrevious(下から上に検索)」を指定しすると結果が変わります。

やってみましょう。

※一度、B3セルに入力されている”○”は削除してから実行してください。

Sub sample()

  'シートの指定
    Dim sheet As Worksheet
  Set sheet = ActiveSheet 
  
    '”ひらちん”を完全一致で探す
    sheet.Range("A1:A10").Find(What:="ひらちん", _
                 After:=sheet.Range("A1"), _
                               LookAt:=xlWhole, _
                               SearchDirection:=xlPrevious _
                               ).Offset(0, 1) = "○"
End Sub

「SearchDirection:=xlPrevious」で検索が下から上になりましたので、A9セルの”ひらちん”が先にヒットしました。

部分一致で検索する

では、部分一致で検索してみましょう。

「LookAt」の引数に「xlPart」を指定します。

ここでは、「SearchDirection」の引数に「xlNext(上から下に検索)」を指定しています。

Sub sample()

  'シートの指定
    Dim sheet As Worksheet
  Set sheet = ActiveSheet 
  
    '”ひらちん”を部分一致で探す
    sheet.Range("A1:A10").Find(What:="ひらちん", _
                 After:=sheet.Range("A1"), _
                               LookAt:=xlPart, _
                               SearchDirection:=xlNext _
                               ).Offset(0, 1) = "○"
End Sub

上記のコードを実行します。(実行前に一致フラグ列(B列)は削除して空白にしておいてくださいね)

部分一致なので、上から検索した場合、2行目の”ひらちんの部屋”がヒットします。


ここではAfterの引数について指定していますが、この引数を省略した場合、指定した範囲(ここで言うA1:A10)の一番左上のセルの次から検索スタートします。一番左上のセルは、範囲全てを検索した後、最後に検索されます。

見出しの無い表の一覧などを検索する場合、Afterの引数を省略してしまうと、左上のセルの次が一番最初の検索開始セルになりますので、一番最初に検索されると思っていた場所が、一番最後になっている可能性もありますので、注意してください。


条件に一致するセルが見つからなかった場合

条件に一致するセルが見つからなかった場合、Findメソッドは”Nothing”を返します。

この特性を活かすことで、次のように一致するセル全てのB列に”○”を入れるといった処理も可能です。

Sub sample()

    'シートの指定
    Dim sheet As Worksheet
    Set sheet = ActiveSheet
    
    'ループ用の変数
    Dim i As Long
  
    '”ひらちん”を部分一致で探す
    For i = 1 To 10
    
        If Not sheet.Cells(i, 1).Find(What:="ひらちん", LookAt:=xlPart) Is Nothing Then
          
            sheet.Cells(i, 2) = "○"

        End If
                               
    Next
End Sub

ループ処理で、単一のセルを順番に確認していっています。

”ひらちん”を部分一致で検索して”Nothig”にならなければ、同じ行のB列に”○”を入れる処理です。

実行すると次のような結果になります。