大体でIT

-ちょっと使えるネタを紹介-

大体でIT

Excel VBAでサブフォルダを含むすべてのフォルダからファイル名やファイルパス、ファイルの拡張子、ファイルサイズ、更新日時を取得する方法をまとめました。フォルダ内の整理に役立つと思います。

はじめに

この記事ではフォルダ内のすべてのファイルのファイル名、サイズ、更新日時などのデータを一覧表で取得する方法について説明します。

フォルダ内を整理したいときに使えるVBAのテクニックだと思います。

この記事でわかること

  • ファイルに関するデータの取得方法がわかります
  • サブフォルダを含めたすべてのフォルダのデータを取得することができます

こんな感じの一覧表を取得することができます。

全ファイルのデータ一覧表が作成できます

フォルダパス/ファイルパス/ファイル名/拡張子/更新日時/ファイルサイズ取得結果

目次から見たい項目へ移動すると便利ですよ。

目次

ポイントになるVBAコードまとめ

最初にポイントとなるVBAコードについてまとめておきます。

'参照設定をします
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
    
a = FSO.GetFileName(FilePath) 'ファイル名
a = FSO.GetBaseName(FilePath) '拡張子を除いたファイル名
a = FSO.GetParentFolderName(FilePath) 'フォルダパス
a = FSO.GetExtensionName(FilePath) '拡張子
a = FSO.GetFile(FilePath).Size 'ファイルサイズ
a = FSO.GetFile(FilePath).DateCreated 'ファイル作成日時
a = FSO.GetFile(FilePath).DateLastModified '最終更新日時
a = FSO.GetFile(FilePath).DateLastAccessed '最終アクセス日時

'フォルダ内のファイルパス
For Each File In FSO.GetFolder(FolderPath).Files
    a = File 'ファイルパス
Next

'フォルダ内のサブフォルダ
For Each Folder In FSO.GetFolder(FolderPath).SubFolders
    a = Folder 'サブフォルダのパス
Next
'すべてのフォルダのサブフォルダパス
Sub Test()
    Call Test1(FilePath)
End Sub
Sub Test1(FolderPath As Variant)
    For Each Folder In FSO.GetFolder(FolderPath).SubFolders
        Call Test1(Folder)
    Next
    a = FolderPath 'サブフォルダのパス
End Sub

VBAコードは『FileSystemObject』を使ったコードとなっています。

では一つ一つ説明していきます。

ファイルパスからFileSystemObjectを使ってデータを取得する方法

ファイルパスからファイル名、ファイルパス、フォルダパス、ファイルサイズ、更新日などのデータを取得する方法をご説明します。

ファイル名

ファイルパスからファイル名を取得する方法です。

'ファイル名取得
Sub Test1()
    
    'ファイルパスを指定します
    Dim FilePath
    FilePath = "C:\TEST\DATA\Data1.xlsx"
    
    '参照設定をします
    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    ActiveSheet.Cells(1, 1) = FSO.GetFileName(FilePath) 'ファイル名
    
End Sub

FileSystemObjectを使いますので、『Set FSO = CreateObject("Scripting.FileSystemObject")』で参照設定します。

このコードを記載しておけばデータを配布したりする際もマクロ画面でツールから参照設定などする必要がないので便利です。

『FSO.GetFileName(FilePath)』のVBAコードでファイル名を取得することができます。

ファイル名を取得した結果です。

ファイル名取得

『C:\TEST\DATA\Data1.xlsx』からファイル名『Data1.xlsx』を取得できました。

拡張子を除いたファイル名

ファイルパスから拡張子を除いたファイル名を取得する方法です。

'拡張子を除いたファイル名取得
Sub Test2()
    
    'ファイルパスを指定します
    Dim FilePath
    FilePath = "C:\TEST\DATA\Data1.xlsx"
    
    '参照設定をします
    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")

    ActiveSheet.Cells(1, 1) = FSO.GetBaseName(FilePath) '拡張子を除いたファイル名
    
End Sub

『FSO.GetBaseName(FilePath)』で拡張子を除いたファイル名が取得できます。

拡張子を除いたファイル名取得

『C:\TEST\DATA\Data1.xlsx』から拡張子を除いたファイル名『Data1』が取得できました。

フォルダパス

ファイルパスからフォルダパスを取得する方法です。

