更新日時が新しい順に処理するマクロ
タイトルのマクロです。並び替えは、Excelの機能を使用しています。
' 更新日時が新しい順に処理するマクロ
' ファイルシステムオブジェクトを使用して、更新日時などの情報を、シートに記載
' 更新日時で並び替え
' 並び替え後のシートの情報を元に、順次処理
' 使用したシートを削除
Private Sub SortDateLastModified()
Const fpath As String = "C:\TEMP" ' このフォルダ内のファイルを処理
Application.ScreenUpdating = False
' このファイルに、新規ワークシート追加
Dim ws As Worksheet
ThisWorkbook.Activate
Set ws = Worksheets.Add
'ファイルシステムオブジェクトを使用
Dim FL As Object 'ファイル
With CreateObject("Scripting.FileSystemObject")
Dim i As Long
i = 1
' 1ファイルのデータを、1行に書込み
For Each FL In .GetFolder(fpath).Files
ws.Cells(i, 1) = FL.DateLastModified ' 更新日時
ws.Cells(i, 2) = FL.Name ' ファイル名
ws.Cells(i, 3) = FL.Path ' パス名
ws.Cells(i, 4) = FL.Size ' サイズ
i = i + 1
Next
End With
If ws.Range("A1") = "" Then
' A1セルが空白であれば、マクロ終了
Exit Sub
Else
' 並び替え
ws.Sort.SortFields.Clear ' 既存の条件をクリア
ws.Sort.SortFields.Add2 _
Key:=ws.Range("A1"), _
SortOn:=xlSortOnValues, _
Order:=xlDescending, _
DataOption:=xlSortTextAsNumbers
' Add2:条件追加
' Key:この例では、A列が基準で並び替え。行はどこでもOK。
' SortOn:並び替えのタイプ、データ(xlSortOnValues)
' ・背景色(xlSortOnCellColor)・文字色(xlSortOnFontColor)・アイコン(xlSortOnIcon)
' Order:昇順(xlAscending) ・降順(xlDescending)
' DataOption:文字列を文字(xlSortNormal)or数値(xlSortTextAsNumbers)
With ws.Sort
.SetRange ws.UsedRange ' 並び替えの範囲。この例では、使用されているセル範囲
.Header = xlNo ' タイトル行の有(xlYes)無(xlNo),自動判定(xlGuess)。
.MatchCase = False ' 大文字と小文字の区別の有(True)無(False)。
.Orientation = xlTopToBottom ' 並び変える方向、行(xlTopToBottom)列(xlLeftToRight)。
.SortMethod = xlPinYin ' 日本語を、ふりがな(xlPinYin) or 文字コード(xlStroke)で並び替える。
.Apply ' 並び替えを実行
End With
End If
Dim wb As Workbook
Dim rw As Long
For rw = 1 To ws.Cells(Rows.Count, 1).End(xlUp).Row
' 以下にファイル毎の処理を記載して活用する
' 例えば、ファイルを開く処理
Set wb = Workbooks.Open(ws.Cells(rw, 3))
Next rw
Application.DisplayAlerts = False '確認メッセージを表示しない。
' シート削除
ws.Delete
Application.DisplayAlerts = True '確認メッセージを表示する。
Application.ScreenUpdating = True
End Sub
次に、Excel機能を使用せず、配列とソートプログラムを使用したバージョンは、以下です。
' ファイルの更新日時を確認し、ファイル名と更新日時のペアをユーザー定義型(f)に追加します。
' SortDatesDescending 関数を追加し、ファイルの更新日時を降順にソートし、fのインデックスを取得します。
' このfのインデックス毎にループ処理し、ファイルを更新日時の新しい順に処理します。
' ユーザー定義型
Private Type myFile
Name As String
Date As Date
End Type
Private f() As myFile
' 更新日時が新しい順に処理するマクロ
Private Sub 更新日時()
Const fpath As String = "C:\TEMP"
Dim idx As Variant
Dim wb As Workbook
Application.ScreenUpdating = False
'ファイルシステムオブジェクトを使用
Dim FL As Object 'ファイル
With CreateObject("Scripting.FileSystemObject")
Dim i As Long
i = 1
For Each FL In .GetFolder(fpath).Files
ReDim Preserve f(1 To i)
f(i).Name = FL.Name
f(i).Date = FL.DateLastModified
i = i + 1
Next
End With
' 更新日時が新しい順にファイルを取得
For Each idx In SortDatesDescending()
' インデックス、更新日時、ファイル名を表示(確認用)
Debug.Print idx, f(idx).Date, f(idx).Name
' 以下にファイル毎の処理を記載して活用する
' 例えば、ファイルを開く処理
Set wb = Workbooks.Open(fpath & "\" & f(idx).Name)
Next idx
Application.ScreenUpdating = True
Erase f
End Sub
Private Function SortDatesDescending() As Variant()
Dim arr() As Variant
Dim i As Long
ReDim arr(1 To UBound(f), 1 To 2) As Variant
For i = 1 To UBound(f)
arr(i, 1) = i
arr(i, 2) = f(i).Date
Next i
' 日付を降順にソート
Call QuickSortDescending(arr, LBound(arr), UBound(arr))
' 二次元配列の指定列(A列(1列目))を一次元配列に格納する
SortDatesDescending = WorksheetFunction.Index(WorksheetFunction.Transpose(arr), 1)
End Function
Sub QuickSortDescending(ByRef arr As Variant, ByVal left As Long, ByVal right As Long)
Dim i As Long, j As Long
Dim pivot As Variant
Dim temp1 As Variant
Dim temp2 As Variant
i = left
j = right
pivot = arr((left + right) \ 2, 2)
Do While i <= j
Do While arr(i, 2) > pivot
i = i + 1
Loop
Do While arr(j, 2) < pivot
j = j - 1
Loop
If i <= j Then
temp1 = arr(i, 1)
temp2 = arr(i, 2)
arr(i, 1) = arr(j, 1)
arr(i, 2) = arr(j, 2)
arr(j, 1) = temp1
arr(j, 2) = temp2
i = i + 1
j = j - 1
End If
Loop
If left < j Then
QuickSortDescending arr, left, j
End If
If i < right Then
QuickSortDescending arr, i, right
End If
End Sub
Excelの機能を使用した最初のバージョンの方が、簡単ですね。