VBAで自動化 VBA一覧 ファイル・印刷操作 ファイル操作

【VBA】ワイルドカードでファイルを開く方法|部分一致で対象ブックを自動取得

Excel VBAでファイルを開くとき、毎回ファイル名が完全に同じとは限りません。

たとえば、売上データが「売上_202501.xlsx」「売上_202502.xlsx」のように日付や月ごとに変わる場合、ファイル名を固定して開くコードでは対応しにくくなります。

このような場面で便利なのが、ワイルドカードを使ったファイル検索です。

ワイルドカードを使えば、「売上_*.xlsx」のように一部だけ一致するファイルを探して開くことができます。

この記事では、VBAでワイルドカードを使ってファイルを開く基本方法から、実務で安全に使うための注意点まで解説します。

✅ VBAでファイルを開くときにワイルドカードを使う基本

VBAでファイルを開く場合、Workbooks.Openに直接ファイルパスを指定する方法が基本です。
しかし、ファイル名が毎回変わる業務では、完全なファイル名をコードに書いてしまうと再利用しにくくなります。
たとえば、日付付きファイルや担当者名付きファイルでは、毎回コードを書き換える必要が出てしまいます。
このような書き方は、最初は動いても長く使うほど管理が大変になります。
ワイルドカードを使うと、ファイル名の一部だけを条件にして対象ファイルを探せるため、実務向けの自動化にしやすくなります。
ただし、Workbooks.Openだけでワイルドカードを直接扱えるわけではないため、Dir関数などで対象ファイルを探してから開く流れを理解しておくことが大切です。

・ワイルドカードで指定できる条件

VBAでファイルを探すときによく使うワイルドカードは、主に次の2つです。

ワイルドカード意味使用例
*任意の文字列売上_*.xlsx
?任意の1文字data_?.xlsx

たとえば、次のようなファイルがあるとします。

売上_202501.xlsx
売上_202502.xlsx
売上_確定.xlsx

この場合、次の条件で検索できます。

売上_*.xlsx

「売上_」で始まり、「.xlsx」で終わるファイルを対象にできます。

・Workbooks.Openには完全なパスが必要

注意したいのは、Workbooks.Openに次のような指定をしても、基本的には期待どおりに開けない点です。

Workbooks.Open "C:\Data\売上_*.xlsx"

Workbooks.Openでは、実際に存在するファイルのフルパスを指定する必要があります。

そのため、先にDir関数で対象ファイル名を取得してから、Workbooks.Openで開く流れにします。

・基本の流れ

処理の流れは次のとおりです。

  1. 対象フォルダを指定する
  2. ワイルドカード付きの検索条件を作る
  3. Dir関数で該当ファイルを探す
  4. 見つかったファイルをWorkbooks.Openで開く
  5. 見つからない場合はメッセージを表示する

この流れにしておくと、ファイル名が多少変わっても対応しやすくなります。

ワイルドカードを使ったファイル検索では、Dir関数の理解が欠かせません。ファイルの存在確認やファイル名取得、フォルダ内検索など、Dir関数の実践的な活用方法を詳しく知りたい方は、【VBA】Dir関数の活用法|ファイル操作を自動化する実務向け完全ガイドも参考にしてください。


✅ Dir関数でワイルドカードに一致するファイルを開く方法

ワイルドカードでファイルを開く場合、最も基本になるのがDir関数です。
Dir関数は、指定した条件に一致するファイル名を取得できます。
ただし、Dir関数が返すのはファイル名だけであり、フォルダパスは含まれません。
そのため、Workbooks.Openで開くときは、フォルダパスとファイル名を結合する必要があります。
ここを理解せずに使うと、「ファイルが見つからない」「別の場所を見に行ってしまう」といったトラブルにつながります。
まずは、1件だけ該当ファイルを開く基本形を押さえておきましょう。

・ワイルドカードで一致した最初のファイルを開くコード

以下は、「売上_」で始まるExcelファイルを探して開くサンプルです。

このコードでは、対象フォルダや検索条件を変数に分けています。
直接コード内に長いパスを書き込むよりも、後から修正しやすく、別の業務にも流用しやすいためです。
また、該当ファイルが見つからない場合の処理も入れているため、実務で使ったときに原因を確認しやすくなります。

Option Explicit

