VBAのFind関数とMatch関数の違いと使い方

2023年6月3日

今回はVBAのFind関数(メソッド)とMatch関数(メソッド)についてご紹介します。これらの関数はExcel VBAでデータを検索する際に非常に便利です。以下に両関数の使い方と違い、注意点、そしてメリットとデメリットについてサンプルアプリを使って解説します。

サンプルアプリ

「検索(Find)」ボタンと「検索(Match)」ボタンをそれぞれクリックすると「C4」セルに入っているワードを使って検索し、表の中でヒットしたセルを黄色に着色します。

サンプルアプリのコード   アプリの作成手順はこちら

検索(Find)」ボタンと「検索(Match)」ボタンのコードは以下の通りです。
次項でFindメソッドとMatchメソッドの違いについて説明していきます。

Option Explicit
 
Sub 検索Find()

 '検索結果を入れるRange変数を定義
  Dim Rng As Range
 '検索でヒットした行番号を入れる変数を定義
  Dim HitRow As Long
 '検索キーを入れる変数を定義
  Dim key As String

 '着色されたセルを一旦クリア
  Range("C7:C18").Interior.ColorIndex = 0
 
 'キーワードを変数にセット
  key = Worksheets("Sheet1").Cells(4, 3).Value
  
 '検索(ヒットしたセルの位置をRng変数にセット)
  Set Rng = Worksheets("Sheet1").Range("C7:C18").Find(What:=key, LookIn:=xlValues, LookAt:=xlWhole)

 '検索でヒットした場合はヒットしたセルを着色する。ヒットしなかった場合は無視する。
  If Not (Rng Is Nothing) Then
 
   'ヒットしたセルの行番号をセット
    HitRow = Rng.Row
   '検索でヒットしたセルを着色
    Range("C" & HitRow).Interior.ColorIndex = 36
   
  End If
 
 End Sub
    
'*******************************************************************************************************    
    
Sub 検索Match()

'検索結果を入れるRange変数を定義
 Dim Rng As Range
'検索してヒットした行番号を入れる変数を定義
 Dim HitRow As Variant
'検索キーを入れる変数を定義
 Dim key As String

'着色されたセルを一旦クリア
 Range("C7:C18").Interior.ColorIndex = 0
 
'キーワードを変数にセット
 key = Worksheets("Sheet1").Cells(4, 3).Value
  
'検索(表の中でヒットした位置をHitRow変数にセット)
 HitRow = WorksheetFunction.Match(key, Worksheets("Sheet1").Range("C7:C18"), 0)

'検索でヒットした場合はヒットしたセルを着色する。ヒットしなかった場合は無視する。
 If (IsEmpty(HitRow) = False) Then

    '検索でヒットしたセルを着色
    Range("C" & 6 + HitRow).Interior.ColorIndex = 36
    
 End If
 
End Sub

両関数の使い方

まずは、サンプルアプリのコードを使って両関数の使い方を説明します。

Find関数の基本的な使い方は以下の通りです。
 Set 変数 = 検索範囲.Find(検索ワード,検索方法)
以下のコードは、Find関数を使って指定した範囲内で値を検索しています。
見つかった場合はそのセルを着色し、見つからなかった場合は何もしません。

'キーワードを変数にセット
  key = Worksheets("Sheet1").Cells(4, 3).Value
  
 '検索(ヒットしたセルの位置をRng変数にセット)
  Set Rng = Worksheets("Sheet1").Range("C7:C18").Find(What:=key, LookIn:=xlValues, LookAt:=xlWhole)

 '検索でヒットした場合はヒットしたセルを着色する。ヒットしなかった場合は無視する。
  If Not (Rng Is Nothing) Then
 
   'ヒットしたセルの行番号をセット
    HitRow = Rng.Row
   '検索でヒットしたセルを着色
    Range("C" & HitRow).Interior.ColorIndex = 36
   
  End If

Find関数ではヒットしたセルの位置をRangeオブジェクトにセットして、RangeオブジェクトのRowプロパティを使って行番号を取得します。
「Set 変数 = 検索範囲.Find(検索ワード,検索方法)」の検索方法で指定する変数については下記リンク先をご覧ください。
 https://scodebank.com/?p=41

一方、Match関数は以下のように使用します。
 Set 変数 = WorksheetFunction.Match( 検索値 , 検索範囲 , 検索方法)
以下のコードは、Match関数を使って指定した範囲内で値を検索しています。
Find関数と同様、見つかった場合はそのセルを着色し、見つからなかった場合は何もしません。

'キーワードを変数にセット
 key = Worksheets("Sheet1").Cells(4, 3).Value
  
