ファイルの一覧を取得する


任意のフォルダに存在するすべてのファイル名を取得するには、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関数は空欄("")を返します。

Dir関数が返すファイルの順番

ディスクのフォーマットによって異なります。最近主流のNTFSでフォーマットされているディスクでは、ファイルが保存された順番(タイムスタンプ)にかかわらず、ファイル名の順番(昇順)で返ります。

たとえば、次の順番でファイルを保存したとします。

  1. ブック.xlsx
  2. 2010-Nov.xlsx
  3. Excel_Book.xlsx
  4. Book1.xlsx

これらのファイルを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を使って、フォルダ内のファイル一覧を取得することもできます。なお、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