【VBA】ワイルドカードでファイル指定を完全に自動化するマクロの作り方

 

複数のエクセルファイルを毎回手作業で開いて、コピペして、閉じる、という作業を繰り返していませんか?

 

VBAを使えば、フォルダ内のファイルを自動で検索・指定し、コピペ作業をボタン1クリックで完了させることができます。

この記事では、VBAのワイルドカードを使ったファイル指定の方法を、プログラミング初心者でもわかりやすく解説。

 

私は年間50件ほどのエクセルマクロ開発を受注していますが、「ブックを開いて、コピペして、閉じる」という作業の自動化は依頼の中でも特に多いテーマのひとつです。

実際に依頼を受けて開発したマクロでも、ワイルドカードを使ったファイル指定のテクニックは欠かせません。

ワイルドカードとは何か、どう使えばよいのか、実際のVBAコードを交えながら丁寧に紹介していきます。

 

広告

手作業のファイル操作が招く3つの問題点

エクセル業務でよく聞く悩みのひとつが、「毎日同じフォルダを開いて、同じファイルをひとつひとつ確認する」という作業の非効率さです。

月次・週次で繰り返されるルーティーン作業ほど、VBAによる自動化の恩恵を受けやすい。

 

手作業でファイルを操作し続けると、具体的に次の3つの問題が起きます。

 

問題①:ファイルを開くだけで時間をロスする

フォルダ内に10個、20個とファイルが増えてくると、ひとつずつ開いて確認するだけで相当な時間がかかります。

 

私が以前対応した依頼では、毎朝20〜30個のファイルを手作業で開いて集計する作業に30分以上かかっていたというケースがありました。

このようなルーティーン作業はVBAを使って自動化してしまうことがおすすめ。

ボタン1クリックで3分以内に完了させることができるケースがほとんどです。

 

問題②:ファイルを間違えるコピペミスが発生する

手作業で複数のファイルを開いてコピペしていると、「間違ったシートからコピーしてしまった」「ファイルを閉じ忘れた」というミスが起きやすくなります。

こういったミスは、データの信頼性を損なうだけでなく、後から修正する手間も発生します。

 

VBAで自動化すれば、毎回決まった手順でファイルを操作するため、コピペミスは原理的に発生しません。

 

問題③:ファイルが増えるたびに作業量も増える

手作業の場合、ファイルが1つ増えるたびに作業ステップも1つ増えます。

一方、VBAであればフォルダ内のファイルをすべて自動的に処理する仕組みにしておけば、ファイルが100個に増えても作業時間はほとんど変わりません。

スケールする仕組みを最初から作っておくことが、業務効率化の鍵といえます。

 

VBAのワイルドカードとは?初心者でもわかる基本の仕組み

「ワイルドカード」という言葉は聞いたことがあっても、VBAで実際に使ったことはないという方も多いと思います。

難しそうに聞こえますが、仕組みはとてもシンプルです。

 

ワイルドカードの「*(アスタリスク)」とは何か

ワイルドカードとは、ファイル名や文字列の一部を「何でもよい」という意味で置き換えるための特殊な記号です。

 

VBAでよく使うワイルドカードは「*(アスタリスク)」で、これは「任意の文字列」を意味します。

たとえば「*.xlsx」と指定すると、「拡張子が.xlsxのすべてのファイル」という意味。

 

「売上*.xlsx」と指定すれば、「売上」から始まる拡張子.xlsxのファイルすべてを対象にする、となります。

ワイルドカードはファイルを操作するマクロに非常に有効なテクニックなので自由に扱えるようにしておきましょう。

 

関連記事「バラバラに保存された大量のエクセルファイルをボタン1クリックで集約するマクロ」では、ワイルドカードが使われたマクロをダウンロードすることができます。

 

 

実際にマクロを動かしてワイルドカードの便利さを体感してみてください。

 

VBAでワイルドカードを使う場面とは

ワイルドカードをVBAで活用するのは、主にDir関数を使ってフォルダ内のファイルを取得するときです。

