指定フォルダ内のファイル名を、様々な順番で取得(対応策)
昨日は、様々な条件を指定して、指定した順番にファイルパスを取得する関数を作成した。そして、見事失敗。指定した何某かが重複する場合、どちらか一方しか取得できない作りにしてしまっていた(連想配列の仕様)。そこで今回は、その対応に挑戦する。
(↑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
結果、昨日の不具合は、一応解消された。
でもきっと、もっと良い方法がある気がする。引き続き、模索する。
参考まで。