ファイル操作

【VBA】フォルダの情報をサクッと取得する方法/VBA関数とGetFolderメソッドとFolderオブジェクト

更新日:2024/01/18

VBAでフォルダに含まれるファイルやサブフォルダを取得したり、サイズや作成日や属性などのフォルダ情報を取得する方法をお伝えします。

 

方法は二つ

VBAでフォルダの作成日やサイズや属性などのファイル情報を取得する方法は二つあります。

  1. VBAの関数を使う方法
    最終更新日、属性の2種類の情報を取得できます。
    ただし、各情報に対応した関数を呼び出す必要があります。

  2. 外部ライブラリのWindows Script Runtimeに含まれているFileSystemObjectオブジェクトGetFolderメソッドを使う方法
    こちらは一回のメソッド呼び出しで、フォルダ情報を全て取得できます。
    必要な情報が複数ある時は、VBA関数よりもGetFolderメソッドの方が効率的です。
    (ファイル情報の呼び出しは比較的重い処理なので、できれば一回で済ませた方がよいです)

 

ファイル情報を取得するVBA関数

フォルダの情報を取得するVBA関数は次の二つです。

関数名( 引数 )戻り値の型説明
FileDateTime( PathName )Date型最終更新日時を返す
GetAttr( PathName )Integer型ファイルまたはフォルダーの属性を返す

引数のPathNameは、フォルダーのパスを文字列で指定します。
FileDateTimeは、パスの最後にフォルダの区切り文字(\)があるとエラーになります。
GetAttrはエラーになりません。

FileDateTime関数は次のように使用します。

Sub folderInfoSample()
    Const fileName As String = "C:\Users\xxxx\Documents"
    
    Dim fileDate As Date
    fileDate = FileDateTime(fileName)
    
    Debug.Print "最終更新日時: " & fileDate
End Sub

実行するとイミディエイトウィンドウに、次のように表示されます。

最終更新日時: 2023/12/04 15:48:41

GetAttr関数は戻り値を次の表の値(VbFileAttribute列挙型)でAnd演算します。
結果が0以外の値なら、その属性を持っていることになります。

■VbFileAttribute列挙型
定数属性
vbAlias64エイリアス(Macのみ)
vbArchive32アーカイブフラグ
vbDirectory16フォルダー
vbHidden2隠し属性
vbNormal0標準ファイル
vbReadOnly1読み取り専用
vbSystem4システムファイル
vbVolume8ボリュームラベル

GetAttr関数の使用例です。

Sub attrInfoSample()
    Const fileName As String = "C:\Users\xxxx\Documents"
    
    Dim attr As Integer
    attr = GetAttr(fileName)
    
    Dim result As String
    
    If (attr And (vbDirectory Or vbSystem Or vbVolume Or vbAlias)) = 0 Then
        result = "標準ファイル|"
    End If
    
    If attr And vbAlias Then result = result & "エイリアス|"
    If attr And vbArchive Then result = result & "アーカイブ|"
    If attr And vbDirectory Then result = result & "フォルダー|"
    If attr And vbHidden Then result = result & "隠し属性|"
    If attr And vbReadOnly Then result = result & "読み取り専用|"
    If attr And vbSystem Then result = result & "システム|"
    If attr And vbVolume Then result = result & "エイリアス|"
    
    Debug.Print "属性は|" & result & "です"
    
End Sub

標準ファイルを表す定数 vbNormalは値が0なので、And演算を行うと必ず 0 になります。
そのため、標準ファイルかどうかをvbNormalで確認できません。

そこでフォルダやシステムファイル等でないことを確認することで、標準ファイルかどうかを確認しています。

 

GetFolderメソッド

GetFolderメソッドは、一回のメソッド呼び出しでフォルダ情報を全て取得できます
GetFolderメソッドはFileSystemObjectオブジェクトのメンバーです。

GetFolderメソッドを使用するには、まずはFileSystemObjectオブジェクトを取得する必要があります。

FileSystemObjectオブジェクトの取得方法は二つあります。
一つは、文字列"Scripting.FileSystemObject"をCreateObject関数に渡す方法です。

Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")

もう一つはVBエディタのメニュー:ツールから参照設定画面を開いて『Microsoft Scriptiong Runtime』を参照設定してから次のコードを実行する方法です。

Dim fso As New Scripting.FileSystemObject

参照設定をおこなうと、コード入力時にメソッド名候補が表示されます。
入力ミスを防げるので便利です。

構文と戻り値

GetFolderメソッドの構文は、次のようになっています。

FileSystemObjectオブジェクト.GetFolder( FolderPath )

FolderPathは、情報を確認するフォルダのパスです。

戻り値は、Folder オブジェクトです。

使用例

GetFolderメソッドの使用例です。
フォルダ内に含まれるサブフォルダとファイルを列挙しています。

