【Excel VBA】FSOでフォルダの合計サイズ(サブフォルダも含む)を取得する方法

特定のプロジェクトフォルダやバックアップフォルダが、ディスク上でどれくらいの容量を占めているかを確認したい、という場合があります。手作業でフォルダのプロパティを開けば確認できますが、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で把握したい場合に非常に強力なツールとなります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次