Sub OpenWorkbookByWildcard()

    Dim targetFolderPath As String
    Dim searchPattern As String
    Dim matchedFileName As String
    Dim fullFilePath As String
    
    '対象フォルダを指定
    targetFolderPath = "C:\Data\"
    
    'ワイルドカードを使って検索条件を指定
    searchPattern = "売上_*.xlsx"
    
    '条件に一致する最初のファイル名を取得
    matchedFileName = Dir(targetFolderPath & searchPattern)
    
    '該当ファイルがない場合は処理を終了
    If matchedFileName = "" Then
        MsgBox "条件に一致するファイルが見つかりませんでした。", vbExclamation
        Exit Sub
    End If
    
    'フォルダパスとファイル名を結合してフルパスを作成
    fullFilePath = targetFolderPath & matchedFileName
    
    '見つかったファイルを開く
    Workbooks.Open Filename:=fullFilePath
    
End Sub

・この書き方が実務で扱いやすい理由

このコードでは、フォルダパス、検索条件、取得したファイル名、開くファイルのフルパスをそれぞれ別の変数にしています。

一見すると少し長く見えるかもしれません。

しかし、実務では「対象フォルダだけ変えたい」「検索条件だけ変えたい」「開く前にログを残したい」といった変更がよく発生します。

そのとき、1つの行に処理を詰め込んでいると、どこを直せばよいのか分かりにくくなります。

変数を分けておくことで、処理の役割が明確になり、後からの変更にも対応しやすくなります。

今回はDir関数を利用した保守しやすい構成で解説しましたが、ワイルドカードを使ったファイル検索や自動オープンの基本から整理したい方は、【VBA】ExcelVBAでワイルドカードを使ってファイルを自動で開く方法も参考にしてください。

・短く書く方法との違い

たとえば、次のように短く書くこともできます。

Workbooks.Open "C:\Data\" & Dir("C:\Data\売上_*.xlsx")

ただし、この書き方では、該当ファイルがない場合にエラーが発生しやすくなります。

また、どのファイルが開かれたのか確認しづらく、フォルダや条件を変更するときも読み間違いが起きやすくなります。

実務では、短さよりも「あとから見ても処理の意味が分かること」を優先した方が安全です。


✅ ワイルドカードで複数ファイルがある場合の注意点

ワイルドカードを使うと、条件に一致するファイルが複数見つかることがあります。
たとえば「売上_*.xlsx」という条件では、「売上_202501.xlsx」も「売上_202502.xlsx」も一致します。
このとき、Dir関数で最初に取得されるファイルが、必ずしも自分が開きたい最新ファイルとは限りません。
ここを見落とすと、古いファイルを開いて処理してしまう危険があります。
業務データを扱う場合、誤ったファイルを開くことは集計ミスや資料ミスにつながります。
ワイルドカードを使う場合は、「1件だけ見つかればよい」のか「複数から選ぶ必要がある」のかを先に決めておくことが大切です。

・Dir関数で複数ファイルを順番に取得するコード

Dir関数は、最初に検索条件を指定したあと、引数なしで再度呼び出すと次の該当ファイルを取得できます。

以下のコードでは、条件に一致するファイルを順番に確認し、一覧としてイミディエイトウィンドウに出力します。

このように、いきなり開くのではなく、まず該当ファイルを確認する処理を入れておくと安全です。
特にワイルドカードの条件が広い場合は、想定外のファイルまで対象になることがあります。
処理対象を確認できる形にしておくことで、実務での誤操作を防ぎやすくなります。

Option Explicit

Sub ListFilesByWildcard()

    Dim targetFolderPath As String
    Dim searchPattern As String
    Dim matchedFileName As String
    
    targetFolderPath = "C:\Data\"
    searchPattern = "売上_*.xlsx"
    
    matchedFileName = Dir(targetFolderPath & searchPattern)
    
    Do While matchedFileName <> ""
        Debug.Print matchedFileName
        
        '次の該当ファイルを取得
        matchedFileName = Dir()
    Loop
    
End Sub

・複数ファイルがある場合の判断方法

複数ファイルがある場合は、次のような判断が必要です。

  1. 最初に見つかったファイルを開く
  2. 更新日時が新しいファイルを開く
  3. ファイル名に含まれる日付で判断する
  4. 該当ファイルを一覧化してユーザーに選ばせる
  5. 条件に一致するファイルをすべて開く

どれが正解というより、業務の目的に合わせて選ぶことが重要です。

たとえば毎月の売上ファイルを処理するなら、ファイル名に年月が含まれていることが多いため、年月で判断する設計が向いています。

一方で、毎日出力されるCSVを処理する場合は、更新日時の新しいファイルを対象にする方が自然な場合もあります。

条件に一致するファイルが複数ある場合は、いきなり開くのではなく、まず対象ファイルを一覧化して確認した方が安全なケースもあります。フォルダ内のファイル名を取得してExcelへ出力する方法については、【VBA】フォルダ内のファイル名を順番に取得してExcelに書き出す方法|Dir・FSOで一覧化も参考にしてください。

・最初の1件だけ開くときのリスク

