フォルダ内のファイル名の配列を返す関数
タイトルのマクロは、以下
'**************************************
'* フォルダ内のファイル名の配列を返す関数。20230210
'* myFolder:フォルダ名。
'* 戻り値、フォルダ内のファイル名の配列
Function AllFileName(ByVal myFolder As String) As String()
' 新しいFileSystemObjectオブジェクトを作成
With New FileSystemObject
Dim myFiles As Files ' ファイルを格納するFilesコレクションを宣言
Set myFiles = .GetFolder(myFolder).Files ' 指定フォルダ内のファイルを取得
Dim Files() As String ' ファイル名を格納する配列を宣言
Dim i As Long: i = 1 ' 配列のインデックスを初期化
Dim myFile As File ' 各ファイルを参照するためのFileオブジェクトを宣言
' フォルダ内の各ファイルについてループ
For Each myFile In myFiles
ReDim Preserve Files(1 To i) ' 配列のサイズを変更し、現在の内容を保持
Files(i) = myFile.Name ' 配列にファイル名を格納
i = i + 1 ' インデックスをインクリメント
' Debug.Print myFile.Name ' ファイル名をデバッグ出力に表示(コメントアウト)
Next myFile
End With
AllFileName = Files ' 配列を関数の戻り値として設定
End Function
詳細な説明
- 新しいFileSystemObjectオブジェクトを作成
FileSystemObject
(FSO)は、ファイルやフォルダを操作するためのオブジェクトです。- この
FileSystemObject
(FSO)を使用するためには、Microsoft Scripting Runtime の参照設定が必要です。
- ファイルを格納するFilesコレクションを宣言
- 指定フォルダ内のファイルを取得
GetFolder
メソッドで指定したフォルダのFilesコレクションを取得します。
- ファイル名を格納する配列を宣言
- 配列のインデックスを初期化
- 各ファイルを参照するためのFileオブジェクトを宣言
- フォルダ内の各ファイルについてループ
- 配列のサイズを変更し、現在の内容を保持
ReDim Preserve
を使うことで、既存の内容を保持しながら配列のサイズを変更できます。
- 配列にファイル名を格納
- インデックスをインクリメント
- ファイル名をデバッグ出力に表示(コメントアウト)
- 配列を関数の戻り値として設定
このコードは、指定されたフォルダ内のファイル名を配列として返す関数です。ファイル名を取得し、配列に格納するための手順が詳細に説明されています。
以下が使用例です。
Sub ListFilesInFolder()
Dim folderPath As String
Dim fileNames() As String
Dim i As Long
' フォルダパスを指定(例:デスクトップのフォルダ)
folderPath = "H:\temp"
' フォルダ内のファイル名を取得
fileNames = AllFileName(folderPath)
' シート1を取得
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
' シートのA列にファイル名を出力
For i = LBound(fileNames) To UBound(fileNames)
ws.Cells(i + 1, 1).Value = fileNames(i)
Next i
End Sub
詳細な説明
- フォルダパスの指定
- この部分で、ファイル名を取得したいフォルダのパスを指定します。
- ファイル名の取得
AllFileName
関数を呼び出し、指定フォルダ内のファイル名を配列として取得します。
- シートの指定
- ファイル名を出力するシートを指定します。この例では “Sheet1” を使用しています。
- ファイル名の出力
- 取得したファイル名をシートのA列に順番に書き込みます。
このようにして、指定フォルダ内のファイル名をExcelシートにリストアップすることができます。