【Excel VBA】Matchで「1004エラー」が出る場合の対処法|Application.Matchとの違い
みなさんこんにちは。
Excel VBAでデータを検索するときに、WorksheetFunction.Matchを使用したことがある方も多いかと思います。
例えば、商品コードや顧客番号などを検索する処理では、該当する値が存在しない場合に「実行時エラー ‘1004’」が発生して、処理が止まってしまうことがあります。
今回は、Matchで1004エラーが発生する原因と、Application.Matchを使って安全に検索する方法についてご紹介したいと思います。
この記事はこんな人におすすめ
この記事はこんな人におすすめです!
- Match関数を使用すると1004エラーが発生する人
- 値が見つからない場合もエラーを回避したい人
Application.MatchとWorksheetFunction.Matchの違いを知りたい人
今回使用するExcelデータ
まず、「Sheet1」のA列に以下のデータを入力してください。
| セル | 内容 |
|---|---|
| A1 | 商品コード |
| A2 | A001 |
| A3 | A002 |
| A4 | A003 |
今回は、存在しない商品コード「A999」を検索してみます。

WorksheetFunction.Matchで1004エラーが発生する例
まずは、以下のコードを実行してみてください。
Sub MatchErrorExample()
Dim hitPosition As Long
'Sheet1のA2:A4から存在しない商品コードを検索する
'第3引数の0は「完全一致」を指定する
hitPosition = Application.WorksheetFunction.Match( _
"A999", ThisWorkbook.Worksheets("Sheet1").Range("A2:A4"), 0)
'検索に成功した場合は範囲内の位置を表示する
MsgBox hitPosition
End Sub
実行すると、検索対象に「A999」が存在しないため、実行時エラー「1004」が発生します。
ワークシートのMATCH関数では、値が見つからない場合に#N/Aが返されますが、VBAのWorksheetFunction.Matchでは実行時エラーとなる点に注意が必要です。

Application.MatchとIsErrorで対処する
この場合は、WorksheetFunction.MatchをApplication.Matchに変更する方法がおすすめです。
Application.Matchでは、値が見つからない場合にエラー値が返されるため、IsErrorを使用して判定できます。
Sub MatchSafeExample()
Dim ws As Worksheet
Dim targetRange As Range
Dim searchKey As String
Dim matchResult As Variant
Dim hitRow As Long
'検索対象のシートとセル範囲を指定する
Set ws = ThisWorkbook.Worksheets("Sheet1")
Set targetRange = ws.Range("A2:A4")
'検索する商品コードを指定する
searchKey = "A999"
'完全一致で検索する
'見つからない場合はエラー値を返す
matchResult = Application.Match(searchKey, targetRange, 0)
'エラー値なら「見つからない」と判断して終了する
If IsError(matchResult) Then
MsgBox searchKey & " は見つかりませんでした。", vbInformation
Exit Sub
End If
'Matchの戻り値は検索範囲内の相対位置なので
'Excelの実際の行番号へ変換する
hitRow = targetRange.Row + CLng(matchResult) - 1
'見つかったセルの行番号を表示する
MsgBox searchKey & " は" & hitRow & "行目にあります。", vbInformation
End Sub
今回のポイントは、matchResultをVariant型にしていることです。
Long型などで受け取ると、検索に失敗した場合のエラー値をそのまま格納できません。
また、Matchが返すのは検索範囲内で何番目に存在するかという位置です。
今回のようにA2セルから検索する場合は、実際の行番号と異なるので注意してください。

検索が成功する場合も確認する
今度は、次の1行を変更して実行してください。
searchKey = "A002"
この場合はA3セルに該当する値があるため、「A002 は3行目にあります。」と表示されます。
IsErrorで先に判定することで、検索に失敗した場合も実行時エラーを発生させずに処理を終了できます。
最後に
いかがでしたでしょうか。
今回は、WorksheetFunction.Matchで1004エラーが発生する原因と、Application.Matchを使用した対処法についてご紹介しました。
検索する値が必ず存在するとは限らない場合は、Application.Matchの戻り値をVariant型で受け取り、IsErrorで確認する方法が便利です。
少しでも参考になれば幸いです。
開発依頼について
ココナラでWebスクレイピング開発サービスを出品しております。
自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。
そんな方はいつでもお気軽にご相談ください。
また、本ブログからご依頼いただいた方については割引特典がございますので、
ご不明点と合わせてメッセージをいただけると幸いです。
業務の流れをまるごと自動化します Excel・Web・Teams・SaaSで業務全体を自動化Webスクレイピング以外にもWebアプリの開発サービスも出品しております。
こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、
お気軽にご相談ください。
スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?