Dir関数で最初に見つかったファイルをそのまま開くコードは簡単です。

しかし、フォルダ内に似た名前のファイルが増えると、意図しないファイルを開く可能性があります。

たとえば、次のようなファイルが同じフォルダにある場合です。

売上_202501.xlsx
売上_202502.xlsx
売上_バックアップ.xlsx

「売上_*.xlsx」ではすべて一致してしまいます。

業務で使う場合は、検索条件をできるだけ具体的にすることが大切です。


✅ 最新ファイルをワイルドカードで開く実務向けコード

実務では、条件に一致する複数ファイルの中から「最新のファイルを開きたい」というケースがよくあります。
毎日出力されるレポートや、月次で作成される売上ファイルなどでは、ファイル名が変わっても最新のものだけを開けると便利です。
ただし、最新ファイルを開く処理は、単にDir関数で最初に見つかったファイルを開くよりも少し慎重に作る必要があります。
どのファイルを最新と判断するのか、該当ファイルがない場合にどうするのかを明確にしておかないと、誤ったファイルを処理する原因になります。
ここでは、更新日時を基準にして最新ファイルを開くコードを紹介します。
手作業でファイルを探す手間を減らしたい場合に役立ちます。

・更新日時が最も新しいファイルを開くコード

以下のコードでは、ワイルドカードに一致するファイルを順番に確認し、更新日時が最も新しいファイルを開きます。

単に最初の1件を開くのではなく、すべての候補を確認してから開く設計にしています。
これにより、フォルダ内に複数ファイルがあっても、更新日時を基準に対象を選べます。
また、該当ファイルがなかった場合はメッセージを表示して処理を終了するため、原因が分からないままエラーになることを防げます。

Option Explicit

Sub OpenLatestWorkbookByWildcard()

    Dim targetFolderPath As String
    Dim searchPattern As String
    Dim matchedFileName As String
    Dim currentFilePath As String
    Dim latestFilePath As String
    Dim latestModifiedDate As Date
    
    targetFolderPath = "C:\Data\"
    searchPattern = "売上_*.xlsx"
    
    matchedFileName = Dir(targetFolderPath & searchPattern)
    
    Do While matchedFileName <> ""
        
        currentFilePath = targetFolderPath & matchedFileName
        
        '初回、または現在のファイルの更新日時が新しい場合に保持
        If latestFilePath = "" Or FileDateTime(currentFilePath) > latestModifiedDate Then
            latestFilePath = currentFilePath
            latestModifiedDate = FileDateTime(currentFilePath)
        End If
        
        '次の該当ファイルを取得
        matchedFileName = Dir()
        
    Loop
    
    If latestFilePath = "" Then
        MsgBox "条件に一致するファイルが見つかりませんでした。", vbExclamation
        Exit Sub
    End If
    
    Workbooks.Open Filename:=latestFilePath
    
End Sub

・更新日時で判断するメリット

更新日時を基準にすると、ファイル名に日付が入っていなくても最新ファイルを選べます。

たとえば、システムから出力されるファイル名が毎回似ている場合に便利です。

売上データ.xlsx
売上データ (1).xlsx
売上データ (2).xlsx

このようなファイルでも、更新日時を使えば新しいものを判断できます。

・実務で気をつけたいポイント

更新日時を基準にする場合、注意点もあります。

たとえば、古いファイルを開いて保存し直すと、そのファイルの更新日時が新しくなります。

つまり、必ずしも「業務上の最新データ」と「更新日時が最新のファイル」が一致するとは限りません。

月次ファイルや日次ファイルのように、ファイル名に日付が入っている場合は、ファイル名の日付で判断した方が安全なケースもあります。


✅ ワイルドカードでファイルを開くときに起きやすいエラー

ワイルドカードを使ったファイル操作は便利ですが、条件の指定を間違えると想定外の結果になります。
特にファイル操作では、エラーが起きたときに原因が分かりにくくなりがちです。
「ファイルがあるのに見つからない」「違うファイルが開いた」「拡張子が一致しない」といった問題は実務でもよくあります。
こうしたトラブルを防ぐには、ワイルドカードの使い方だけでなく、フォルダパスや拡張子の指定も丁寧に確認する必要があります。
コードを作る段階でエラーになりやすいポイントを押さえておくと、後から修正する手間を減らせます。
ここでは、特に起きやすい失敗例を整理します。

・フォルダパスの最後に区切り文字がない

次のようにフォルダパスの最後に「\」がないと、正しいパスになりません。

targetFolderPath = "C:\Data"
searchPattern = "売上_*.xlsx"

この状態で結合すると、次のようになります。

C:\Data売上_*.xlsx

正しくは次のようにします。