Dir関数は、指定したパスとファイル名のパターンに一致する最初のファイル名を返す組み込み関数で、ワイルドカードと組み合わせることで、条件に合ったファイルを順番に取得できます。

 

具体的な使い場面として、次のようなケースがあります。

  • 拡張子が「.xlsm」のファイルだけを処理したい
  • 拡張子が「.xlsx」のファイルだけを処理したい
  • 特定のキーワードを含むファイルだけを処理したい

 

私が受注したマクロ開発でも、「フォルダ内の全ブックの全シートをマスターファイルにコピペする」という処理を実装する際に、ワイルドカードを使ってファイルを絞り込みました。

 

【実例付き】VBAワイルドカードを使ってファイルを指定する方法

こからは、実際のVBAコードを交えて、ワイルドカードを使ったファイル指定の方法を紹介します。

サンプルとして、フォルダ内にある複数のエクセルファイルを自動で開き、シートのデータをまとめてコピペするという処理を想定します。

 

サンプル事例①:拡張子「.xlsx」のファイルだけを処理するVBA

まず、フォルダ内に「.xlsx」ファイルと「.xlsm」ファイルが混在しているケースを考えます。

 

「.xlsx」ファイルだけを対象にして処理したい場合のコードがこちら

Sub ワイルドカードでXLSXだけ処理()

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\ユーザー名\Desktop\データフォルダ\"

' 転記先シートを指定
Set masterWs = ThisWorkbook.Worksheets("まとめ")

' ワイルドカードで「*.xlsx」のファイルを検索
fileName = Dir(folderPath & "*.xlsx")

' ファイルが見つかる限りループ処理
Do While fileName <> ""

' 対象ファイルを開く
Set wb = Workbooks.Open(folderPath & fileName)

' ファイル内の最初のシートを処理対象に指定
Set ws = wb.Worksheets(1)

' まとめシートの最終行を取得
lastRow = masterWs.Cells(Rows.Count, 1).End(xlUp).Row + 1

' シートのデータをまとめシートにコピー
ws.UsedRange.Copy masterWs.Cells(lastRow, 1)

' 処理が終わったファイルを保存せずに閉じる
wb.Close SaveChanges:=False

' 次のファイルを検索
fileName = Dir()

Loop

MsgBox "すべてのファイルの処理が完了しました。", vbInformation

End Sub

 

コードの流れを解説します。

 

まず folderPath で対象フォルダのパスを指定します。

