【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商品コード
A2A001
A3A002
A4A003

今回は、存在しない商品コード「A999」を検索してみます。

Excel VBAのMatch関数で検索する商品コード一覧をSheet1に入力した画面

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では実行時エラーとなる点に注意が必要です。

Excel VBAのWorksheetFunction.Matchで検索値が見つからず実行時エラー1004が発生した画面

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セルから検索する場合は、実際の行番号と異なるので注意してください。

Excel VBAのApplication.MatchとIsErrorを使用して1004エラーを回避した画面

検索が成功する場合も確認する

今度は、次の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アプリから始めませんか?

ご興味がある方はこちら!!

コメントを残す

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

CAPTCHA