targetFolderPath = "C:\Data\"

フォルダパスを変数に入れる場合は、最後の区切り文字を含めるか、結合時に補うようにしましょう。

・拡張子の指定が合っていない

Excelファイルには複数の拡張子があります。

.xlsx
.xlsm
.xls
.csv

たとえば、マクロ有効ブックを探したいのに「*.xlsx」と指定していると、xlsmファイルは見つかりません。

複数の拡張子に対応したい場合は、条件を分けて検索する必要があります。

・検索条件が広すぎる

次のような条件は便利ですが、対象が広くなりすぎることがあります。

*.xlsx

この条件では、フォルダ内のすべてのxlsxファイルが対象になります。

業務で使う場合は、次のように一部のキーワードを入れた方が安全です。

売上_*.xlsx

対象ファイルの命名ルールを決めておくと、VBAでの自動化も安定します。

・ファイルがすでに開かれている

対象ファイルがすでに開かれている場合、Workbooks.Openの動作に注意が必要です。

同じファイルを二重に開こうとすると、意図しないメッセージが出たり、読み取り専用になったりする場合があります。

実務では、処理対象のファイルがすでに開かれていないかを確認する設計にすると安心です。


 

✅ ワイルドカードを使うVBAを安全に設計するコツ

ワイルドカードを使う処理は便利な反面、条件が曖昧になりやすい特徴があります。
そのため、実務では「とりあえず一致したファイルを開く」だけでは不十分な場合があります。
特に売上データや請求データなど、間違ったファイルを開くと影響が大きい業務では、検索条件の明確化が重要です。
また、あとから別の人がコードを読む可能性も考えると、処理の目的が分かる書き方にしておく必要があります。
コードを短くすることよりも、条件・判断基準・例外処理を分かりやすく残すことが、実務では大きなメリットになります。
最後に、ワイルドカードを安全に使うための設計ポイントを確認しておきましょう。

・検索条件をできるだけ具体的にする

ワイルドカードは便利ですが、条件が広すぎると誤ったファイルを対象にする可能性があります。

悪い例です。

*.xlsx

良い例です。

売上_2025*.xlsx

さらに、月次処理なら年月まで条件に含めると安全です。

売上_202501*.xlsx

対象ファイルの命名ルールが安定しているほど、VBAの処理も安定します。

・見つからない場合の処理を必ず入れる

ファイル操作では、対象ファイルが存在しないこともあります。

  • ファイル名が変更された
  • 保存場所が違う
  • 拡張子が違う
  • まだ出力されていない

このようなケースを想定し、見つからない場合はメッセージを表示して処理を止めるようにしましょう。

エラーを無視して処理を続けると、後続処理で原因が分かりにくくなります。

・開く前に対象ファイル名を確認する

実務では、開く前に対象ファイルを確認する設計も有効です。

たとえば、次のようにメッセージを出す方法があります。

MsgBox "次のファイルを開きます。" & vbCrLf & latestFilePath, vbInformation

自動化に慣れていない環境では、いきなり処理を進めるよりも、確認メッセージがある方が安心して使えます。

・大量処理ではApplication設定も検討する

複数ファイルを連続で開いて処理する場合は、画面更新や計算設定を一時的に制御すると処理が速くなる場合があります。

ただし、設定を変更した場合は、最後に元へ戻す設計が重要です。

途中でエラーが起きたときに設定が戻らないと、Excelの動作に影響が残ることがあります。


✅ まとめ:VBAでワイルドカードを使えば変動するファイル名にも対応できる

VBAでファイルを開くときにワイルドカードを使うと、日付や番号が変わるファイルにも対応しやすくなります。

特に、毎月・毎日出力されるデータを自動で開きたい場合に便利です。

  • ワイルドカードの「*」は任意の文字列を表す
  • Workbooks.Openには実在するフルパスを指定する
  • ワイルドカード検索にはDir関数を使う
  • Dir関数で取得できるのはファイル名のみ
  • フォルダパスとファイル名を結合して開く
  • 複数ファイルが一致する場合は判断基準が必要
  • 最新ファイルを開く場合は更新日時やファイル名の日付で判断する
  • 該当ファイルがない場合の処理を必ず入れる
  • 検索条件はできるだけ具体的にする

ワイルドカードを使ったファイル操作を覚えると、毎回ファイル名を手で変更する手間を減らせます。

ただし、条件が広すぎると誤ったファイルを開く可能性もあるため、検索条件・例外処理・確認処理を含めて設計することが大切です。

まずは1件だけ開く処理から試し、慣れてきたら最新ファイルの取得や複数ファイル処理へ応用してみてください。

    -VBAで自動化, VBA一覧, ファイル・印刷操作, ファイル操作