サブフォルダを含むフォルダとファイルの一覧をソートして取得する。
VBAで指定したフォルダ内にあるすべてのフォルダとファイル名の一覧をソートした状態で取得します。
フォルダ内のサブフォルダを含めたすべてのフォルダ、ファイル名を取得にはGetFolderメソッドのSubFoldersプロパティを再帰的に呼び出して使うことですべてのフォルダ、ファイル名を取得していますが、そのままの処理ではフォルダ、ファイル名の一覧はサブフォルダから親フォルダにさかのぼって取得される形になります。
(下記のページにソート無し版のコードを掲載しています。)
サブフォルダを含めたフォルダとファイル名の一覧を取得
そのためこのページで記載しているサンプルコードは対象の親フォルダから順番に表示するように配列と配列のソート処理を利用して取得させています。ソートはクイックソートで処理しています。
'******************************************************************
' サブフォルダを含めたフォルダ、ファイルを一覧を取得
'******************************************************************
Sub getAllFileList_Sort()
'対象のフォルダを指定
Dim sRootFolder As String
sRootFolder = "C:\VBA\List\"
'FileSystemObjectオブジェクトの作成
Dim oFso As Object
Set oFso = CreateObject("Scripting.FileSystemObject")
'ファイル一覧取得対象となるフォルダパスを配列に格納
Dim vAryDir() As Variant
Dim lAryCnt As Long
Call getTargetDir(oFso.GetFolder(sRootFolder), vAryDir, lAryCnt)
'取得したフォルダパスを格納した配列をソート
Call sortQuick_Asc(vAryDir, LBound(vAryDir), UBound(vAryDir))
'ソートしたフォルダパス順に格納されているファイル名を取得
Dim vAryList() As Variant
Call getFileList(vAryDir, vAryList)
'フォルダ、ファイルの一覧を出力
Dim i As Long
For i = 1 To UBound(vAryList)
Debug.Print vAryList(i)
Next
End Sub
'******************************************************************
' フォルダチェック(サブフォルダがあれば再帰的に呼び出して実行)
'------------------------------------------------------------------
' 第1引数:フォルダオブジェクト
' 第2引数:配列(フォルダパス)
' 第3引数:配列要素数
'******************************************************************
Sub getTargetDir(getObjDir As Object, getAryDir() As Variant, lAryCnt As Long)
'対象フォルダにサブフォルダがあれば再帰的に処理し情報を取得
Dim oSubDir As Object
For Each oSubDir In getObjDir.SubFolders
Call getTargetDir(oSubDir, getAryDir(), lAryCnt)
Next
'検査対象のフォルダパスを配列に格納
lAryCnt = lAryCnt + 1
ReDim Preserve getAryDir(1 To lAryCnt)
getAryDir(lAryCnt) = getObjDir.Path
End Sub
'******************************************************************
' フォルダ内のファイルを一覧で取得(GetFolder使用)
'------------------------------------------------------------------
' 第1引数:配列(フォルダパス)
' 第2引数:配列(フォルダ、ファイル名)
'******************************************************************
Sub getFileList(getAryDir() As Variant, ByRef rtnAryList() As Variant)
'FileSystemObjectオブジェクトの作成
Dim oFso As Object
Set oFso = CreateObject("Scripting.FileSystemObject")
Dim lAryCnt As Long
lAryCnt = 0
'フォルダパスを格納した配列をループで処理
Dim i As Long
For i = 1 To UBound(getAryDir())
'フォルダパスを返り値用の配列に格納
lAryCnt = lAryCnt + 1
ReDim Preserve rtnAryList(1 To lAryCnt)
rtnAryList(lAryCnt) = getAryDir(i)
'ファイルの情報を取得
Dim oDir As Object
Set oDir = oFso.GetFolder(getAryDir(i))
'ファイル一覧の作成
Dim oFile As Object
For Each oFile In oDir.Files
'ファイル名を返り値用の配列に格納
lAryCnt = lAryCnt + 1
ReDim Preserve rtnAryList(1 To lAryCnt)
rtnAryList(lAryCnt) = " └" & oFile.Name
Next
Next
Set oFso = Nothing
End Sub
'******************************************************************
' 配列をソートする/昇順(クイックソート)
'------------------------------------------------------------------
' 第1引数:配列
' 第2引数:配列の開始要素数
' 第2引数:配列の終了要素数
'******************************************************************
Sub sortQuick_Asc(ByRef vAryData() As Variant, lLow As Long, lUp As Long)
'基準値(中央値)
Dim vStd As Variant
vStd = vAryData(Int((lLow + lUp) / 2))
Dim i As Long
i = lLow
Dim j As Long
j = lUp
Dim vTemp As Variant
Do
'基準値より小さい間はループ
Do While vAryData(i) < vStd
i = i + 1
Loop
'基準値より大きい間はループ
Do While vAryData(j) > vStd
j = j - 1
Loop
'ループ終了判定
If i >= j Then
Exit Do
End If
vTemp = vAryData(i)
vAryData(i) = vAryData(j)
vAryData(j) = vTemp
i = i + 1
j = j - 1
Loop
'再帰呼び出し
If (lLow < i - 1) Then
Call sortQuick_Asc(vAryData, lLow, i - 1)
End If
If (lUp > j + 1) Then
Call sortQuick_Asc(vAryData, j + 1, lUp)
End If
End Sub■実行結果



