【VBA】フォルダ内のファイル一覧を取得する | あじゅWeb

【VBA】フォルダ内のファイル一覧を取得する

エクセルVBAで使うコードの備忘録。VBAで指定フォルダ内のすべてのファイル名を取得するコード。Dir関数を使ってフォルダ内のファイルを順に取得すると、ファイルシステムオブジェクトを使う方法を紹介します。本記事で紹介する方法はサブフォルダ内のフォルダは取得対象ではありません。サブフォルダに含まれるすべてのファイルパス一覧を取得する方法についてはこちらをご覧ください(ちょっと複雑になります)。

スポンサーリンク

Dir関数を使って取得する

フォルダ内のファイル数を取得するでも同様の説明をしましたが、Dir関数にワイルドカードを指定してフォルダ内のファイルを検索して順次取得します。Dir関数の特性として、Dir関数を引数なしで使用すると「直前に指定したファイル名かつまだ検索にかかっていないファイル」の名前が返されるというものを使用しています。

下記のファンプルコードでは、ファイル数を一度カウントしてから配列のサイズを再定義し、再定義された配列に再度ファイル名を格納しています。ほとんど同じ作業を二度繰り返しているのであまりスマートではありません。

なお、サンプルコードを使用する際はカッコに囲まれた部分([***])を自分のプログラムに合わせて変更してください。

サンプルコード

Public Sub GetFileNames()
    
    '--- ファイル名を知りたいフォルダのパス ---'
    Dim folderPath As String
    folderPath = "[フォルダのパス]"
    
    '--- ファイル名(ワイルドカードを使用) ---'
    Dim fileName As String
    fileName = "*"
    
    '--- ファイル数を格納する変数 ---'
    Dim i As Long
    i = 0
    
    '--- Dir関数の戻り値を格納する変数 ---'
    Dim tmp As String
    
    '--- ファイル数をカウント ---'
    tmp = Dir(folderPath & "\" & fileName)
    Do While tmp <> ""
        i = i + 1
        tmp = Dir()
    Loop
    
    '--- ファイル名を格納する配列 ---'
    Dim str() As String
    ReDim str(1 To i)
    
    '--- ファイル名を取得 ---'
    i = 0
    tmp = Dir(folderPath & "\" & fileName)
    Do While tmp <> ""
        i = i + 1
        str(i) = tmp
        tmp = Dir()
    Loop
    
End Sub

ファイルシステムオブジェクトを使う

ファイルシステムオブジェクトを使用すると、ダイレクトにファイル名の配列を取得することができるのでシンプルにコードを書くことができます。こちらの方法でも、フォルダ内のファイル数をまず取得して配列を再定義し、その配列に再度ファイル名を割り当てていくという手順を取っているので、Dir関数を使った場合と考え方は同じです。Dir関数を使った場合と比較すると、ループの数が少なくて済むので、こちらの方がややシンプルな書き方と言えます。

こちらも、サンプルコードを使用する際はカッコに囲まれた部分([***])を自分のプログラムに合わせて変更してください。

サンプルコード

Public Sub GetFileCountFso()
    
    '--- ファイル名を知りたいフォルダのパス ---'
    Dim folderPath As String
    folderPath = "[フォルダのパス]"
    
    '--- ファイルシステムオブジェクト ---'
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    '--- ファイル数を格納する変数 ---'
    Dim n As Variant
    n = fso.GetFolder(folderPath).Files.Count
    
    If (0 < n) Then
        '--- ファイル名を格納する配列 ---'
        Dim str() As String
        ReDim str(1 To n)
        
        '--- ファイル名を格納 ---'
        i = 1
        Dim f As Object
        For Each f In fso.GetFolder(folderPath).Files
            str(i) = f.Path
            i = i + 1
        Next f
    End If
    
End Sub