次に Dir(folderPath & “*.xlsx") で、フォルダ内にある「.xlsx」拡張子のファイルを検索し、最初に見つかったファイル名を変数 fileName に格納します。

Do While fileName <> “" のループで、ファイルが見つかる間ずっと処理を繰り返します。

Workbooks.Open でファイルを開き、UsedRange.Copy でデータをコピーしてまとめシートに貼り付けます。

wb.Close SaveChanges:=False でファイルを保存せずに閉じたあと、fileName = Dir() で次のファイルを検索します。

Dir() を引数なしで呼び出すと、前回の検索条件を引き継いで次のファイルを返してくれます。

ファイルがなくなると Dir() は空文字を返すので、ループが終了するという仕組みです。

 

サンプル事例②:拡張子「.xlsm」のファイルだけを処理するVBA

「.xlsm」はマクロ有効ブックの拡張子です。

フォルダ内にマクロ有効ブックだけを対象にしたい場合は、ワイルドカードの部分を「*.xlsm」に変えるだけで対応できます。

Sub ワイルドカードでXLSMだけ処理()

Dim folderPath As String
Dim fileName As String
Dim wb As Workbook

folderPath = "C:\Users\ユーザー名\Desktop\データフォルダ\"

' 「*.xlsm」に変更するだけで対象ファイルが切り替わる
fileName = Dir(folderPath & "*.xlsm")

Do While fileName <> ""

Set wb = Workbooks.Open(folderPath & fileName)

MsgBox wb.Name & " を開きました。"

wb.Close SaveChanges:=False

fileName = Dir()

Loop

MsgBox "処理が完了しました。", vbInformation

End Sub

 

基本的な構造は事例①とまったく同じです。

 

Dir関数のワイルドカード部分を「*.xlsx」から「*.xlsm」に変えるだけで、処理対象ファイルをマクロ有効ブックだけに絞り込めます。

この切り替えのシンプルさがワイルドカードの最大のメリットです。

 

サンプル事例③:特定のキーワードを含むファイルだけを処理するVBA

「売上」「報告書」「月次」のような特定のキーワードを含むファイルだけを処理したい場合も、ワイルドカードで対応できます。

Sub キーワード含むファイルだけ処理()

Dim folderPath As String
Dim fileName As String
Dim keyword As String

folderPath = "C:\Users\ユーザー名\Desktop\データフォルダ\"

'「売上」を含むxlsxファイルだけを対象にする
keyword = "売上"
fileName = Dir(folderPath & "*" & keyword & "*.xlsx")

Do While fileName <> ""

MsgBox "処理対象ファイル:" & fileName

fileName = Dir()

Loop

MsgBox "検索が完了しました。", vbInformation

End Sub

 

“*" & keyword & “*.xlsx" という書き方がポイントです。

変数 keyword に「売上」と入れることで、「売上」という文字を含むすべての.xlsxファイルが対象になります。

キーワードを変数にしておくことで、処理対象を変更したいときは keyword の中身を書き換えるだけ。

メンテナンスしやすいコードを書くという意味でも、このような変数化は習慣にしておくのがおすすめです。

 

ワイルドカードVBAを使う際に知っておきたい注意点

ワイルドカードを使ったVBAは非常に便利ですが、いくつか押さえておくべき注意点があります。

「処理が止まった」「想定外のファイルまで処理されてしまった」というトラブルに対応できるようポイントを抑えておきましょう。

 

注意点①:フォルダパスの末尾にバックスラッシュを忘れない

Dir関数でフォルダを指定するとき、パスの末尾に「\」(バックスラッシュ)がないとエラーになります。

folderPath = “C:\Users\ユーザー名\Desktop\データフォルダ\" のように、必ず末尾に「\」をつける習慣をつけておきましょう。

 

エラーが出たときに真っ先に確認したい箇所のひとつです。

 

注意点②:マクロを設定したファイル自身も処理対象になる場合がある

マクロが設定されたファイル(.xlsm)を対象に「*.xlsm」で検索すると、マクロを実行しているファイル自体も検索対象に含まれることがあります。

これを防ぐために、「処理前にファイル名の比較を行い自分自身のブックは除外する処理」を入れておきましょう。

'自分自身のファイルを除外する
If fileName <> ThisWorkbook.Name Then
' 処理を実行
End If

 

ThisWorkbook.Name で実行中のファイル名を取得できます。

If文で比較し、一致した場合はスキップするという処理を入れておくだけで、このトラブルを回避することが可能。

 

注意点③:処理対象ファイルが0件のときの対処

Dir関数で検索したとき、条件に合うファイルが1件も見つからない場合、fileName は最初から空文字になります。

 

その状態でループに入ることはありませんが、「ファイルが見つかりませんでした」というメッセージを出しておくと、ユーザーが混乱せずに済みます。

fileName = Dir(folderPath & "*.xlsx")

If fileName = "" Then
MsgBox "対象ファイルが見つかりませんでした。フォルダを確認してください。", vbExclamation
Exit Sub
End If

処理の最初にこのチェックを入れておくと、ファイルが存在しないケースでも安全に処理を終了できます。

 

フォルダを指定してワイルドカードでファイル操作するVBAの全体像

ここまでの内容を踏まえて、実務で使えるレベルに仕上げた完成版のVBAコードを紹介します。

 

フォルダ内の全「.xlsx」ファイルを順番に開き、全シートのデータをまとめシートにコピペして閉じる、というコードがこちら

Sub フォルダ内全XLSXをまとめるマクロ()

Dim folderPath As String
Dim fileName As String
Dim wb As Workbook
Dim ws As Worksheet
Dim masterWs As Worksheet
Dim lastRow As Long
Dim i As Integer

' 転記先(まとめシート)を設定
Set masterWs = ThisWorkbook.Worksheets("まとめ")

' 処理前にまとめシートを初期化(ヘッダーを残して2行目以降をクリア)
masterWs.Rows("2:" & masterWs.Rows.Count).ClearContents

' 対象フォルダのパスを指定(末尾の「\」を忘れずに)
folderPath = "C:\Users\ユーザー名\Desktop\データフォルダ\"

' 条件に合うファイルが存在するか確認
fileName = Dir(folderPath & "*.xlsx")

If fileName = "" Then
MsgBox "対象ファイルが見つかりませんでした。", vbExclamation
Exit Sub
End If

' 条件に合うファイルをすべて処理
Do While fileName <> ""

' 自分自身のファイルを除外
If fileName <> ThisWorkbook.Name Then

Set wb = Workbooks.Open(folderPath & fileName)

' ファイル内の全シートをループ処理
For i = 1 To wb.Worksheets.Count

Set ws = wb.Worksheets(i)

' まとめシートの最終行を取得して転記先行を決定
lastRow = masterWs.Cells(masterWs.Rows.Count, 1).End(xlUp).Row + 1

' シートのデータをまとめシートにコピー
ws.UsedRange.Copy masterWs.Cells(lastRow, 1)

Next i

' 処理済みファイルを保存せずに閉じる
wb.Close SaveChanges:=False

End If

fileName = Dir()

Loop

Application.CutCopyMode = False

MsgBox "すべてのファイルの処理が完了しました。", vbInformation

End Sub

 

コードの流れを解説します。

まず、転記先となる「まとめ」シートを Set masterWs で指定し、前回の処理データが残らないように2行目以降をクリアします。

Dir関数で「*.xlsx」に一致するファイルを検索し、見つからなければメッセージを出して処理を終了します。

Do Whileループでファイルが見つかる限り繰り返し処理を行い、自分自身のファイルはスキップします。

 

ファイルを開いたあと、For i ループでファイル内の全シートを順番に処理します。

各シートの UsedRange(使用範囲全体)をコピーして、まとめシートの最終行の次の行から貼り付けます。

処理が終わったら wb.Close SaveChanges:=False で保存せず閉じ、次のファイルを Dir() で検索します。

 

この一連の処理がすべてのファイルに対して自動で繰り返されるため、手作業でのコピペ作業が完全に不要となるのです。

 

ワイルドカード以外に、テキストを別シートに転記するコードが使われています。

関連記事「別シートにテキストを自動転記」では、シートを指定するVBA、転記VBAが設定されたエクセルファイルをダウンロードすることが可能。

 

 

よく使われるVBAなので自由に扱えるようにしておきましょう。

 

まとめ ~ ワイルドカードを使ってファイル指定を自動化しよう ~

VBAのワイルドカードを使えば、フォルダ内のファイルを拡張子や名前のパターンで柔軟に絞り込み、処理を自動化することが可能です。

「*.xlsx」や「*.xlsm」のようにワイルドカードと拡張子を組み合わせるだけで、対象ファイルをピンポイントで指定できます。

 

毎日・毎週繰り返している「ブックを開いてコピペして閉じる」という作業は、今回紹介したVBAコードをベースにカスタマイズすれば、大半のケースで自動化が実現できます。

フォルダパスやワイルドカードの条件を変えるだけで、さまざまな業務に応用できるのもワイルドカードVBAの強みです。

ぜひ自分の業務に合わせてコードをカスタマイズしてみてください。

 

もし「自分の業務に合わせた複雑なチェック処理を実装したい」「既存のマクロを改良したい」といったご要望がありましたら、マメBlogのエクセルマクロ開発依頼にご相談ください。

 

 

業務内容に合わせたオーダーメイドマクロを設定させていただきます。

 

最後まで読んでいただきありがとうございました。

エクセルVBAを使って面倒なルーティーン作業を自動化しちゃいましょう。