この記事を読んでわかること
- ExcelのMatch関数のような働きをVBAで再現する方法がわかる
- Match関数の書き方や使い方を学べる
- Match関数を使用したときによくあるエラーと対処法を知れる
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
-著者情報-
名前:Utatane
VBA(マクロ)歴:3年
Excel使用歴:15年以上
ひとこと:初心者だった当時に戻った気持ちになって解説いたします
VBA(Excelマクロ)でMatch関数を使う方法
まず、「Match」とはどのような関数なのか見ていきましょう。
Match関数とは?
Match関数は、指定した範囲の中から、検索したい値のindex(行番号)などを返す関数です。
例えば下図を見てください。

A1~A5セルの中から「A3」という値を検索することができます。
(A1~E1など横方向でも可)
この場合は3行目に「A3」があるため、「3」という答えが返ってきます。
要は、検索したい値が、端から数えて何番目にあるかを見つけてくれる関数というわけです。
では次にMatch関数の基本構文を見てから、使い方を学びましょう。
Match関数の基本構文
基本的には、ExcelのMATCH関数と同じ構文です。
▼ExcelのMATCH関数
=MATCH(検索値, 検索範囲, [照合の種類])
▼VBAのMatch関数
Application.Match(検索値, 検索範囲, [照合の種類])
▼VBAのMatch関数(使用例)
Application.Match("Utatane", Range("A1:A5"), 0)
照合の種類
- 0:完全一致
- 1:検索値以下(検索値が「10」なら10以下の8や3でもHITする)
- -1:検索値以上(検索値が「10」なら10以上の13や20でもHITする)
※照合の種類は省略できます。
省略した場合は、「1」が適用されますが、場合によってはうまく動作しないことがあります。
「0」の完全一致を指定するのが無難です。
では、Match関数の簡単な使い方から見ていきましょう。
Match関数の簡単な使い方
前提知識{マクロの基礎・作り方から実行まで}
前提知識{「Debug.Print」で値を表示させる方法}
前提知識{変数の宣言や使い方}
前提知識{セルの値を取得}
下記VBAコードは、前項と同じでA1~A5セルの中から「A3」という値を検索した例です。
Sub マッチ()
Dim idx As Variant
idx = Application.Match("A3", Range("A1:A5"), 0)
Debug.Print "A3は " & idx & " 行目にあります。"
End Sub

Match関数は検索値の位置を返すため、変数「idx」には「3」が入ります。
あとはその「idx」をイミディエイトウィンドウに表示するというだけのマクロです。

ここでいくつかの疑問が浮かぶ方もいるかと思います。
- 検索値が一致しない場合どうなるの?
- 検索値が複数該当した場合どうなるの?
- 複数の検索値から「or検索」をしたい場合はどうするの?
次項で解説いたします。
よくある疑問
検索値が一致しない場合どうなるの?
検索値が一致しない場合は、エラー値が返されます。
下記のVBAコードは、前項から検索値を「B3」に変更しただけのマクロです。
Sub マッチ()
Dim idx As Variant
idx = Application.Match("B3", Range("A1:A5"), 0)
Debug.Print idx
End Sub
検索範囲の中にB3は無いので、変数idxにはエラー値が代入されます。
よって、そのエラー値がイミディエイトウィンドウに表示されるというわけです。

こういったエラーを防ぐためには、少し工夫が必要です。
下記のVBAコードを見てください。
Sub エラー回避マッチ()
Dim idx As Variant
idx = Application.Match("A3", Range("A1:A5"), 0)
If IsError(idx) Then
Debug.Print "A3は見つかりませんでした。"
Else
Debug.Print "A3は " & idx & " 行目にあります。"
End If
End Sub
5~9行目がその工夫です。それ以外は先ほどのコードと同じです。
If文を用いて検索値が見つかった場合と見つからなかった場合とで分岐させています。
「If IsError(idx) Then」は、「idxがエラー値なら」という意味となります。
検索値が見つからない場合は、エラー値がidxに入ります。
なので、idxがエラー値なら(見つからなければ)、「見つかりませんでした」と表示し、
それ以外なら(見つかったら)その位置を表示するという処理にしています。
関連記事{条件分岐(If)}
検索値が複数該当した場合どうなるの?
Match関数は、検索値が複数見つかった場合でも、最初に見つかった場所を1つ返します。


