ExcelVBAを使ってフォルダ内の複数ファイルを処理する際、「ファイル名が毎回異なるけれど、特定のパターンには一致する」というケースは非常に多く見られます。こうした状況では、VBAにおけるワイルドカード(*や?)の活用が不可欠です。本記事では、ExcelVBAで「ワイルドカードを使ってファイルを開く方法」について、実用的なコード例とともに詳しく解説します。
目次
✅ ExcelVBAで使えるワイルドカードとは?
まず、VBAでのワイルドカード指定について理解しておきましょう。ワイルドカードとは、特定のパターンに一致する文字列を柔軟に指定できる記号のことです。VBAでは、以下の2種類の記号が代表的です。
*
(アスタリスク):任意の文字列に一致(例:"data*.xlsx" → "data1.xlsx", "data_2024.xlsx"など)?
(クエスチョン):任意の1文字に一致(例:"data?.xlsx" → "data1.xlsx", "dataA.xlsx"など)
これらを利用することで、「ファイル名の一部しか分からないけれど対象ファイルを開きたい」というニーズに対応可能です。
✅ VBAでワイルドカードを使ってファイルを開く基本構文
VBAでファイルを開くには、通常は Workbooks.Open
メソッドを使用します。しかし、Workbooks.Open
では直接ワイルドカードを指定できないため、ファイル名の検索にはDir関数を併用します。
以下に、ワイルドカードでファイルを検索して開く基本的な構文を紹介します。【Excel】CSVファイルをExcelで開く設定方法|正しく開いて文字化けやデータ崩れを防ぐ
Sub OpenFileWithWildcard()
Dim folderPath As String
Dim fileName As String
Dim fullPath As String
' 対象フォルダのパスを指定(最後に「\」を忘れずに)
folderPath = "C:\Users\YourName\Documents\Reports\"
' ワイルドカードを含めたファイル名パターンを指定
fileName = Dir(folderPath & "report_*.xlsx")
' ファイルが見つかったか確認
If fileName <> "" Then
fullPath = folderPath & fileName
Workbooks.Open fullPath
MsgBox "ファイルを開きました:" & fileName
Else
MsgBox "該当するファイルが見つかりませんでした。"
End If
End Sub
コード解説
Dir
関数で、指定フォルダ内に存在する「report_」で始まるExcelファイルを検索します。- 該当ファイルが存在すれば、そのパスを
Workbooks.Open
で開きます。
✅ 複数ファイルをワイルドカードで一括処理する方法
ワイルドカードで一致するすべてのファイルを処理したい場合は、Dir
関数をループで使います。
Sub OpenAllMatchingFiles()
Dim folderPath As String
Dim fileName As String
Dim fullPath As String
folderPath = "C:\Users\YourName\Documents\Reports\"
fileName = Dir(folderPath & "report_*.xlsx")
Do While fileName <> ""
fullPath = folderPath & fileName
Workbooks.Open fullPath
MsgBox "ファイルを開きました:" & fileName
' 次のファイルを取得
fileName = Dir
Loop
End Sub
この処理では、「report_」で始まるすべてのファイルを順番に開いて処理できます。
✅ ファイルを開くだけでなくデータをコピー
ファイルを開いたあと、特定のシートからデータをコピーして、マスターブックに貼り付ける処理にも活用できます。
Sub ImportDataFromMatchingFiles()
Dim folderPath As String
Dim fileName As String
Dim wb As Workbook
Dim ws As Worksheet
Dim masterWS As Worksheet
Dim lastRow As Long
folderPath = "C:\Users\YourName\Documents\Reports\"
fileName = Dir(folderPath & "report_*.xlsx")
Set masterWS = ThisWorkbook.Sheets("集計")
Do While fileName <> ""
Set wb = Workbooks.Open(folderPath & fileName)
Set ws = wb.Sheets(1)
lastRow = masterWS.Cells(Rows.Count, 1).End(xlUp).Row + 1
ws.Range("A1:D10").Copy masterWS.Cells(lastRow, 1)
wb.Close SaveChanges:=False
fileName = Dir
Loop
MsgBox "すべてのデータを集計シートに取り込みました。"
End Sub
このマクロでは、フォルダ内の「report_」で始まるすべてのファイルを開き、シート1のA1:D10のデータを集計シートに順次貼り付けています。
■よくあるエラーと対処法
エラー1:Dirがファイルを見つけられない
原因:パスの最後に「\」が抜けている、またはワイルドカードの記述ミス。
対処:folderPath = "C:\Users\YourName\Documents\"
のように末尾のスラッシュを忘れないこと。また、ファイル名のパターン(例:"*.xlsx")も正確に記述する必要があります。
エラー2:ファイルが開かない or 空のファイルが対象になる
原因:アクセス権限、ファイルがすでに開かれている、一時ファイル(例:~$〇〇.xlsx)が対象になっている可能性。
対処:一時ファイルをスキップする条件を加えることで改善可能です。
If Left(fileName, 2) <> "~$" Then
' ファイルを開く処理
End If
■ワイルドカードの使いどころと注意点
活用シーン
- 日付や時刻付きのファイル名(例:"sales_202406.xlsx")を毎月処理したい
- 担当者ごとに分かれたファイル(例:"担当A_report.xlsx")を一括処理したい
- 特定のファイル形式(例:"*.csv")をまとめて読み込みたい
注意点
Dir
関数は状態を保持するため、他のファイル処理と混在すると正常動作しない場合があります。必要であれば都度変数をリセットしてください。- ワイルドカードを使って一致した最初のファイルのみを対象に処理したい場合は、ループではなく1回だけ
Dir
を使います。
■まとめ
ExcelVBAにおける「ファイルを開く ワイルドカード」の活用は、業務効率化に欠かせないテクニックです。Dir
関数と組み合わせることで、特定の名前パターンに一致するファイルを自動で開いたり、まとめて処理したりすることが可能になります。日々の定型業務や定期的なレポート処理など、さまざまな業務に応用できるため、ぜひ活用してみてください。
今後、さらに柔軟なファイル管理を目指すなら、日付やファイルサイズの条件指定などを追加した高度なフィルタリングも視野に入れてみましょう。