【コピペで使える】VBAで指定したフォルダ内のファイル名を一覧で取得してシートに書き出す方法③

VBA

今回は、前回投稿した、サンプルコードの解説をしていきたいと思います。
まだ、投稿を見ていない方は下記のURLからご覧ください!

サンプルコード

Sub ListFilesWithDetails()
    Dim folderPath As String
    Dim ws As Worksheet
    Dim i As Long
    Dim sheetName As String
    Dim ans As VbMsgBoxResult
    
    ' フォルダ選択ダイアログ
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "フォルダを選択してください"
        If .Show <> -1 Then Exit Sub
        folderPath = .SelectedItems(1)
    End With
    
    ' シート名の入力
    sheetName = InputBox("出力先のシート名を入力してください", "シート名指定", "ファイル一覧")
    If sheetName = "" Then Exit Sub
    
    ' すでにシートが存在するか確認
    On Error Resume Next
    Set ws = Worksheets(sheetName)
    On Error GoTo 0
    
    If Not ws Is Nothing Then
        ans = MsgBox("シート「" & sheetName & "」はすでに存在します。上書きしますか?", vbYesNo + vbExclamation)
        If ans = vbNo Then Exit Sub
        Application.DisplayAlerts = False
        ws.Delete
        Application.DisplayAlerts = True
    End If
    
    ' 新しいシート作成
    Set ws = Worksheets.Add
    ws.Name = sheetName
    
    ' ヘッダー
    ws.Cells(1, 1).Value = "ファイル名"
    ws.Cells(1, 2).Value = "フルパス"
    ws.Cells(1, 3).Value = "更新日時"
    ws.Cells(1, 4).Value = "サイズ(KB)"
    i = 2

    ' ファイル一覧取得
    Call GetFilesRecursive(folderPath, ws, i)
    
    ' 表の整形
    ws.Columns("A:D").AutoFit
    MsgBox "完了しました!", vbInformation
End Sub

Sub GetFilesRecursive(ByVal folderPath As String, ByRef ws As Worksheet, ByRef rowIndex As Long)
    Dim fso As Object, folder As Object, file As Object, subFolders As Object, subF As Object
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(folderPath)
    
    ' ファイル一覧取得
    For Each file In folder.Files
        ws.Cells(rowIndex, 1).Value = file.Name
        ws.Cells(rowIndex, 2).Value = file.Path
        ws.Cells(rowIndex, 3).Value = file.DateLastModified
        ws.Cells(rowIndex, 4).Value = Round(file.Size / 1024, 1)
        rowIndex = rowIndex + 1
    Next
    
    ' サブフォルダも再帰的に処理
    Set subFolders = folder.SubFolders
    For Each subF In subFolders
        GetFilesRecursive subF.Path, ws, rowIndex
    Next
End Sub

解説

新しいシート作成

' 新しいシート作成
Set ws = Worksheets.Add
ws.Name = sheetName

Set ws = Worksheets.Add

  • Worksheets.Add は、新しいワークシートを作成する命令です。
  • 作成されたシートの参照を、オブジェクト変数 ws に代入しています
    (※事前に Dim ws As Worksheet が必要)。
  • Set を使うのは、「オブジェクト(ここではシート)」を変数に代入する時のVBAの文法です。
  • デフォルトでは アクティブシートの前に挿入されます。
  • 場所を指定したい場合はこうします
Set ws = Worksheets.Add(After:=Worksheets(Worksheets.Count)) ' 最後尾に追加

ws.Name = sheetName

  • 作成した新しいシート ws に、ユーザーが指定した sheetName を設定しています。
    つまり、シートの名前を変更しているということです。

ヘッダーの設定

' ヘッダー
ws.Cells(1, 1).Value = "ファイル名"
ws.Cells(1, 2).Value = "フルパス"
ws.Cells(1, 3).Value = "更新日時"
ws.Cells(1, 4).Value = "サイズ(KB)"
i = 2

