こんにちは。ユーキです。
今日は、ファイルの一覧を作成するプログラムを作ってみたいと思います。
目次
ファイルの一覧を取得
ファイルの取得には、「Scripting.FileSystemObject」オブジェクトを使用します。取得した結果はコンソールに出力するようにしています。
Public Sub FileList()
Dim fs As Object
Dim f As Object
Set fs = CreateObject("Scripting.FileSystemObject")
For Each f In fs.GetFolder("C:\Temp").Files
Debug.Print f.Name
Next f
End Sub
フルパスを取得する
フルパスを表示するには、Fileオブジェクトのプロパティで取得可能です。Nameプロパティをファイル名となります。
これらを利用して、取得結果をExcelのシートに出力してみたいと思います。
Public Sub FileList()
Dim fs As Object
Dim f As Object
Dim rowIdx As Long
Set fs = CreateObject("Scripting.FileSystemObject")
'先頭行を設定。4行目からスターとするようにします。
rowIdx = 4
For Each f In fs.GetFolder("C:\Temp").Files
ActiveSheet.Cells(rowIdx, 2).Value = f.Path 'B列にフルパスを表示
ActiveSheet.Cells(rowIdx, 3).Value = f.Name 'C列にファイル名を表示
rowIdx = rowIdx + 1
Next f
End Sub
サブフォルダ取得(再帰的呼び出し)
ファイル取得部分を関数化して、再帰的呼び出しを実施し、サブフォルダのファイルも取得できるようにしてみましょう。
表示項目は、個人的に欲しいという思う内容を出力するようにしました。
Public Sub FileList()
Dim rowIdx As Long
Dim path As String
path = "C:\Temp"
'先頭行を設定。4行目からスターとするようにします。
rowIdx = 4
Call OutputFileList(ActiveSheet, path, rowIdx, "")
End Sub
Private Sub OutputFileList(sh As Worksheet, ByRef path As String, rowIdx As Long, folderName As String)
Dim fs As Object
Dim f As Object
Set fs = CreateObject("Scripting.FileSystemObject")
For Each f In fs.GetFolder(path).Files
ActiveSheet.Cells(rowIdx, 2).Value = f.path 'B列にフルパスを表示
ActiveSheet.Cells(rowIdx, 3).Value = f.Name 'C列にファイル名を表示
ActiveSheet.Cells(rowIdx, 4).Value = folderName 'フォルダ名(サブフォルダ以降で表示)
ActiveSheet.Cells(rowIdx, 5).Value = f.ParentFolder 'フォルダパス
rowIdx = rowIdx + 1
Next f
'サブフォルダ
For Each f In fs.GetFolder(path).SubFolders
Call OutputFileList(sh, f.path, rowIdx, f.Name)
Next f
End Sub
ボタン追加
最後に、ボタンを押して実行できるようにしてみます。ボタンの追加については、ボタンを追加してみよう を参照ください(サンプルではプロパティ等を編集しています。この編集の仕方もいつか記事にしたいと思います)。
Private Sub btnFileList_Click()
Call FileList
End Sub
ついでに出力先のシートにも、列タイトル等をつけておきます。
ボタンを押して実行してみましょう。結果は以下のようになります。
※セルの書式を「文字」としています(標準などにすると、「001」などのフォルダ名が「1」となってしまいます)
最後に
取得ファイルのパスの指定についても、Excelに入力した内容から取得するように変更すれば、できることの幅は広がると思います。