'フォルダパス取得
Sub Test3()
    
    'ファイルパスを指定します
    Dim FilePath
    FilePath = "C:\TEST\DATA\Data1.xlsx"
    
    '参照設定をします
    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")

    ActiveSheet.Cells(1, 1) = FSO.GetParentFolderName(FilePath) 'フォルダパス
    
End Sub

『FSO.GetParentFolderName(FilePath)』でフォルダパスを取得できます。

フォルダパス取得

『C:\TEST\DATA\Data1.xlsx』からフォルダパス『C:\TEST\DATA』が取得できました。

拡張子

ファイルパスからファイルの拡張子を取得する方法です。

'拡張子取得
Sub Test4()
    
    'ファイルパスを指定します
    Dim FilePath
    FilePath = "C:\TEST\DATA\Data1.xlsx"
    
    '参照設定をします
    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    ActiveSheet.Cells(1, 1) = FSO.GetExtensionName(FilePath) '拡張子
    
End Sub

『FSO.GetExtensionName(FilePath)』でファイルの拡張子が取得できます。

拡張子取得

『C:\TEST\DATA\Data1.xlsx』からファイルの拡張子『xlsx』が取得できました。

ファイルサイズ

ファイルパスからファイルサイズを取得する方法です。

'ファイルサイズ取得
Sub Test5()
    
    'ファイルパスを指定します
    Dim FilePath
    FilePath = "C:\TEST\DATA\Data1.xlsx"
    
    '参照設定をします
    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    ActiveSheet.Cells(1, 1) = FSO.GetFile(FilePath).Size 'ファイルサイズ
    
End Sub

『FSO.GetFile(FilePath).Size』でファイルサイズを取得することができます。

ファイルサイズ取得

『C:\TEST\DATA\Data1.xlsx』からファイルサイズ『11323』バイトが取得できました。

作成日時

ファイルパスから作成日時を取得する方法です。

'作成日時取得
Sub Test6()
    
    'ファイルパスを指定します
    Dim FilePath
    FilePath = "C:\TEST\DATA\Data1.xlsx"
    
    '参照設定をします
    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    ActiveSheet.Cells(1, 1) = FSO.GetFile(FilePath).DateCreated 'ファイル作成日時
    
End Sub

『FSO.GetFile(FilePath).DateCreated』でファイルの作成日時が取得できます。

ファイル作成日時取得

『C:\TEST\DATA\Data1.xlsx』からファイルの作成日時『2020/8/6 18:31』が取得できました。

最終修正日時

ファイルパスから最終修正日時を取得する方法です。

'最終修正日時取得
Sub Test7()
    
    'ファイルパスを指定します
    Dim FilePath
    FilePath = "C:\TEST\DATA\Data1.xlsx"
    
    '参照設定をします
    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    ActiveSheet.Cells(1, 1) = FSO.GetFile(FilePath).DateLastModified '最終更新日時
    
End Sub

『FSO.GetFile(FilePath).DateLastModified』を使ってファイルの最終修正日時を取得できます。

最終更新日時取得

『C:\TEST\DATA\Data1.xlsx』からファイルの最終修正日時『2020/7/21 15:55』が取得できました。

最終アクセス日時

ファイルパスからファイルの最終アクセス日時を取得する方法です。

'アクセス日時取得
Sub Test8()
    
    'ファイルパスを指定します
    Dim FilePath
    FilePath = "C:\TEST\DATA\Data1.xlsx"
    
    '参照設定をします
    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    ActiveSheet.Cells(1, 1) = FSO.GetFile(FilePath).DateLastAccessed '最終アクセス日時
    
End Sub

『FSO.GetFile(FilePath).DateLastAccessed』を使ってファイルの最終アクセス日時を取得します。

最終アクセス日時取得

『C:\TEST\DATA\Data1.xlsx』からファイルの最終アクセス日時『2020/8/6 18:31』を取得できました。

フォルダ内のファイルパスを取得する方法

ファルダ内のすべてのファイルパスを取得する方法です。

取得するファイル

取得したいファイルはこちらになっています。

取得するファイル

VBAコード

フォルダ内のすべてのファイルパスを取得するVBAコードはこちらです。

'フォルダ内のファイルパスを取得
Sub Test9()
    
    'フォルダパスを指定します
    Dim FolderPath
    FolderPath = "C:\TEST\DATA"
    
    '参照設定をします
    Dim FSO As Object, Folder As Variant, File As Variant
    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    'フォルダ内のファイルを探します
    i = 0
    For Each File In FSO.GetFolder(FolderPath).Files
        i = i + 1
        ActiveSheet.Cells(i, 1) = File 'ファイルパス
    Next
    
