【VBA】フォルダの情報をサクッと取得する方法/VBA関数とGetFolderメソッドとFolderオブジェクト
更新日:2024/01/18
VBAでフォルダに含まれるファイルやサブフォルダを取得したり、サイズや作成日や属性などのフォルダ情報を取得する方法をお伝えします。
方法は二つ
VBAでフォルダの作成日やサイズや属性などのファイル情報を取得する方法は二つあります。
- VBAの関数を使う方法。
最終更新日、属性の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以外の値なら、その属性を持っていることになります。
定数 | 値 | 属性 |
---|---|---|
vbAlias | 64 | エイリアス(Macのみ) |
vbArchive | 32 | アーカイブフラグ |
vbDirectory | 16 | フォルダー |
vbHidden | 2 | 隠し属性 |
vbNormal | 0 | 標準ファイル |
vbReadOnly | 1 | 読み取り専用 |
vbSystem | 4 | システムファイル |
vbVolume | 8 | ボリュームラベル |
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オブジェクトのメンバーです。
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オブジェクトは、次のプロパティを持っています。
プロパティ名 | データ型 | 内容 | 例 |
---|---|---|---|
Attributes | FileAttribute列挙型 | ファイルの属性 | 16(Directory) |
DateCreated | Date型 | 作成された日時 ※取得できない場合あり | 2019/03/14 21:37:59 |
DateLastAccessed | Date型 | 最終アクセス日時 ※取得できない場合あり | 2023/12/01 17:53:19 |
DateLastModified | Date型 | 最終変更日時 ※取得できない場合あり | 2023/07/14 17:45:35 |
Drive | Driveオブジェクト | ドライブ情報 | --- |
Files | Fileオブジェクト のコレクション | フォルダに含まれる ファイル | --- |
IsRootFolder | Boolean型 | ルートフォルダーかどうか | False |
Name | String型 | フォルダ名 | "Documents" |
ParentFolder | Folderオブジェクト | 親フォルダー | --- |
Path | String型 | フォルダのパス | "C:\Users\xxxx\Documents" |
ShortName | String型 | 短い名前(8.3形式) | "DOCUME~1" |
ShortPath | String型 | 短いパス(8.3形式) | "C:\Users\xxxx\DOCUME~1" |
Size | Variant型 | フォルダのサイズ ※取得できない場合あり | 2201249467 |
SubFolders | Folderオブジェクト のコレクション | フォルダに含まれる フォルダ | --- |
Type | String型 | ファイルのタイプ | "Microsoft Excel マクロ有効ワークシート" |
Attributesプロパティは、次のFileAttribute列挙型をOr演算した値です。
定数 | 値 | 内容 |
---|---|---|
Alias | 1024 | リンクまたはショートカット |
Archive | 32 | アーカイブフラグ |
Compressed | 2048 | 圧縮ファイル |
Directory | 16 | フォルダー |
Hidden | 2 | 隠しファイル |
Normal | 0 | 標準ファイル |
ReadOnly | 1 | 読み取り専用ファイル |
System | 4 | システムファイル |
Volume | 8 | ボリュームラベル |
DateCreated、DateLastAccessed、DateLastModifiedは、参照時にエラーが発生することがあります。
例えばルートフォルダ(c:\、d:\等)などです。
ルートフォルダかどうかはIsRootFolderで確認できますが、念のためエラーを捕捉した方がよいかもしれません。
Sizeプロパティは、フォルダ内にリンクや読み取り権限のないフォルダ等があると、参照時にエラーが発生します。
そのためフォルダサイズを取得するときは、エラー時にフォルダ内のファイルとサブフォルダのサイズを集計するコードを記述する必要があります。
当サイトでも作成しました。次のページで公開しています。
改良して使ってみてください。
メソッド
Folderオブジェクトは、次のメソッドを持っています。
メソッド名 | 内容 | 再利用 |
---|---|---|
Copy | フォルダをコピーする | ○ |
CreateTextFile | テキストファイルを作成して TextStream オブジェクトを返す | ○ |
Delete | フォルダーを削除する | × |
Move | フォルダーを移動する | × |
SubFolders.Add | サブフォルダーを追加する | ○ |
再利用が×のメソッドはフォルダ名等を変更します。
しかしFolderオブジェクトは変更前のフォルダを参照しています。
既に存在していないフォルダの操作を行うことになるので、メソッドは失敗します。
更新日:2024/01/18
関連記事
スポンサーリンク
記事の内容について
こんにちはけーちゃんです。
説明するのって難しいですね。
「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。
裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。
掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。
ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php
このサイトは、リンクフリーです。大歓迎です。