指定フォルダ内のファイル名を、様々な順番で取得(対応策)

昨日は、様々な条件を指定して、指定した順番にファイルパスを取得する関数を作成した。そして、見事失敗。指定した何某かが重複する場合、どちらか一方しか取得できない作りにしてしまっていた(連想配列の仕様)。そこで今回は、その対応に挑戦する。
f:id:Infoment:20190210085638p:plain
(↑Cnavaで「対応」で検索したら出てきた画像)。
今回の対応策は、↓こうだ。
〇 指定したプロパティ値が重複しないよう、ユニークな値にする。
  ⇒ プロパティ値+ファイルパスで配列を作成
  ⇒ 同配列を並び替えた後、先頭のプロパティ値を除去する。

値の除去には、プロパティ値とファイルパスを繋いだ区切り文字を用いる(Split関数)。しかし区切り文字を「_」などにして、ファイル名に「_」が含まれると、後々何かと面倒だ。

そこで今回、区切り文字には、ファイル名に使用できない「?」を用いることにした。

リスト作成用
Option Explicit

Enum SortType
    date_created
    date_last_accessed
    date_last_modified
    file_name
    file_size
    file_type
End Enum

Enum SortOrder
    ascending_order
    descending_order
End Enum
    

Function GetFileList(folder_path As String, _
                     Optional sort_type As SortType = file_name, _
                     Optional sort_order As SortOrder = ascending_order) _
                     As Variant

    Dim FSO As FileSystemObject
    Set FSO = New FileSystemObject
    
    Dim FilesCollection As Files
    Set FilesCollection = FSO.GetFolder(folder_path).Files
    
    ' プロパティ値 + ファイルパス格納用コレクション
    Dim col As Collection
    Set col = New Collection
    
    Dim File As File
        For Each File In FilesCollection
            Select Case sort_type
                Case date_created: col.Add File.DateCreated & "?" & File.Path
                Case date_last_accessed: col.Add File.DateLastAccessed & "?" & File.Path
                Case date_last_modified: col.Add File.DateLastModified & "?" & File.Path
                Case file_name: col.Add File.Name & "?" & File.Path
                Case file_size: col.Add File.Size & "?" & File.Path
                Case file_type: col.Add File.Type & "?" & File.Path
            End Select
        Next
        
    Dim SortSeq() As Variant
    ReDim SortSeq(1 To col.Count)
    Dim i As Long
        ' コレクションから配列を作成。
        For i = 1 To col.Count
            SortSeq(i) = col.Item(i)
        Next
        ' 配列をソート。
        SortSeq = GetSortSeq(SortSeq, sort_order)

    Dim TempSeq As Variant
    ReDim TempSeq(UBound(SortSeq))
        For i = 0 To UBound(SortSeq)
            ' 配列からプロパティ値を除いた、新たな配列を作成。
            TempSeq(i) = Split(SortSeq(i), "?")(1)
        Next

        GetFileList = TempSeq
End Function
配列ソート用

※ここは、前回と一緒。昨日書き漏れたが、引用元はこちら。
vbabeginner.net

Public Function GetSortSeq(seq As Variant, _
                        Optional sort_order As SortOrder = ascending_order) As Variant

    Dim aryList As Object
    Dim s As Variant

    Set aryList = CreateObject("System.Collections.ArrayList")
    
    For Each s In seq
        Call aryList.Add(s)
    Next
    
    Select Case sort_order
        Case ascending_order
            Call aryList.Sort
        Case descending_order
            Call aryList.Sort
            Call aryList.Reverse
    End Select
    
    GetSortSeq = aryList.ToArray
    
End Function
テスト用
Sub test()
    Dim seq As Variant
        seq = GetFileList("C:\Temp", date_created)
        
        Range("A2").Resize(UBound(seq)) = WorksheetFunction.Transpose(seq)
End Sub

結果、昨日の不具合は、一応解消された。
f:id:Infoment:20190210091643p:plain

でもきっと、もっと良い方法がある気がする。引き続き、模索する。

参考まで。