End Sub

ファイルパスの取得結果です。

ファイルパスの取得結果

ファイルパスの取得結果

フォルダ内のすべてのファイルパスが取得できています。

VBAコードのポイントは『FSO.GetFolder().Files』を使うところです。

FSO.GetFolder().Filesを使う

'フォルダ内のファイルを探します
i = 0
For Each File In FSO.GetFolder(FolderPath).Files
    i = i + 1
    ActiveSheet.Cells(i, 1) = File 'ファイルパス
Next

『For Each File In FSO.GetFolder(FolderPath).Files』で変数Fileにフォルダ内のファイルパスを格納することができます。

『ActiveSheet.Cells(i, 1) = File』で取得したファイルパスFileをセルに入力しています。

すべてのサブフォルダ内のファイルパスを取得する

すべてのサブフォルダ内のファイルパスを取得する方法です。

取得するサブフォルダ内のファイル

取得するサブフォルダ内のファイルはこちらです。

取得するサブフォルダ内のファイル

VBAコード

サブフォルダ内すべてのファイルパスを取得するVBAコードになります。2つのコードがセットです。

'パブリック変数を設定します(モジュールの一番上に設定します)
Public Datai As Variant

'サブフォルダも含むフォルダ内のファイルパス取得
Sub Test10()
    
    'フォルダパスを指定します
    Datai = 0
    Call Test11("C:\TEST\DATA")
    
End Sub
'サブフォルダを含むフォルダ内のファイルをすべて探します
Sub Test11(FolderPath As Variant)
    
    '参照設定をします
    Dim FSO As Object, Folder As Variant, File As Variant
    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    'フォルダ内のサブフォルダを探します
    For Each Folder In FSO.GetFolder(FolderPath).SubFolders
        Call Test11(Folder)
    Next
    
    'フォルダ内のファイルを探します
    For Each File In FSO.GetFolder(FolderPath).Files
        Datai = Datai + 1
        ActiveSheet.Cells(Datai, 1) = File 'ファイルパス
    Next
    
End Sub

この最初の方法のコードを実行した結果です。

サブフォルダ内のファイルパスの取得結果

サブフォルダ内のファイルパスの取得結果

サブフォルダを含めたフォルダ内のファイルパスが取得できていることがわかります。多くなったのですべての見えませんがすべて取得できています。

一つ目のポイントが『FSO.GetFolder().SubFolders』を使うところです。

FSO.GetFolder().SubFoldersを使う

'フォルダ内のサブフォルダを探します
For Each Folder In FSO.GetFolder(FolderPath).SubFolders
    a = Folder 'ここでサブフォルダのパスが取得できます
Next

『For Each Folder In FSO.GetFolder(FolderPath).SubFolders』とすることでフォルダFolderPath内のすべてのサブフォルダを変数Folderへ格納することができます。

次の『再帰的に使用』の部分が少し難しいです。

FileSystemObjectを再帰的に使用

Sub Test11(FolderPath As Variant)
     
    For Each Folder In FSO.GetFolder(FolderPath).SubFolders
        Call Test11(Folder)
    Next
    
    a = FolderPath 'ここですべてのサブフォルダのパスが取得できます
    
End Sub

再帰的に使用は、コード内に自分のコードを入れて使用することです。上の赤色で示したところです。

このようにすることで最初に探したサブフォルダ内のさらにサブフォルダを見つけることができます。

少しわかりづらいですが、サブフォルダを探すイメージはこちらになります。

サブフォルダを探索するイメージ図

サブフォルダを探索するイメージ図

最初は『DATA』内のサブフォルダ『A』から探索が始まります。

そしてサブフォルダ『A』の中のサブフォルダ『C』を見つけます。

さらに『C』の中のサブフォルダを見つけようとしますがサブフォルダはもうないので一旦ループが終了します。ここでサブフォルダ『C』のフォルダパスを取得することができます。これが図の①のところです。

先ほど見つけた『A』の中のもう一つのサブフォルダ『D』を見つけて『D』内のサブフォルダがないので同じように一旦ループが終了してサブフォルダ『D』のフォルダパスを取得します。これが図の②のところです。

