Excel VBA MATCH関数の使い方と、並び替えやエラー処理方法

ExcelVBA-基礎編

VBAでMATCH関数の使い方と、検索結果から位置を取得する方法をご説明します。

また、近似検索を行う場合は並び替えが必要となりますので、並び替えを行って近似検索するコードも紹介します。

MATCH関数を使用する事で、指定した範囲の検索結果の相対的な位置を簡単に取得出来ます。

よくVLOOKUP関数の高速版としてINDEX関数と併用されることが多いですが、MATCH関数は高速で検索結果の位置を取得出来ます。

ExcelVBAの利点はワークシートという高機能なアプリケーションを、最初から使える事です。

そして、最大の利点はExcelに用意されている関数を使える事です。

そのMATCH関数をVBAで使う方法についてご説明したいと思います。

1.MATCH関数とは

MATCH関数は指定した範囲の中から、指定した値を検索した結果の相対的な位置を返します。

検索方法を指定する事で、「一致」「最小」「最大」を検索することが可能です。

また、一致以外の値を取得するためには、昇順、降順の並び替えが必要となります。

並び替え方法については下記記事をご覧ください。

MATCH関数の欠点

上記でも記載していますが、検索方法を指定する事で、「一致」「最小」「最大」を検索することが可能ですが、最大限に活用するためには並び替えの知識が求められます。

予め並び替えを行っているデータを使用してVBAでMATCH関数を使用しても良いかと思いますが、その部分が手動となってしまうため、ぜひ並び替え方法についても覚えてみてください。

また、VBAで使用する場合に検索した値が見つからなかった場合にエラーとなり、実行が停止してしまいます。

そのため、エラーを回避するコードを組み込む必要があります。

2.MATCH関数の使い方

MATCH関数は次のように記述します。

MATCH(検索値, 検索範囲, 検索方法)

検索値には検索したい値やセルを指定します。

検索範囲には検索値を検索したいセル範囲を指定します。

検索方法は完全一致で検索するか、最大値を検索するか、最小値を検索するか指定します。

検索方法の説明
検索方法説明
完全一致0検索値に一致する値を検索します。
この場合はデータを並び替えする必要はありません。
最大値1検索値以下の最大値を検索します。
この場合はデータを昇順に並び替えておく必要があります。
最小値-1検索値以上の最小値を検索します。
この場合はデータを降順に並び替えしておく必要があります。

※注意点として、1の時は検索値以下、-1の時は検索値以上となっています。

2.サンプルコード

基本的なコードから、並び替えをして検索するコード、エラー処理を組み込んだコードなどいくつか記載したいと思います。

データは次のようなA列に値のあるシンプルなデータを使用します。

基本的なコード

上記データから商品コードが「D1004」を検索して、完全一致の検索結果を取得します。

Sub Sample1()

MsgBox Application.WorksheetFunction.Match("D1004", Range(Cells(2, 1), Cells(8, 1)), 0)

End Sub

並び替えをして最小値を取得するコード

A列を降順に並び替えして、検索値「10039」を検索して検索値以上の最小値を取得します。

並び替え部分が追加となるため、コードが長くなります。

Sub Sample2()

With ActiveSheet
    
    .Sort.SortFields.Clear '並び替え条件クリア
    
    '昇順:xlAscending、降順:xlDescending
    .Sort.SortFields.Add _
        Key:=ActiveSheet.Cells(1, 1), _
        SortOn:=xlSortOnValues, _
        Order:=xlDescending, _
        DataOption:=xlSortNormal
        
    With .Sort
        .SetRange Range(Cells(1, 1), Cells(8, 1)) '並び替え範囲を指定
        .Header = xlYes '項目ありを指定
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
        
    End With
    
End With

MsgBox Application.WorksheetFunction.Match("D10039", Range(Cells(2, 1), Cells(8, 1)), -1)

End Sub

3.エラー処理のコード

VBAでMATCH関数を使用する場合は、検索値が見つからなかった場合はエラーとなるためエラー処理を組み込む必要があります。

エラー処理については「「On Error」でエラー処理」をご覧ください。

On Error Resume Nextのサンプルコード

「On Error Resume Next」はエラーをすべて無視します。

この方法が一番手っ取り早いです。

また、「On Error Resume Next」は解除しないとエラーを無視し続けるため、解除する必要があり、解除するところで「On Error GoTo 0」と記述します。

下記コードは完全一致で検索していて、「D10039」が存在しないため、エラーとなりますが無視されるためメッセージボックスが表示されません。

Sub Sample3()

On Error Resume Next

MsgBox Application.WorksheetFunction.Match("D10039", Range(Cells(2, 1), Cells(8, 1)), 0)

On Error GoTo 0 'エラー無視解除

End Sub
On Error GoTo ラベル名のサンプルコード

On Error GoTo ラベル名」はエラーが発生したら、ラベル名の位置までスキップするコードです。

スキップ先は「ラベル名:」と記述します。

1点注意があり、エラーが起きなかった場合でもラベル名以降に処理が実行されるため、ラベル名前に「Exit Sub」で離脱する必要があります。

以下コードは検索値「D10039」が存在しないので、「ErrLabel」のラベルにスキップします。

Sub Sample4()

On Error GoTo ErrLabel 'エラー発生時のラベル名指定

MsgBox Application.WorksheetFunction.Match("D10040", Range(Cells(2, 1), Cells(8, 1)), 0)

Exit Sub 'エラーが発生しなかった場合、ここで離脱

ErrLabel: 'エラー発生時にここまでスキップ

MsgBox "検索値が見つかりませんでした。"

End Sub
タイトルとURLをコピーしました