Sub getFolderSample()
    Const folderName As String = "C:\Users\xxxx\Documents"
    
    Dim fso As New Scripting.FileSystemObject
    Dim folderObj As Folder
    
    Set folderObj = fso.GetFolder(folderName)
    
    Dim fo As Folder
    Debug.Print folderObj.name & "のサブフォルダー一覧"
    For Each fo In folderObj.SubFolders
        Debug.Print fo.name
    Next
    
    Dim fl As file
    Debug.Print folderObj.name & "のファイルー一覧"
    For Each fl In folderObj.Files
        Debug.Print fl.name
    Next
End Sub

Folder オブジェクトのSubFoldersは、Folderオブジェクトのコレクションです。
そのため、SubFoldersを辿っていくと再帰的にフォルダーの内容を確認できます。

次のコードはサブフォルダーの内容を再帰的に表示しています。

Sub printFolderList(folderName As String, Optional count As Integer = 0)
 
    Dim fso As New Scripting.FileSystemObject
    Dim folderObj As Folder
    
    Set folderObj = fso.GetFolder(folderName)
    
    Dim fo As Folder
   
    For Each fo In folderObj.SubFolders
        Debug.Print String(count, vbTab) & fo.name & "<DIR>"
        printFolderList folderName & "\" & fo.name, count + 1
    Next
    
    Dim fl As file

    For Each fl In folderObj.Files
        Debug.Print String(count, vbTab) & fl.name
    Next
End Sub

Sub getFolderSample2()
    Const folderName As String = "C:\Users\xxxx\Documents"
    printFolderList folderName
End Sub

上のコードはgetFolderSample2関数を実行するとprintFolderList関数が再帰的に呼び出されます。

 

Folderオブジェクト

Folderオブジェクトはフォルダの情報が格納されたオブジェクトです。
FileSystemObjectオブジェクトのGetFolderメソッドを使用して取得します。

プロパティ

Folderオブジェクトは、次のプロパティを持っています。

プロパティ名データ型内容
AttributesFileAttribute列挙型ファイルの属性16(Directory)
DateCreatedDate型作成された日時
※取得できない場合あり
2019/03/14 21:37:59
DateLastAccessedDate型最終アクセス日時
※取得できない場合あり
2023/12/01 17:53:19
DateLastModifiedDate型最終変更日時
※取得できない場合あり
2023/07/14 17:45:35
DriveDriveオブジェクトドライブ情報---
FilesFileオブジェクト
のコレクション
フォルダに含まれる
ファイル
---
IsRootFolderBoolean型ルートフォルダーかどうかFalse
NameString型フォルダ名"Documents"
ParentFolderFolderオブジェクト親フォルダー---
PathString型フォルダのパス"C:\Users\xxxx\Documents"
ShortNameString型短い名前(8.3形式)"DOCUME~1"
ShortPathString型短いパス(8.3形式)"C:\Users\xxxx\DOCUME~1"
SizeVariant型フォルダのサイズ
※取得できない場合あり
2201249467
SubFoldersFolderオブジェクト
のコレクション
フォルダに含まれる
フォルダ
---
TypeString型ファイルのタイプ"Microsoft Excel マクロ有効ワークシート"

Attributesプロパティは、次のFileAttribute列挙型をOr演算した値です。

■FileAttribute列挙型
定数内容
Alias1024リンクまたはショートカット
Archive32アーカイブフラグ
Compressed2048圧縮ファイル
Directory16フォルダー
Hidden2隠しファイル
Normal0標準ファイル
ReadOnly1読み取り専用ファイル
System4システムファイル
Volume8ボリュームラベル

DateCreated、DateLastAccessed、DateLastModifiedは、参照時にエラーが発生することがあります。
例えばルートフォルダ(c:\、d:\等)などです。
ルートフォルダかどうかはIsRootFolderで確認できますが、念のためエラーを捕捉した方がよいかもしれません。

Sizeプロパティは、フォルダ内にリンクや読み取り権限のないフォルダ等があると、参照時にエラーが発生します。
そのためフォルダサイズを取得するときは、エラー時にフォルダ内のファイルとサブフォルダのサイズを集計するコードを記述する必要があります。

当サイトでも作成しました。次のページで公開しています。

改良して使ってみてください。

メソッド

Folderオブジェクトは、次のメソッドを持っています。

メソッド名内容再利用
Copyフォルダをコピーする
CreateTextFileテキストファイルを作成して
TextStream オブジェクトを返す
Deleteフォルダーを削除する×
Moveフォルダーを移動する×
SubFolders.Addサブフォルダーを追加する

再利用が×のメソッドはフォルダ名等を変更します。
しかしFolderオブジェクトは変更前のフォルダを参照しています。

既に存在していないフォルダの操作を行うことになるので、メソッドは失敗します。

更新日:2024/01/18

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。