特定のプロジェクトフォルダやバックアップフォルダが、ディスク上でどれくらいの容量を占めているかを確認したい、という場合があります。手作業でフォルダのプロパティを開けば確認できますが、VBAを使えばこの情報も自動で取得できます。
FileSystemObject (FSO)
のFolder
オブジェクトが持つ**.Size
プロパティを使えば、指定したフォルダに含まれる全ファイル・全サブフォルダの合計サイズ**を簡単に取得することが可能です。
【準備】参照設定
FSOを快適に利用するため、VBAエディタでツール
> 参照設定
を開き、**「Microsoft Scripting Runtime」**にチェックを入れておくことを推奨します。
完成したVBAコード
以下は、このマクロが書かれているExcelファイルと同じ場所にあるフォルダを対象に、その合計サイズをバイト・KB・MB・GBの各単位で算出し、メッセージボックスに表示するVBAコードです。
'参照設定: Microsoft Scripting Runtime
Sub GetFolderTotalSize()
' 変数を宣言します
Dim fso As New FileSystemObject
Dim targetFolder As Folder
Dim folderPath As String
Dim sizeInBytes As Currency ' 大きな数値も扱えるようにCurrency型を使用
Dim message As String
'--- 調査対象のフォルダパスを設定 ---
folderPath = ThisWorkbook.Path
' フォルダが存在しない場合は処理を中断
If Not fso.FolderExists(folderPath) Then
MsgBox "対象フォルダが見つかりません。", vbCritical
Exit Sub
End If
'--- 1. Folderオブジェクトを取得 ---
Set targetFolder = fso.GetFolder(folderPath)
'--- 2. .Sizeプロパティで合計サイズを取得 ---
sizeInBytes = targetFolder.Size
'--- 3. 単位を変換してメッセージを作成 ---
message = "【フォルダサイズ情報】" & vbCrLf & vbCrLf & _
"対象フォルダ: " & targetFolder.Path & vbCrLf & _
"---------------------------------" & vbCrLf & _
"バイト: " & Format(sizeInBytes, "#,##0") & " B" & vbCrLf & _
"キロバイト: " & Format(sizeInBytes / 1024, "#,##0.00") & " KB" & vbCrLf & _
"メガバイト: " & Format(sizeInBytes / 1024 / 1024, "#,##0.00") & " MB" & vbCrLf & _
"ギガバイト: " & Format(sizeInBytes / 1024 / 1024 / 1024, "#,##0.00") & " GB"
'--- 4. 結果を表示 ---
MsgBox message, vbInformation, "フォルダサイズの取得"
' オブジェクトを解放
Set targetFolder = Nothing
Set fso = Nothing
End Sub
コードのポイント解説
① Folderオブジェクトの取得
Set targetFolder = fso.GetFolder(folderPath)
まず、サイズを調べたいフォルダのパスを使い、GetFolder
メソッドでFolder
オブジェクトを取得します。
② .Size
プロパティ
sizeInBytes = targetFolder.Size
これが、フォルダの合計サイズを取得する核心部分です。Folder
オブジェクトの.Size
プロパティは、そのフォルダに含まれるすべてのアイテムの合計サイズをバイト単位で返します。
重要なのは、この合計サイズが再帰的に計算されるという点です。つまり、フォルダ直下のファイルのサイズだけでなく、その中にあるすべてのサブフォルダ、さらにその中の孫フォルダ…と、階層の奥深くまで含まれるすべてのファイルのサイズを合計した値が返されます。
③ 単位の変換と書式設定
取得したサイズはバイト単位なので、人間にとって分かりやすいKB(キロバイト)、MB(メガバイト)、GB(ギガバイト)に変換するには、1024
で割っていきます。
- KB:
sizeInBytes / 1024
- MB:
sizeInBytes / 1024 / 1024
- GB:
sizeInBytes / 1024 / 1024 / 1024
また、Format
関数を使うことで、数値を3桁区切りの見やすい文字列に整形しています。
【応用】サブフォルダごとのサイズを一覧化する
このテクニックを応用すれば、指定したフォルダ内にあるサブフォルダそれぞれの合計サイズを、一覧としてシートに書き出すといった、より実用的なマクロも作成できます。
Sub ListSubfolderSizes()
Dim fso As New FileSystemObject
Dim parentFolder As Folder
Dim subFld As Folder
Dim i As Long
Set parentFolder = fso.GetFolder(ThisWorkbook.Path)
i = 2
Range("A1:B1").Value = Array("サブフォルダ名", "合計サイズ (MB)")
' 親フォルダ内の全サブフォルダをループ
For Each subFld In parentFolder.SubFolders
Cells(i, 1).Value = subFld.Name
Cells(i, 2).Value = subFld.Size / 1024 / 1024 ' MB単位で表示
i = i + 1
Next subFld
Columns("A:B").AutoFit
End Sub
まとめ
FSOを使えば、フォルダの合計サイズを簡単に取得できます。
- まず、**
fso.GetFolder("パス")
**でFolder
オブジェクトを取得する。 - そのオブジェクトの**
.Size
**プロパティを参照する。
このプロパティが返す値は、サブフォルダの奥深くまで、すべてのファイルのサイズを再帰的に合計したものであり、ディスクの使用状況をVBAで把握したい場合に非常に強力なツールとなります。