'検索(表の中でヒットした位置をHitRow変数にセット)
 HitRow = WorksheetFunction.Match(key, Worksheets("Sheet1").Range("C7:C18"), 0)

'検索でヒットした場合はヒットしたセルを着色する。ヒットしなかった場合は無視する。
 If (IsEmpty(HitRow) = False) Then

    '検索でヒットしたセルを着色
    Range("C" & 6 + HitRow).Interior.ColorIndex = 36
    
 End If

Match関数の場合、検索で該当箇所が見つかった場合、指定範囲の中で初に見つかった値が何番目の位置にあるかを示す数値を返します。下記の例では「10」を返します。Find関数と違ってセルの行番号である「16」を直接取得できないので注意してください。

「Set 変数 = WorksheetFunction.Match( 検索値 , 検索範囲 , 検索方法)」の中の検索方法の変数については以下の通りです。
 0 :検索範囲から完全一致で検索
 1 :検索範囲から近似値以下で最大値を検索
 -1:検索範囲から近似値以下で最小値を検索
「1」又は「-1」を選択する場合は、データを事前に以下のように並べ替えておく必要があるので、更に注意が必要です。
 1 :データを事前に昇順
 -1:データを事前に降順
ほとんど「0」を使うケースが多いですが、近似値で検索する際は注意が必要です。
Match関数は、Application.Matchを使用し、検索対象の範囲内で指定した値を検索しています。

両関数の違いについて

次に、Find関数とMatch関数の違いについて説明します。
Find関数は、範囲内で指定した値を検索し、最初に見つかったセルの位置を返します。
サンプルアプリで示すと1行目のセルからの位置である行番号「16」が返されます。

一方、Match関数は、検索対象の範囲内で最初に見つかった値が何番目の位置にあるかを示す数値を返します。
サンプルアプリで示すと表の中の検索範囲からの位置「10」が返されます。

また、Find関数は、セルの値だけでなく、書式や数式なども検索対象とすることができます。
Match関数の方は、セルの値だけを検索します。
Find関数は、Rangeオブジェクトのメソッドとして使用されるため、Rangeオブジェクトが必要です。
一方、Match関数は、Applicationオブジェクトのメソッドとして使用されるため、Rangeオブジェクトは必要ありません。

検索先のセルに式が入っている場合の注意点

検索先のセルに式が入っている場合、Find関数とMatch関数の挙動には注意が必要です。
Find関数は、「Set 変数 = 検索範囲.Find(検索ワード,検索方法)」の中で、
検索方法に「LookIn:=xlFormulas」を指定すると指定した数式そのものを検索します。
数式の結果を検索する場合は、「LookIn:=xlValues」を指定してください。
多くの場合、式の結果を検索する場合がほとんどだと思われますので、「LookIn:=xlValues」を指定するのを忘れないようにしてください。
一方、Match関数は、式を持つセルの値を評価して検索します。式が計算された結果と一致する値を検索することができます。

両関数のメリットとデメリット

最後に、Find関数とMatch関数のメリットとデメリットを紹介します。

Find関数のメリット:
セルの値だけでなく、書式や数式も検索対象にできます。
最初に見つかったセルの位置を返すため、特定のセルを迅速に見つけることができます。
Find関数のデメリット:
Find関数は、検索対象が見つからない場合には範囲全体を検索します。
したがって、検索対象が存在しない場合や範囲が非常に大きい場合には、処理時間が長くなる可能性があります。

Match関数のメリット:
Match関数はインデックス(指定範囲の中の位置)を返すだけであり、セルの位置を特定する必要がないため高速です。ただし、範囲の大きさやデータの整列状態によって処理速度が影響を受けることに留意してください。
Match関数のデメリット:
セルの値のみを検索するため、書式や数式を検索対象にできません。
また、検索対象の範囲内で最初に見つかった値が何番目の位置にあるかを示す数値を返すため、特定のセルの位置を直接取得することができません。そのため下記ように、取得した位置に表の最初の行番号「6」を足して、セルの行番号を特定しています。
 Range(“C" & 6 + HitRow).Interior.ColorIndex = 36
このように、返された表の中の位置を基に、必要な行番号を求めるために処理を追加する必要があります。

Index関数とMatch関数を使ったエクセルの検索については以下のリンク先をご覧ください。
 https://scodebank.com/?p=36

以上が、VBAのFind関数とMatch関数の違い、検索先のセルに式が入っている場合の注意点、そして両関数のメリットとデメリットです。
適切な関数の選択と注意深い使用により、効果的なデータ検索を行うことができます。
ぜひ、実際のコード例を使って両関数の使い方を試してみてください。