【Excelマクロ】フォルダ内のファイルの一覧と更新時間を取得する
※プログラムの誤りを修正しました
Excelで、サブフォルダも含めたファイルの一覧とファイルの更新時間を取得するマクロを紹介します。
ファイル一覧の取得ついでに、ハイパーリンクで一覧からすぐにファイルにアクセスできるようにもしておきます。
所定のファイルが揃っているか確認する時などに使えると思います。
では早速、内容を紹介します。
ワークシート側
ワークシートの見た目はこんな感じです。(ファイルの一覧を取得後の状態)
使い方は下記の通りです。
- B1セルにファイルの一覧を取得するパスを指定する。
- B2セルに一覧化するファイルのフィルタ条件を指定する。
(DIRコマンドのオプション相当。「*」なら全て、「*.xlsx」なら拡張子が.xlsxのものだけ、とか) - マクロ「ファイル一覧取得」を実行する。
- 4行目以降に、ファイルへのリンク、フォルダ名、ファイル名、更新時間、の順に出力される。
マクロ側
※このマクロを実行するためには、VBAエディタのメニュー > ツール > 参照設定で「Microsoft Scripting Runtime」を参照するように設定しておいてください。
前述のワークシートのレイアウトだとして、マクロは下記のようになります。
Sub ファイル一覧取得()
Dim パス As String
Dim フィルタ As String
Dim 出力行Index As Long
Range("A4:D1048576").ClearContents 'ファイル一覧をクリアする
パス = Cells(1, 2)
フィルタ = Cells(2, 2)
出力行Index = 4
Call ファイル一覧取得Sub(パス, フィルタ, 出力行Index) '
End Sub
Function ファイル一覧取得Sub(ByVal パス As String, ByVal フィルタ As String, ByRef 出力行Index As Long)
Dim fso As New Scripting.FileSystemObject '
Dim fileo As File
Dim foldero As Folder
Dim ファイル名 As String
If Right(パス, 1) <> "\" Then
パス = パス + "\"
End If
ファイル名 = Dir(パス & フィルタ)
Do While ファイル名 <> ""
Set fileo = fso.GetFile(パス & ファイル名)
ActiveSheet.Hyperlinks.Add Anchor:=Cells(出力行Index, 1), _
Address:=パス & ファイル名, _
TextToDisplay:="■" 'リンク
Cells(出力行Index, 2) = fileo.ParentFolder 'フォルダ名
Cells(出力行Index, 3) = fileo.Name 'ファイル名
Cells(出力行Index, 4) = fileo.DateLastModified '更新日付
出力行Index = 出力行Index + 1
ファイル名 = Dir()
Loop
'サブフォルダのファイル一覧を取得する
For Each foldero In fso.GetFolder(パス).SubFolders
Call ファイル一覧取得Sub(foldero.path, フィルタ, 出力行Index)
Next
End Function
まとめ
以上で、Excel上でファイルのリストを取得することができるようになります。
一覧を取得したファイルに対して定型処理をするような場合、Excelで一覧取得と定型処理をまとめて実行するのもよいですね。
ちなみに、ファイルの一覧と更新時間を取得するのであれば、コマンドプロンプトでdirコマンドを使えば取得できます。
単発でファイルのリストを取得したいのであれば、そちらの方が手っ取り早いでしょう。
Excel作業を楽にしよう
日頃、面倒だなと思っている作業も、Excelのことを少し知るだけで簡単に片付けられるようになったりします。
どんなことができるのかを知っているだけでも違うので、よくExcelを使うという方は参考書などをざっと見てみることをオススメします!
Kindle Unlimited会員なら無料で読めるExcel関連書籍を紹介しておきます。
.
ディスカッション
コメント一覧
サブフォルダのファイル一覧を取得する関数のところで、出力先Indexが再帰前の値を継続してしまうので、階層内に複数フォルダが含まれていると、結果が上書きされてしまいます。
Callする前にIndexを見直す必要があります。
コメントありがとうございます。確かにその通りですね...
ファイル一覧取得Subの引数「出力行Index」を ByVal → ByRef に修正しました。