なので、複数の位置すべてを知りたい場合は、Match関数よりもFor Eachでループさせる方が適切です。
Sub 複数マッチ()
Dim cell As Range
Dim matchRange As Range
Dim keyword As String
Dim result As String
keyword = "A3"
Set matchRange = Range("A1:A5")
result = ""
For Each cell In matchRange
If cell.Value = keyword Then
result = result & cell.Address & vbCrLf
End If
Next
If result = "" Then
Debug.Print "A3は見つかりませんでした。"
Else
Debug.Print "A3が入力されたセル:" & vbCrLf & result
End If
End Sub
セル1つ1つを変数に入れ、検索値と一致しているかを確認しています。
一致している場合は変数に追加し、最後のセルまでループさせているというわけです。

複数の検索値から「or検索」をしたい場合はどうするの?
複数の検索値(例えば、A2とA3のどちらか)が該当するのかを確認したい場合、下記のように記述することで実現できます。
Sub どちらかマッチ()
Dim matchRange As Range
Dim cell As Range
Dim result As String
Dim keyword1 As String, keyword2 As String
keyword1 = "A2"
keyword2 = "A3"
Set matchRange = Range("A1:A5") ' 検索対象範囲
result = ""
For Each cell In matchRange
If cell.Value = keyword1 Or cell.Value = keyword2 Then
result = result & cell.Address(False, False) & " (" & cell.Value & ")" & vbCrLf
End If
Next
If result = "" Then
Debug.Print "A2 or A3は見つかりませんでした"
Else
Debug.Print "A2 or A3が入力されたセル:" & vbCrLf & result
End If
End Sub

前項のコードを「or」条件でループしただけです。
より実践的な応用例
下記VBAコードは、名前を検索して部署名を表示させた例です。
Sub 名前を検索して部署名を表示()
Dim nameList As Range
Dim deptList As Range
Dim nameToFind As String
Dim idx As Variant
Dim department As Variant
Set nameList = Range("A2:A5") ' 名前列を取得
Set deptList = Range("B2:B5") ' 部署列を取得
nameToFind = "田中"
idx = Application.Match(nameToFind, nameList, 0) ' 名前を検索
If IsError(idx) Then
Debug.Print nameToFind & " さんは見つかりませんでした。"
Else
department = Application.Index(deptList, idx) ' 名前に対応した部署を取得
Debug.Print nameToFind & " さんの部署は " & department & " です。"
End If
End Sub


関連記事{Valueについて}
関連記事{ループ処理(For Each)}
Match関連でよくあるエラーと対処法
型が一致しません

Match関数の戻り値(返された数値)はLong型で返されます。
Long型の変数以外に入れようとした場合、このエラーが出る場合があります。
変数の型をLong型かVariant型に変更してみてください。
また、エラー値が返ってきた場合、他の型の変数と計算や表示をしようとするとこのエラーが出ることがあります。
条件分岐を使って、エラー値の場合は計算や表示をさせないようにすることで、エラーを回避できます。
プロパティを取得できません

WorksheetFunctionを使用していて、元データと検索値が一致しない場合にこのエラーが発生します。
Sub プロパティを取得できませんを再現()
Dim idx As Variant
idx = Application.WorksheetFunction.Match("B3", Range("A1:A5"), 0)
Debug.Print idx
End Sub
Application.Matchを使用するか、下記コードのようにエラーハンドリング(On Error)を使うことでエラーを回避できます。
Sub マッチ()
Dim idx As Variant
On Error GoTo ErrorHandler
idx = Application.WorksheetFunction.Match("B3", Range("A1:A5"), 0)
Debug.Print "B3は " & idx & " 行目にあります。"
Exit Sub
ErrorHandler:
Debug.Print "見つかりませんでした。"
End Sub
最後に
VBA(Excelマクロ)のMatch関数について解説いたしました。
当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!