Excel VBAでファイル名と更新日時を取得する(Forfiles)
Excel VBAでファイル名と更新日時を取得する
ファイル名と更新日時を取得する。
VBAからコマンドを実行し、標準出力を変数に取得して二次元配列に加工する。
FilesSystemObjectを使用すると取得に時間がかかる場合に有効かもしれない。
サンプルコード
以下の値をマクロとしてexcelに登録して使用。
Sub forfiles_call()
Dim filepath, sCmd, listLength, cmdRslt, titleAndModifyTime, ListArray()
'パスを格納
filepath = "z:\Doc"
'shellオブジェクトを作成
Set WSH = CreateObject("WScript.Shell")
'forfilesコマンドで、対象ディレクトリのファイル名と更新日時を取得
sCmd = "forfiles /p " & filepath & " /c ""cmd /c echo @isdir:@file,@fdate @ftime"""
'コマンドを実行
Set wExec = WSH.Exec("%ComSpec% /c " & sCmd)
Do While wExec.Status = 0
DoEvents
Loop
'コマンド実行結果を格納
cmdRslt = wExec.StdOut.ReadAll
'コマンド実行結果からダブルクオテーションを削除、split関数で一次元配列に変換
titleAndModifyTime = Split(Replace(cmdRslt, """", ""), vbCrLf)
'リストの件数を格納
listLength = UBound(titleAndModifyTime)
'リストの件数をもとに、配列のサイズを確定
ReDim ListArray(1 To listLength, 1 To 2)
'配列の現在行
k = 1
'一次元配列から二次元配列に変換、1件づつ処理
For Each Item In titleAndModifyTime
'「空欄ではない」場合のみ処理実施
If Not (Item = "") Then
' 「フォルダでは無い」場合のみ処理実施
If Left(Item, 5) = "FALSE" Then
'一次元配列のカンマより左を二次元配列の1列目に追加
ListArray(k, 1) = Mid(Item, 7, InStr(Item, ",") - 7)
'一次元配列のカンマより右を二次元配列の2列目に追加
ListArray(k, 2) = Mid(Item, InStr(Item, ",") + 1, Len(Item))
' Excel2007ではInStrRevのバグでうまく検索されない為、以下を使用しなかった
' ListArray(k, 2) = Right(Item, InStrRev(Item, ",", -1, vbTextCompare) - 1)
'空欄でない場合のみ二次配列を次行へすすめる
k = k + 1
End If
End If
Next
'結果をセルに貼り付け
Range(Cells(1, 1), Cells(listLength - 1, 2)).Value = ListArray
'Setしたオブジェクトの解放
Set WSH = Nothing
Set wExec = Nothing
End Sub
サンプルコードに含まれる要素
・forfilesコマンドでファイル/フォルダの判別、ファイル名と更新日時の取得(FileSystemObject未使用)
・VBAからコマンドを実行
・標準出力を変数へ取得
・変数を二次元配列へ格納
・多次元配列をセルへ一括貼り付け
参考URL
Exec メソッド - MSDN - Microsoft
Forfiles - TechNet - Microsoft
Split 関数 - MSDN - Microsoft
Mid 関数 - MSDN - Microsoft