【Excel小ネタ】ExcelのMATCH関数は実は2つある?

ExcelのMATCH関数が実は2種類存在し、それぞれ動作が異なっていたので、記事でまとめてみました。

一般的なMATCH関数について

ExcelのMatch関数について少しおさらいをします。

上記表のようは商品一覧から、入力した商品名が何番目に存在するか検索したい場合に使用する関数が、MATCH関数です。

「目当ての商品名(E2セル)」に商品名リストに存在する商品名を入力すると…

「何番目にある?(D3セル)」に右側の商品リストから、入力した「リンゴ」の順番を取得しその番号を表示します。ここでは商品リストにリンゴという商品がリストの1番目に存在するので(項目名は除く)、1が表示されています。

Excelシート上で動作するMATCH関数の内容としては、

(数式) =MATCH(検査値, 検査結果, [照合の種類])
(指定) =MATCH($D$2, $A$2:$A$5, 0)
(訳) =MATCH(“リンゴ”の順番を, “商品リスト”から, “一致するものの順番を返して”)

となります。「目当ての商品名」を指定するセルがD2で、商品リストがA2からA5まで(A2:A5)で、最後の照合の種類はどのようなものを探せばいいのか指定をします。

照合の種類意味
1 または 省略検査値以下の最大値
0検査値に一致する値のみ
-1検査値以上の最小値

「照合の種類」を1を指定した場合です。この場合、検査値53に対して商品リストの個数以下のうち最大の値が何番目かを検索することになるので、一番近く最大値である「いちご 50」は3番目なので3が結果となります。

VBA上のMATCH関数について

本題に入り、たとえば「何番目?」ボタンをクリックした場合、下記のキャプチャーのように目当ての商品のものがリストから何番目かメッセージで表示する機能を作成するとします。

その場合、「何番目」ボタンに下記のようなVBAコードを作成するわけですが、

Sub onClickBtnMatch()
    Dim index As Integer

    index = WorksheetFunction.match(Range("D2"), Range("A2:A5"), 0)

    MsgBox index & "番目です"
End Sub

上記のキャプチャーのように、リストに存在しないものを指定した場合はエラーになってしまいます。
なので、存在しない商品名を指定した場合は「該当商品は存在しません」と表示するように変更する機能をつけたいです。ですが、このWorksheetFunction.Matchは値が見つからなかった場合に強制的にデバッグメッセージを表示する動作になっており、少し面倒な書き方が必要になります。

Sub onClickBtnMatch()

    Dim index As Integer
    On Error Resume Next
    index = WorksheetFunction.match(Range("D2"), Range("A2:A5"), 0)
    Err.Clear 
    On Error GoTo 0

    Select Case index
        Case 0
            MsgBox "指定した商品が見つかりませんでした"
        Case Else
            MsgBox index & "番目です"
    End Select

End Sub

On Error Resume Nextや On Error Goto 0などを追加する形になります。
ですがこれらは、エラーが発生しても無条件で進む動作になっているためデバッグ作業が難しくなり、もし不具合があっても漏れてしまう恐れがあるので私個人的にはあまり好まない書き方です。

謎のApplication.Match関数

それで、もっといい方法があるかGoogle先生に聞いてみたところ「Application.Match」というWorksheetFunctionの方ではない同名のMatchがあるらしいです。

WorksheetFunction.Matchとは異なり、エラーになった場合はちゃんとError型の戻り値を返してくれます。

Sub onClickBtnMatch() 
    Dim index = Application.match(Range("D2"), Range("A2:A5"), 0) 
    
    If IsError(index) Then 
        MsgBox "指定した商品が見つかりませんでした" 
    Else 
        MsgBox index & "番目です" 
    End If 
End Sub

面倒なOn Error Resume Nextが不要になり、戻り値をIsErrorに入れることをで判定できるようになりました。

なぜMatch関数が2種類存在するかは不明で、Excelのライブラリの方にも、Microsoftのドキュメントの方にも載っていないものです。

参考にしたページ

MicrosoftのMatch関数ドキュメント
https://support.microsoft.com/ja-jp/office/match-%E9%96%A2%E6%95%B0-e8dffd45-c762-47d6-bf89-533f4a37673a

Excel 業務をもっとカンタンに

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です