

下記の通りドライブ直下にフォルダがあるとします。

  * C:\A
  * C:\B
  * C:\C

これらのドライブ直下のフォルダA,B,Cのみの、ファイル数と最終更新日時を下記の通りEXCEL上に集計したいと考えています。  
（A,B,C内のサブフォルダは対象外）

フォルダ名 | ファイル数 | 最終更新日時  
---|---|---  
A | 10 | 2021/3/2  
B | 100 | 2021/3/4  
C | 1000 | 2021/3/9  
  
上記のような処理は可能でしょうか？


CC BY-SA 4.0
2021-03-29T08:26:52.037
74964
2021-03-29T22:51:35.287
2021-03-29T22:51:35.287
4236
44559
question
vba excel batch-file
ドライブ直下のフォルダのファイル数と最終更新日時の取得


`vba`ならば下記のように[`FileSystemObject.GetFolder`](https://docs.microsoft.com/ja-
jp/office/vba/language/reference/user-interface-help/getfolder-
method)メソッドを使用することで実現可能です。  
最終更新日時は`FileSystemObject`の[`DateLastModified`](https://docs.microsoft.com/ja-
jp/office/vba/language/reference/user-interface-help/datelastmodified-
property)プロパティを取得するか、[`FileDateTime`](https://docs.microsoft.com/ja-
jp/office/vba/language/reference/user-interface-help/filedatetime-
function)メソッドで取得できます。

なおフォルダ内の最新ファイルを取得したい場合は`fso.GetFolder(target).Files`でループを行って最新更新日時を調べてください。

[code]

    Sub test()
        Cells(1, 1) = "フォルダ名" 
        Cells(1, 2) = "ファイル数" 
        Cells(1, 3) = "最終更新日時" 
    
        Dim target As String
        target = "C:\A"         '対象フォルダ
    
        Dim fso As Object
        Set fso = CreateObject("Scripting.FileSystemObject")
        Cells(2, 1) = fso.GetFolder(target).Name                'フォルダ名
        Cells(2, 2) = fso.GetFolder(target).Files.Count         'ファイル数
        Cells(2, 3) = fso.GetFolder(target).DateLastModified    '最終更新日時その1
        'Cells(2, 3) = FileDateTime(target)                      '最終更新日時その2
    
        Set fso = Nothing
    End Sub
    
[/code]


CC BY-SA 4.0
2021-03-29T09:33:09.840
74965
2021-03-29T09:33:09.840
9820
74964
answer


ちなみにExcelには[Power Query](https://support.microsoft.com/ja-
jp/office/excel-%E3%81%A7-power-
query-%E5%BC%8F%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-8e5e49a2-01c2-496e-b639-41f98f163238)という機能が搭載されています。これは様々なデータを取得加工しExcel上にテーブルの形で出力する独自言語です。これを使うと求められている表を実現できます。

[データ] - [データの取得] - [Power Queryエディターの起動] を実行し、  
[ホーム] - [新しいソース] - [その他のソース] - [空のクエリ] を選択し、  
[ホーム] - [詳細エディター] に次のコードを入力し、  
[ホーム] - [閉じて読み込む] を実行します。

[code]

    let
        ソース = Folder.Contents("C:\"),
        絞り込み = Table.SelectRows(ソース, each List.Contains({"A", "B", "C"}, [Name])),
        ファイル数追加 = Table.AddColumn(絞り込み, "ファイル数", each List.Count(List.Select([Content][Attributes], each [Kind] <> "Folder"))),
        列順序 = Table.SelectColumns(ファイル数追加,{"Name", "ファイル数", "Date modified"}),
        列名変更 = Table.RenameColumns(列順序,{{"Name", "フォルダ名"}, {"Date modified", "最終更新日時"}})
    in
        列名変更
    
[/code]

これで、次のようなテーブルが入力されるはずです。

[![画像の説明をここに入力](https://i.stack.imgur.com/1FZLH.png)](https://i.stack.imgur.com/1FZLH.png)

[データ] - [すべて更新] を実行すると、テーブルの内容が更新され、この場合、ファイル名や最終更新日時が書き変わります。

* * *

VBAと異なり、どのセルに何のデータが、といった対応情報は不要で、純粋にデータを処理できるたため使いこなせると便利です。


CC BY-SA 4.0
2021-03-29T15:58:21.997
74971
2021-03-29T15:58:21.997
4236
74964
answer