ExcelVBAでファイル名一覧を取得し更新順に並べ替える方法

Excel VBAを使用して特定のディレクトリ内のファイル名を一覧化し、それをファイルの更新日時に基づいて順番に並べ替える方法です。

以下はフォルダ内のファイル名またはフォルダ名、リンクをリスト化します。

目次

ファイル名の書き出し例

一覧化した結果です。

ファイル名取得と更新日時の並べ替え
  • ファイル保存先:C:\Users\user\Downloads
  • ファイル名書き出し先:開いているエクセルブックのシート「Sheet1」

サブプロシージャを使用でファイル名取得

サブプロシージャを使用して機能を分割するとコードがより整理されます。修正や拡張がしやすいです。

Sub sample2()
    Dim fPath As String
    Dim f_name As String
    Dim i As Long
    Dim ws As Worksheet
    
    Set ws = ThisWorkbook.Sheets("Sheet1")          ' ワークシートの指定
    ws.Range("A2:B" & ws.Rows.Count).ClearContents  ' データをクリア
    fPath = "C:\Users\user\Downloads"               ' フォルダのパス
    ListFilesInFolder fPath, ws                    ' ファイル情報をシートに書き込み
    SortDataByFileNames ws                         ' データをファイル名で昇順にソート
End Sub

Sub ListFilesInFolder(ByVal folderPath As String, ByRef ws As Worksheet)
    Dim f_name As String
    Dim i As Long
    Dim fso As Object
    Dim folder As Object
    Dim file As Object
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(folderPath)
    
    i = 2
    For Each file In folder.Files
        ws.Cells(i, 2).Value = file.Name
        ws.Cells(i, 1).Value = file.DateLastModified
        i = i + 1
    Next file
End Sub

Sub SortDataByFileNames(ByRef ws As Worksheet)
    With ws.Sort
        .SortFields.Clear
        .SortFields.Add Key:=ws.Range("A:A"), Order:=xlAscending
        .SetRange ws.Range("A1:B" & ws.Cells(ws.Rows.Count, 2).End(xlUp).Row)
        .Header = xlYes
        .Apply
    End With
End Sub

以下のコードはプロジャーで分けてるだけで、上記と同じです。

Sub sample2()
    Dim fPath As String
    Dim f_name As String
    Dim i As Long
    Dim ws As Worksheet
    
    Set ws = ThisWorkbook.Sheets("Sheet1")          ' ワークシートの指定
    ws.Range("A2:B" & ws.Rows.Count).ClearContents  ' データをクリア
    fPath = "C:\Users\user\Downloads"               ' フォルダのパス
    ListFilesInFolder fPath, ws                    ' ファイル情報をシートに書き込み
    SortDataByFileNames ws                         ' データをファイル名で昇順にソート
End Sub

ファイルの一覧を取得するために 「ListFilesInFolder 」という名前のサブプロシージャを使用しています。

Sub ListFilesInFolder(ByVal folderPath As String, ByRef ws As Worksheet)
    Dim f_name As String
    Dim i As Long
    Dim fso As Object
    Dim folder As Object
    Dim file As Object
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(folderPath)
    
    i = 2
    For Each file In folder.Files
        ws.Cells(i, 2).Value = file.Name
        ws.Cells(i, 1).Value = file.DateLastModified
        i = i + 1
    Next file
End Sub
説明
  • 12~16行目:フォルダ内のファイルを For Each ループを使用して処理します。
  • 14行目:ファイルの日時情報は file.DateLastModified を使用しています。

ファイルをソートするために「 SortDataByFileNames」 という名前のサブプロシージャを使用しています。

Sub SortDataByFileNames(ByRef ws As Worksheet)
    With ws.Sort
        .SortFields.Clear
        .SortFields.Add Key:=ws.Range("A:A"), Order:=xlAscending
        .SetRange ws.Range("A1:B" & ws.Cells(ws.Rows.Count, 2).End(xlUp).Row)
        .Header = xlYes
        .Apply
    End With
End Sub

Dir関数でフォルダ内のファイル名書き出しと並べ替え

ファイルの一覧を取得するために Dir関数を使用した例です。

Sub sample()
    Dim fPath As String
    Dim f_name As String
    Dim i As Long
    Dim ws As Worksheet
    
   Set ws = ThisWorkbook.Sheets("Sheet1")          ' ワークシートの指定
   ws.Range("A2:B" & ws.Rows.Count).ClearContents  ' データをクリア
   fPath = "C:\Users\user\Downloads"               ' フォルダのパス
   f_name = Dir(fPath & "\*")                      ' フォルダ内のファイルを取得
   ChDir fPath & "\"                               ' ワークディレクトリを設定

    i = 2                                           ' ファイル情報をシートに書き込み
    Do Until f_name = ""
        ws.Cells(i, 1).Value = f_name
        ws.Cells(i, 2).Value = FileDateTime(f_name)
        i = i + 1
        f_name = Dir
    Loop
    
    With ws.Sort                         ' データを作成日時で昇順にソート
        .SortFields.Clear
        .SortFields.Add Key:=ws.Range("B:B"), Order:=xlAscending
        .SetRange ws.Range("A1:B" & ws.Cells(ws.Rows.Count, 2).End(xlUp).Row)
        .Header = xlYes
        .Apply
    End With
End Sub
説明
  • 7行目:ワークシートの指定
  • 8行目:データをクリア
  • 9行目:フォルダのパス
  • 10行目:フォルダ内のファイルを取得
  • 11行目:ワークディレクトリを設定
  • 13~19行目:フォルダ内のファイルを反復処理するために Do Until ループを使用しています。
  • 16行目:ファイルの日時情報は FileDateTime 関数を使用しています。
  • 21~27行目:データを作成日時で昇順にソート
目次