この記事では、セルの値を使用して、FileSystemObjectで特定のフォルダ内の特定の拡張子(.xlsx)のみを対象としたファイル名を取得する方法をご紹介します。
参照設定の追加
まず、FileSystemObjectを使用する前に、VBE(Visual Basic Editor)の参照設定で「Microsoft Scripting Runtime」を追加する必要があります。まだ設定していない場合は、こちらの記事を参考に設定してください。
セルの値を使用してFileSystemObjectで特定の拡張子のファイル名を取得する
では、具体的な例を見ていきましょう。
下図のように、Sheet1のセルB1に日付、セルB2にフォルダパスが入っているとします。
セルB2のフォルダパスとセルB1の日付を使用して、「C:¥サンプル¥20240105」に格納されているxlsxファイルのファイル名を、シート「ファイル名一覧」に書き出します。
サンプルコード
Sub FileSystemObjectでxlsxファイル一覧取得()
‘ FileSystemObjectの準備
Dim fso As FileSystemObject
Set fso = New FileSystemObject
‘ 変数の宣言
‘ セルB2のフォルダパスの変数
Dim f1 As String
‘ セルB1の日付の変数
Dim f2 As String
‘ 取得するファイルのフォルダパスの変数
Dim path As String
‘ Sheet1をアクティブにする
Sheets(“Sheet1”).Activate
‘ セルB2のフォルダパスを取得
f1 = Range(“B2”) & “\”
‘ セルB1の 日付をyyyymmdd形式で取得
f2 = Format(Range(“B1”), “yyyymmdd”) & “\”
‘ セルB2とセルB1を結合して「C:\サンプル\20240105\」を作成
path = f1 & f2 ‘ C:\サンプル\20240105\
‘「C:\サンプル\20240105\」からファイル一覧を取得
Dim fl As Files
Set fl = fso.GetFolder(path).Files
‘ 取得する各ファイルを格納する変数
Dim f As File
‘ 書き出す行番号を格納する変数
Dim i As Long
i = 1 ‘1行目
‘ xlsxファイルだけをシート「ファイル名一覧」のA列に書き出す
For Each f In fl
If LCase(Right(f.Name, 4)) = “xlsx” Then ‘ 拡張子がxlsxの場合
Sheets(“ファイル名一覧”).Cells(i, “A”) = f.Name
i = i + 1
End If
Next
‘ FileSystemObjectを解放
Set fso = Nothing
‘ シート「ファイル名一覧」をアクティブにする
Sheets(“ファイル名一覧”).Activate
End Sub
シート「ファイル名一覧」に拡張子が「.xlsx」のファイル名が書き出されました。
解説
If LCase(Right(f.Name, 4)) = “xlsx” Then
この条件文は、特定のフォルダ内のファイルの拡張子が「xlsx」である場合に true(真)となり、それに該当するファイルのみが処理の対象となります。
下記に、この条件文の各部分を解説します。
f.Name:
ファイルの名前を表します。
Right(f.Name, 4):
ファイル名の末尾から4文字を取得します。これにより、ファイルの拡張子が含まれます。
このサンプルでは、xlsxファイルを対象としているため4文字となりますが、たとえば、txtファイルの場合は3文字なので Right(f.Name, 3) となります。
(Right(f.Name, 4)) = “xlsx”:
拡張子が「xlsx」であるかどうかを確認する条件式です。
この条件式は、ファイル名の末尾4文字が「xlsx」である場合に true(真)となり、それに該当するファイルのみが処理の対象となります。
LCase():
文字列を小文字に変換する関数です。拡張子の比較を行うために小文字に変換します。
あとがき
この記事では、FileSystemObjectを使用して特定のフォルダ内の特定の拡張子のみを対象としたファイル名を一覧化する方法について解説しました。
特定の拡張子だけでなく、すべてのファイル名を取得する方法については別の記事で紹介していますのでそちらを参考にしてみてください。