【マクロVBA】Dir関数で指定フォルダから対象ファイル・ブックが存在するか確認、処理する!一覧も可

ブック操作

指定したフォルダにどのようなファイルが存在するか、対象のファイル・ブックが存在する
確認するためには「Dir関数」の知識が必要です。

指定フォルダにファイルが随時入ってきて、処理を繰り返す動作などにはよく使用されます。

さらに「ワイルドカード」との相性もよく、指定した文字を含むファイルのみ確認したいときや
Excelのファイル・PDFファイルなどファイル形式毎にも対応する方法を紹介していますので
是非参考にしてみてください。

それではみていきましょう!




■忙しい人向けのコピペ用プログラム

赤文字の見本を打ち換えて使用してください。

見本ではメッセージボックスですが、処理したい方法に合わせてカスタムして使用してください。

Sub Dir確認()
Dim Filename As String
Filename = Dir("C:\検証ファイル\ブックA.xlsx")
If Filename = "" Then
MsgBox "対象シートはありません"
Else
MsgBox "対象シートは存在します"
End If
End Sub

⬛︎こんなことができるようになる!

・指定フォルダから対象のファイルが存在するか確認することができる
・指定フォルダから指定した文字・数値を含むファイルのみを確認することができる
・指定フォルダから対象の拡張子のファイルを確認することができる

■忙しい人向けのコピペ用プログラム

「ファイルのパス」の部分に対象のファイルのパスを貼り付けると
変数Filenameに順次対象ファイル内のファイル名が格納されます。

Sub Dir全ファイル確認()

Dim Filename As String, WriteRow As Long

Filename = Dir(“ファイルのパス*.*”)

Do While Filename <> “”

Filename = Dir

Loop

End Sub

⬛︎関数の仕組み

出力先=Dir(pathname, [ attributes ] )

pathname…省略可。フォルダ名やファイル名を入力
attributes …省略可。ファイルの属性を入力

attributesの入力項目については下記表をご参照ください。

定数説明
vbNormal0(既定値) 属性のないファイル。
vbReadOnly1属性のないファイルと読み取り専用のファイル。
vbHidden2属性のないファイルと隠しファイル。
vbSystem4属性のないファイルとシステム ファイル。 Macintosh では使用できません。
vbVolume8ボリューム ラベル。他の属性を指定した場合は、vbVolume は無視されます。 Macintosh では使用できません。
vbDirectory16属性のないファイルとディレクトリまたはフォルダー。
vbAlias64指定されたファイル名はエイリアスです。 Macintosh でのみ使用できます。
引用元:Dir 関数 (Visual Basic for Applications) | Microsoft Docs

⬛︎指定フォルダ・ファイルから対象ファイルがあるか確認する

・対象のシートがあるか確認する

まず、対象シートがあるか確認したいと思います。
今回は見本で「検証ファイル」という名前のフォルダに「ブックA.xlsx」という

ファイルがあるか確認したいと思います。

では構文を見ていきましょう。


出力先=Dir(pathname, [ attributes ] )

それでは構文に当てはめてみましょう。
出力先を変数の「Filename」としました。
pathname」についてはフォルダとファイル名なので「C:\検証ファイル\ブックA」となります。

当てはめた構文はこちらです。

Filename = Dir(“C:\検証ファイル\ブックA.xlsx“)

「.xlsx」といった拡張子も入力するようにしてください。

では実際にプログラムを入力してみましょう。
プログラムはこちらです。

Sub Dir確認()

Dim Filename As String

Filename = Dir(“C:\検証ファイル\ブックA.xlsx”)

End Sub

では確認してみましょう。
Dir関数でファイルの有無を確認していますが、ファイルがあった場合は
ファイル名を出力します。反対にファイルがなければ空白を出力します。

そしてIFでファイル名を出力した変数「Filename」が空白だった場合は
「対象シートはありません」
のメッセージを表示し、空白でなければ
「対象シートは存在します」
のメッセージを表示させます。

プログラムはこのようになります。

Sub Dir確認()

Dim Filename As String

Filename = Dir(“C:\検証ファイル\ブックA.xlsx”)

If Filename = “” Then
MsgBox “対象シートはありません”
Else
MsgBox “対象シートは存在します”
End If

End Sub

結果はこのようになります。

変数「Filename」に対象のファイル名が格納され、「対象シートは存在します」のメッセージが出ました。

では「C:\検証ファイル」に存在しない「ブックD」があるか確認するパターンも見てみましょう。

実行した結果はこちらです。

変数「Filename」は空白のままなので、「対象シートはありません」のメッセージが出ました。

・対象フォルダにあるファイルを順に確認する

さきほどは対象フォルダに指定したファイルがあるか確認しました。
今度はファイルを固定せずに対象フォルダ内の全てのファイルを
確認してみたいとおもいます。

では、見本のプログラムから見てみましょう。

Sub Dir全ファイル確認()

Dim Filename As String, WriteRow As Long

Filename = Dir(“C:\検証ファイル*.xlsx”)
WriteRow = 1

Do While Filename <> “”

Cells(WriteRow, 1) = Filename
WriteRow = WriteRow + 1
Filename = Dir

Loop

End Sub

 

「Do While Filename <> “”」から「Loop」で
ファイル名が格納される変数「Filename」が空白になるまで
繰り返し処理
を行います。

【マクロVBA】Do…Loopで指定条件まで繰り返し・ループする!WhileとUntilの違いとは ► 独学エクセル塾 (dokugakuexcel.com)

ポイントは「Filename=Dir」についてです。
ループ前に「C:\検証ファイル」で対象フォルダのファイル名を抜き出していますが、
再度、「Filename=Dir」でファイル名を出力していますよね。

一度、Dirで読み取った場合、次に読み込むフォルダ引数なしの