こを繰り返して次はサブフォルダ『A』(③)、サブフォルダ『E』(④)、サブフォルダ『F』(⑤)、サブフォルダ『B』(⑥)、フォルダ『DATA』(⑦)の順番にフォルダパスを取得していきます。

あとは、見つけたフォルダパス内のファイルパスをすべて取得すればフォルダ内のすべてのファイルパスを取得することができます。

FSO.GetFolder().Filesを使う

'パブリック変数を設定します(モジュールの一番上に設定します)
Public Datai As Variant

'フォルダ内のファイルを探します
For Each File In FSO.GetFolder(FolderPath).Files
    Datai = Datai + 1
    ActiveSheet.Cells(Datai, 1) = File 'ファイルパス
Next

先ほど説明したファイルパスの取得と同じように『For Each File In FSO.GetFolder(FolderPath).Files』でファイルパスFileを取得します。

先ほどと違うのが再帰的にコードを実行しても変数Dataiの値を保持するため変数Dataiを『Public Datai As Variant』でパブリック変数としています。

パブリック変数はマクロが実行されている間データを保持してくれます。通常はモジュール内のみで変数が保持されます。モジュールはSub~End Subの中のことですね。

『Datai = Datai + 1』だけ入力するセルの行を増やしてセルへ入力していっています。

すべてのファイルの一覧表を作成する(完成版)

説明してきたVBAコードを使ってすべてのファイルの一覧表を作成する方法になります。

取得するファイルのフォルダ構成はこちらです。

取得するサブフォルダ内のファイル

取得するサブフォルダ内のファイル

完成版のVBAコード

サブフォルダ内のすべてのファイルパスを取得してファイルの各種情報を取得するVBAコードです。

2つのコードがセットになります。

'パブリック変数を設定します(モジュールの一番上に設定します)
Public Datai As Variant

'サブフォルダを含むフォルダ内のファイルデータを取得します(完成)
Sub Test12()
    
    Datai = 1
    Call Test13("C:\TEST\DATA")
    
End Sub
'サブフォルダも含むフォルダ内のファイルデータを探します(完成)
Sub Test13(FolderPath As Variant)
    
    '参照設定をします
    Dim FSO As Object, Folder As Variant, File As Variant
    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    'フォルダ内のサブフォルダを探します
    For Each Folder In FSO.GetFolder(FolderPath).SubFolders
        Call Test13(Folder)
    Next
    
    'フォルダ内のファイルを探索します
    For Each File In FSO.GetFolder(FolderPath).Files
        Datai = Datai + 1
        ActiveSheet.Cells(Datai, 1) = FolderPath 'フォルダパス
        ActiveSheet.Cells(Datai, 2) = File 'ファイルパス
        ActiveSheet.Cells(Datai, 3) = FSO.GetFileName(File) 'ファイル名
        ActiveSheet.Cells(Datai, 4) = FSO.GetExtensionName(File) '拡張子
        ActiveSheet.Cells(Datai, 5) = FSO.GetFile(File).Size 'ファイルサイズ
        ActiveSheet.Cells(Datai, 6) = FSO.GetFile(File).DateCreated '作成日時
        ActiveSheet.Cells(Datai, 7) = FSO.GetFile(File).DateLastModified '最終更新日時
        ActiveSheet.Cells(Datai, 8) = FSO.GetFile(File).DateLastAccessed '最終アクセス日時
    Next
    
End Sub

フォルダパス/ファイルパス/ファイル名/拡張子/更新日時/ファイルサイズ取得結果

実行した結果はこちらです。

フォルダパス/ファイルパス/ファイル名/拡張子/更新日時/ファイルサイズ取得結果

サブフォルダを含むフォルダからフォルダパス、ファイルパス、ファイル名、拡張子、更新日時、ファイルサイズといったデータが取得できていることがわかります。

おわりに

今回ご紹介したVBAコードを使えばフォルダ内のファイルを確認しやすくなりますし、大きくなったフォルダの整理などに使えるかと思います。

『更新日時』が古くて、『ファイルサイズ』が大きいファイルを『ファイルパス』を使ってVBAで削除するみたいな感じでフォルダ整理作業を効率化できそうです。

最後までご覧くださいましてありがとうございました。

関連する記事から探す

カテゴリから探す

カテゴリから見たい項目を探すと便利ですよ。

アーカイブから探す