任意のフォルダに存在するすべてのファイル名を取得するには、Dir関数にワイルドカードを指定します。次のコードは、C:\Sampleフォルダに存在するすべての「*.xlsx」をアクティブシートに書き出します。
Sub Sample1() Dim buf As String, cnt As Long Const Path As String = "C:\Sample\" buf = Dir(Path & "*.xlsx") Do While buf <> "" cnt = cnt + 1 Cells(cnt, 1) = buf buf = Dir() Loop End Sub
Dir関数にワイルドカードを指定して実行すると、まずそのワイルドカードに一致するファイル名が返ります。次に、Dir関数の引数を省略して実行すると、前回に指定されたワイルドカードが指定されたものとしてファイルを探します。そのとき、すでに見つかったファイル(Dir関数が返したファイル)は除外されます。そして、ワイルドカードに一致するすべてのファイルが返ると、Dir関数は空欄("")を返します。
ディスクのフォーマットによって異なります。最近主流のNTFSでフォーマットされているディスクでは、ファイルが保存された順番(タイムスタンプ)にかかわらず、ファイル名の順番(昇順)で返ります。
たとえば、次の順番でファイルを保存したとします。
これらのファイルをDir関数で取得してみましょう。
Sub Sample2() Dim buf As String, cnt As Long Const Path As String = "C:\Sample\" buf = Dir(Path & "*.xlsx") Do While buf <> "" cnt = cnt + 1 Cells(cnt, 1) = buf Cells(cnt, 2) = FileDateTime(Path & buf) buf = Dir() Loop End Sub
ファイルを保存した時間にかかわらず、ファイル名の順番で取得されます。
一方、FATと呼ばれる形式でフォーマットでされたディスクでは、ファイル名の順番ではなく、ディスクに保存された順番で返ります。最近の大容量ハードディスクでは、NTFSでフォーマットされることが一般的ですが、USBメモリなどはFAT形式でフォーマットされていることもあります。
上記と同じコードで、FAT形式でフォーマットされたUSBメモリ内のフォルダからファイルの一覧を取得すると、次のようになります。
ちなみに、こうした順番は、コマンドラインでdirを実行したときも同じ結果になります。
NTFS
FAT
FileSystemObjectを使って、フォルダ内のファイル一覧を取得することもできます。なお、FileSystemObjectに関しては下記ページをご覧ください。
Sub Sample3() Dim f As Object, cnt As Long With CreateObject("Scripting.FileSystemObject") For Each f In .GetFolder("C:\Sample").Files cnt = cnt + 1 Cells(cnt, 1) = f.Name Cells(cnt, 2) = f.DateCreated Next f End With End Sub