「Dir」単体では出力していないファイルを順次出力していきます。
つまり、対象フォルダにあるファイルを順次確認できるといったプログラムになります。

 
ファイル名が「*.xlsx」となっていますがこちらは後ほど紹介します。

では実行していきましょう。
A1セルから読み取ったファイルを順次書き込んでいきます。

実行した結果はこちらです。

A列に指定フォルダ「C:\検証ファイル」の中にある「.xlsx」ファイルを書き出しすることができました。

・指定文字を含むファイルのみ確認する

先程の応用になります。
前回は対象フォルダ内の全ファイルを確認しましたが
今回は指定文字を含むファイルのみ確認したいと思います。

使用するのは「✳︎(ワイルドカード)」になります。
先ほどもファイル名を「*.xlsx」として使用していました。

機能として、ワイルドカードを入力すると全ての文字数値を対象としてくれます。

 
例えば「A」を含むファイルを確認したい場合は「✳︎A✳︎」となります。
さらに「頭文字をBとし、それ以降の文字・数値は全て対象
という場合には「B✳︎」となります。

こちらを応用して先程のプログラムに書き込んでみたいと思います。

今回は「ブック」という文字を含むファイルを確認しましょう。
プログラムはこのようになります。

Sub Dir全ファイル確認()

Dim Filename As String, WriteRow As Long

Filename = Dir(“C:\検証ファイル*ブック*”)
WriteRow = 1

Do While Filename <> “”

Cells(WriteRow, 1) = Filename
WriteRow = WriteRow + 1
Filename = Dir

Loop

End Sub

実行した結果はこちら。

「ブック」という文字を含むファイルを確認できましたね。

先程はブック名でしたが拡張子でも絞り込みが可能です。
条件を「✳︎.pdf」としてみましょう。

Sub Dir全ファイル確認()

Dim Filename As String, WriteRow As Long

Filename = Dir(“C:\検証ファイル*.pdf“)
WriteRow = 1

Do While Filename <> “”

Cells(WriteRow, 1) = Filename
WriteRow = WriteRow + 1
Filename = Dir

Loop

End Sub

実行した結果はこちらです。

「PDF」のファイルを確認することができました。

⬛︎読み取り専用などファイルの属性を絞って確認する。

ファイルの属性には読み取り専用ファイルや隠しファイル
など存在します。

その属性を絞ってもファイルを確認することができます。
では再度、構文をみてみましょう。

出力先=Dir(pathname, [ attributes ] )

今回は「attributes」の部分が該当します。
では下の表をご覧ください。

定数説明
vbNormal0(既定値) 属性のないファイル。
vbReadOnly1属性のないファイルと読み取り専用のファイル。
vbHidden2属性のないファイルと隠しファイル。
vbSystem4属性のないファイルとシステム ファイル。 Macintosh では使用できません。
vbVolume8ボリューム ラベル。他の属性を指定した場合は、vbVolume は無視されます。 Macintosh では使用できません。
vbDirectory16属性のないファイルとディレクトリまたはフォルダー。
vbAlias64指定されたファイル名はエイリアスです。 Macintosh でのみ使用できます。
引用元:Dir 関数 (Visual Basic for Applications) | Microsoft Docs

入力する値としては「0,1,2,4,8,16,64」を入力し、
その番号に応じて属性を絞ってファイル確認をします。

入力を省略した場合は属性のないファイルが対象となります。

今回は見本で隠しファイルを作成してみたいと思います。
対象フォルダは先ほどと同様、「C:\検証ファイル」で「フォルダ」というファイルを含むファイルを書き出してみようと思います。

例として「ファイルB」というファイルは隠しファイルとしたいと思います

これで「ファイルB」が隠しファイルとなりました。

ではプログラムです。

Sub Dir全ファイル確認()

Dim Filename As String, WriteRow As Long

Filename = Dir(“C:\検証ファイル*.*”, 0)
WriteRow = 1

Do While Filename <> “”

Cells(WriteRow, 1) = Filename
WriteRow = WriteRow + 1
Filename = Dir

Loop

End Sub

attributes」を0属性のないファイルで実行してみましょう。
「ファイルB」は隠しファイルなので含まれず、残りのすべてのファイルが出力されました。

では「attributes」を「2」にして隠しファイルも確認するようにしましょう。

Sub Dir全ファイル確認()

Dim Filename As String, WriteRow As Long

Filename = Dir(“C:\検証ファイル*.*”, 2)
WriteRow = 1

Do While Filename <> “”

Cells(WriteRow, 1) = Filename
WriteRow = WriteRow + 1
Filename = Dir

Loop

End Sub

結果はこのようになります。

今度は「ファイルB」も出力してくれました。

これで属性の絞り込みもできますね。

⬛︎補足の知識

「出力先=Dir」で対象フォルダ内のファイルを
順次確認しましたが、日付順やファイル名順に抜き出し
たい方はファイルシステムの確認が必要
です。

確認方法としてPCの画面の「ローカルディスクC」を右クリックして
「プロパティ」を選択します。

項目の1つに「ファイル システム」があるので確認してみましょう。

いずれにしてもPCの設定で変わってしまうので
順を指定して処理したい場合は一度、変数やセルに格納して並び替えた後、
その順に処理するのが望ましいと思います。

⬛︎公式の説明


わかりやすいように説明したため公式と使用する語句が異なりますが
マイクロソフト公式の説明については下記のリンクを参照してください。☟
Dir 関数 (Visual Basic for Applications) | Microsoft Docs

⬛︎まとめ

いかがだったでしょうか。
Dirを身につけると、指定フォルダに該当するファイルの
処理が可能になります。

是非、参考にしてみてください。
それでは次回の記事でお会いしましょう。

コメント