ws.Cells(1, 1).Value = "ファイル名"

  • ws シートの 1行目・1列目(=A1セル) に「ファイル名」という文字列を書き込みます。
  • Cells(行番号, 列番号) は、特定のセルを行番号・列番号で指定する方法です。

② 以下同様に…

コード セル 表示される内容
ws.Cells(1, 2).Value = "フルパス" B1 フルパス
ws.Cells(1, 3).Value = "更新日時" C1 更新日時
ws.Cells(1, 4).Value = "サイズ(KB)" D1 サイズ(KB)

→ これら4つで、表の見出し(ヘッダー)を1行目に設定しているということです。

i = 2

  • これは「データの書き込みを2行目から始める」ためのカウンター変数です。
  • i はよく使われる 行番号カウンタで、後でファイル情報を1件ずつ書き込むときに ws.Cells(i, 1) のように使います。

ファイル一覧取得

' ファイル一覧取得
Call GetFilesRecursive(folderPath, ws, i)

Call

  • Call は、VBAで 他の Sub プロシージャ(サブルーチン)を呼び出す命令です。
  • Call は省略して GetFilesRecursive(folderPath, ws, i) と書くこともできます(ただし括弧の扱いに注意が必要)。
  • GetFilesRecursiveは、サブルーチン(例:Sub GetFilesRecursive(...))の名前です。
  • 引数の意味 ↓
引数 意味
folderPath ユーザーが指定した検索対象のフォルダのパス
ws 出力先のワークシートオブジェクト(ファイル一覧を書き込む)
i 書き込み開始行。2行目から始まり、ファイルごとに1ずつ増えていく

サブルーチン

Sub GetFilesRecursive(ByVal folderPath As String, ByRef ws As Worksheet, ByRef rowIndex As Long)
    Dim fso As Object, folder As Object, file As Object, subFolders As Object, subF As Object

Sub GetFilesRecursive(...)

  • 「再帰的にフォルダ内のファイルを一覧取得する処理」です。
  • 引数の意味 ↓
引数 キーワード 意味
folderPath As String ByVal 対象のフォルダのパス。文字列。値渡し(中で変更しても呼び出し元には影響なし)
ws As Worksheet ByRef ファイル一覧を書き込むワークシート。参照渡し(変更は呼び出し元にも反映される)
rowIndex As Long ByRef 書き込む行番号。呼び出し元の i とつながっていて、次の書き込み行を更新していくために参照渡しされている

② 変数定義

Dim fso As Object, folder As Object, file As Object, subFolders As Object, subF As Object

これらはすべて FileSystemObject (FSO) を使って、ファイルやフォルダにアクセスするためのオブジェクト変数です。

変数名 意味
fso FileSystemObject のインスタンス(ファイル・フォルダ操作の基本)
folder folderPath に対応するフォルダオブジェクト
file フォルダ内の個別のファイル(ループで使用)
subFolders サブフォルダの一覧(Folders コレクション)
subF サブフォルダの1つ(ループで使用)

ファイルやフォルダのアクセス準備

Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(folderPath)

Set fso = CreateObject("Scripting.FileSystemObject")

  • FileSystemObject(略してFSO)というのは、VBAで ファイルやフォルダを操作するためのオブジェクト です。
  • CreateObject("Scripting.FileSystemObject") によって、FSOのインスタンスを作成し、それを fso という変数にセットしています。

Set folder = fso.GetFolder(folderPath)

  • fso を使って、実際に存在するフォルダを取得しています。
  • folderPath は、事前に指定されたフォルダのパス(例:"C:\MyFolder")です。
  • fso.GetFolder(...) によって、そのパスのフォルダを開き、folder という変数に格納します。

まとめ

今回も、各コードがどのような動きをしているのかを解説しました!
ぜひ皆さんも実際に書いたり、サンプルを動かしたりしてみてください!

別投稿で、CSVファイルの内容をExcelに転記する方法も紹介しています!

タイトルとURLをコピーしました