フォルダ内のファイル一覧を取得する
- yuji fukami
- 2024年1月15日
- 読了時間: 3分
更新日:2024年1月17日
<概要>
今回は、特定のフォルダ内のファイル一覧を取得する汎用プロシージャを紹介します。
汎用プロシージャで指定するのは対象のフォルダのフルパスおよび、一覧を取得するファイルの拡張子です。
実務で汎用的に使えるためにファイルの拡張子は引数で複数入力できるようにしてあります。これには可変長引数配列(ParamArray)という記述方法を利用しています。
<用途>
フォルダ内のファイル一覧を取得する
<プロシージャ紹介>
Public Function GetFiles(FolderPath As String, ParamArray Extensions() As Variant) As Variant
名前: GetFiles /Functionプロシージャ
説明: フォルダ内のファイルを一覧で取得する
引数 FolderPath・・・検索対象のフォルダパス
Extensions・・・取得対象の拡張子、可変長引数配列で入力
<実行例>
次のようなコードを用意します。
Public Sub TestGetFiles()
'フォルダ指定
Dim FolderPath As String
FolderPath = "C:\Test\GetFiles用"
'対象の拡張子を変えて3通りで実行
Dim FileList_txt As Variant
Dim FileList_bmp As Variant
Dim FileList_txt_bmp As Variant
FileList_txt = GetFiles(FolderPath, "txt")
FileList_bmp = GetFiles(FolderPath, "bmp")
FileList_txt_bmp = GetFiles(FolderPath, "txt", "bmp")
Stop 'ローカルウィンドウを確認すべし
End Sub
対象のフォルダのフォルダパスは「C:\Test\GetFiles用」を指定していますが、テスト用としてこのフォルダには次のようなファイルを用意しています。
実行後にローカルウィンドウを確認して各変数「FileList_txt」「FileList_bmp」「FileList_txt_bpm」の中身を確認すると、引数で指定した拡張子のファイルのファイル名が一次元配列に格納されているのが確認できます。
<サンプルファイル>
<コード>
Public Function GetFiles(ByRef FolderPath As String, _
ParamArray Extensions() As Variant) _
As Variant
'フォルダ内のファイルを一覧で取得する
'「Microsoft Scripting Runtime」ライブラリを参照すること
'20231218 リファクタリング
'引数
'FolderPath・・・検索対象のフォルダパス
'Extensions・・・取得対象の拡張子、可変長引数配列で入力
'参考
'https://www.softex-celware.com/post/getfiles
'返り値
'ファイル名一覧の一次元配列
'ファイルが1つもなかったらEmptyを返す
'※※※※※※※※※※※※※※※※※※※※※※※※※※
'引数チェック
'フォルダの確認
Dim FSO As New FileSystemObject
If FSO.FolderExists(FolderPath) = False Then
MsgBox "「" & FolderPath & "」" & vbLf & _
"のフォルダの存在が確認できません。" & vbLf & _
"処理を終了します。", vbExclamation
Exit Function
End If
'※※※※※※※※※※※※※※※※※※※※※※※※※※
'処理
'拡張子の連想配列を作成
Dim ExtensionDict As New Dictionary
Dim TmpExtension As String
Dim I As Long
For I = 0 To UBound(Extensions, 1)
TmpExtension = Extensions(I)
'小文字に変換
TmpExtension = StrConv(TmpExtension, vbLowerCase)
ExtensionDict.Add TmpExtension, ""
Next
'フォルダ内の各ファイルを取得して、対象の拡張子だけ配列に格納
Dim Folder As Scripting.Folder
Set Folder = FSO.GetFolder(FolderPath)
Dim File As Scripting.File
Dim FileExtension As String
Dim FileName As String
Dim K As Long: K = 0
Dim N As Long
Dim Output As Variant: ReDim Output(1 To 1)
If Folder.Files.Count = 0 Then
'ファイルが1つもなかったらEmptyを返す
Exit Function
End If
For Each File In Folder.Files
FileName = File.Name 'ファイル名を取得
'拡張子を取得して小文字に変換
FileExtension = FSO.GetExtensionName(FileName)
FileExtension = StrConv(FileExtension, vbLowerCase)
If ExtensionDict.Exists(FileExtension) = True Then
K = K + 1
ReDim Preserve Output(1 To K)
Output(K) = FileName
End If
Next
'※※※※※※※※※※※※※※※※※※※※※※※※※※
'出力
GetFiles = Output
End Function
Comments