この記事では、EXCELで指定されたフォルダの下に作成されているフォルダのサイズを調べて一覧化する方法について説明しています。
VBAを利用してフォルダサイズを調べることができるので、簡単にすべてのフォルダサイズを把握することができます。
しかも、フォルダ階層もVBAが勝手に調べてくれます。
それでは、EXCELで指定したフォルダ配下のフォルダサイズを調べる機能を作成していきましょう。
困っている女性
困っている女性
困っている女性
解決する男性
解決する男性
困っている女性
◆似たような作業で、ファイル一覧を取得する方法については、以下の記事を参照してください。
◆他には、指定したフォルダ階層を一気に作成する方法については、以下の記事を参照してください。
手っ取り早く、このツールを利用したい方は、以下から「ダウンロード購入」できます。
BOOTH)各フォルダのサイズを一覧化するツール:【ExcelVBAツール】
Youtube動画に「フォルダサイズを一覧化するVBAツール」の作り方をアップしました。
よかったら、見てください。
フォルダサイズを一気に調べる機能を、1つ1つ順番に説明していきます。
もくじ
【ステップ1】ベースフォルダ指定欄、フォルダリスト表示欄を準備する
まず、ベースとなるフォルダを指定する欄とそのベースフォルダ配下のフォルダリストを表示させる欄を作成します。
「フォルダサイズ」シートを作成する
フォルダサイズシートを作成する
- 「フォルダサイズ」という名前のシートを作成します。
- 1行目に「ベースフォルダ」のタイトル行を作成します。
- 2行目に「ベースフォルダ」を入力する欄を作成します。
- 3行目に「No」、「フォルダ名」、「サイズ(バイト)」、「サイズ(MB)」のタイトル行を作成します。
- 4行目以降は、調べたフォルダリストを書き込む欄になります。
4行目以降の「No」、「フォルダ名」、「サイズ(バイト)」、「サイズ(MB)」はVBAプログラムが記入してくれます。
【ステップ2】必要なライブラリ「Microsoft Scripting Runtime」の参照設定をする
開発タブの「Visual Basic」をクリックして、「Microsoft Visual Basic for Applications」を起動します。
Microsoft Visual Basic for Applicationsを起動する
「ツール」の「参照設定」をクリックして、参照設定ダイアログを開きます。
参照設定ダイアログを開く
「Microsoft Scripting Runtime」を一覧から探し、チェックをつけて、OKボタンを押します。
Microsoft Scripting Runtimeを有効にする
【ステップ3】VBAでフォルダサイズを調べる機能を記入する
「Microsoft Visual Basic for Applications」にVBAプログラムを入力します。
VBAプログラムを記入する
標準モジュールを追加して、以下のソースを書きます。
Public Sub MainProc()
Dim sht As Worksheet
Dim fso As Object
Dim baseFd As String
Dim nowRow As Long
'①参照するシートを変数に格納する
Set sht = ThisWorkbook.Sheets("フォルダサイズ")
'②ベースフォルダを変数に格納する
baseFd = sht.Range("A2")
'③FileSystemObjectを変数に格納する
Set fso = CreateObject("Scripting.FileSystemObject")
nowRow = 4
'④指定したフォルダ配下のサイズを調べる
Call WriteFolderSize(fso, sht, nowRow, baseFd)
'⑤FileSystemObjectをクリアする
Set fso = Nothing
MsgBox "完了"
End Sub
続いて、次のVBAプログラムも記入します。
VBAプログラムを記入する(その2)
以下のソースも書きます。
Private Sub WriteFolderSize(ByRef fso As FileSystemObject, _
ByRef sht As Worksheet, _
ByRef nowRow As Long, ByVal path As String)
Dim fdBase As Folder
Dim fd As Folder
Dim fds As Folders
'①フォルダオブジェクトを取得する
Set fdBase = fso.GetFolder(path)
'②サブフォルダオブジェクトを取得する
Set fds = fdBase.SubFolders
For Each fd In fds
'③Noをセットする
sht.Cells(nowRow, 1) = nowRow - 3
'④フォルダ名をセットする
sht.Cells(nowRow, 2) = path & "\" & fd.Name
'⑤フォルダサイズ(バイト)をセットする
sht.Cells(nowRow, 3) = fd.Size
'⑥フォルダサイズ(MB)をセットする
sht.Cells(nowRow, 4) = WorksheetFunction.RoundDown(fd.Size / 1024 / 1024, 3)
nowRow = nowRow + 1
'⑦再帰的にサブフォルダのサイズを調べる
Call WriteFolderSize(fso, sht, nowRow, path & "\" & fd.Name)
Next
End Sub
最後にEXCELを「◯◯◯.xlsm」というような感じでマクロ有効ブック形式で保存します。
フォルダサイズを調べる機能の使い方
それでは、フォルダサイズを調べる方法を説明します。
まず、A2セルにベースとなるフォルダパスを入力します。
次に、「開発」タブの「マクロ」をクリックします。
VBAプログラムを実行する
先程作成した自作関数「MainProc」が一覧に表示されていますので、選択します。
次に、「実行」ボタンをクリックしてフォルダを作成します。
実行ボタンをクリックする
しばらく待つと、指定したフォルダ配下に存在するフォルダ全てのフォルダサイズが4行目以降に書かれます。
フォルダサイズを調べる機能を動かした結果
B列には、調べたフォルダパスが書かれます。
C列には、フォルダサイズをバイト単位で書かれます。
D列には、フォルダサイズをメガバイト(MB)単位で書かれます。
ちなみに、実際のフォルダは以下のようになっています。
実際のフォルダ階層
フォルダサイズを調べるVBAプログラム(MainProc)の説明
それでは、VBAプログラム(MainProc)を説明します。
①参照するシートを変数に格納する
'①参照するシートを変数に格納する
Set sht = ThisWorkbook.Sheets("フォルダサイズ")
ここでは、このあとの処理で何度も使う「フォルダサイズ」シートを変数に格納しています。
そうすることにより、入力するプログラムを短くすることができるからです。
何度も「ThisWorkbook.Sheets(“フォルダサイズ”)」と入力するより、「sht」と入力するほうが少なくてすむからです。
②ベースフォルダを変数に格納する
'②ベースフォルダを変数に格納する
baseFd = sht.Range("A2")
ここでは、A2セルに入力されているベースフォルダを変数に格納しています。
このあとの処理で、何度もベースフォルダを使うからです。
③FileSystemObjectを変数に格納する
'③FileSystemObjectを変数に格納する
Set fso = CreateObject("Scripting.FileSystemObject")
nowRow = 4
ここでは、「FileSystemObject」オブジェクトを変数に格納して、このあとの処理で利用できるようにします。
「FileSystemObject」はファイル操作やフォルダ操作をVBAで行うときに大変お世話になる便利なライブラリです、覚えておくと良いです。
④指定したフォルダ配下のサイズを調べる
'④指定したフォルダ配下のサイズを調べる Call WriteFolderSize(fso, sht, nowRow, baseFd)
ここでは、このあとで説明する自作関数「WriteFolderSize」を呼んでいます。
この自作関数は、指定したフォルダ配下の各フォルダのサイズを調べ、調べた結果をEXCELに書き込む機能になっています。
⑤FileSystemObjectをクリアする
'⑩FileSystemObjectをクリアする Set fso = Nothing
ここでは、これまで使ってきた「FileSystemObject」をクリアしています。
フォルダサイズを調べるVBAプログラム(WriteFolderSize)の説明
それでは、VBAプログラム(WriteFolderSize)を説明します。
①フォルダオブジェクトを取得する
'①フォルダオブジェクトを取得する Set fdBase = fso.GetFolder(path)
ここでは、指定されたフォルダパスからフォルダオブジェクトを取得しています。
フォルダオブジェクトを取得し、フォルダ操作を行うからです。
②サブフォルダオブジェクトを取得する
'②サブフォルダオブジェクトを取得する Set fds = fdBase.SubFolders
ここでは、指定されたフォルダ配下のサブフォルダたちを取得しています。
指定されたフォルダ配下のフォルダのサイズを調べるためです。
③各フォルダのサイズを調べ、EXCELに書き込みする
For Each fd In fds
'③Noをセットする
sht.Cells(nowRow, 1) = nowRow - 3
'④フォルダ名をセットする
sht.Cells(nowRow, 2) = path & "\" & fd.Name
'⑤フォルダサイズ(バイト)をセットする
sht.Cells(nowRow, 3) = fd.Size
'⑥フォルダサイズ(MB)をセットする
sht.Cells(nowRow, 4) = WorksheetFunction.RoundDown(fd.Size / 1024 / 1024, 3)
nowRow = nowRow + 1
'⑦再帰的にサブフォルダのサイズを調べる
Call WriteFolderSize(fso, sht, nowRow, path & "\" & fd.Name)
Next
ここでは、「For Each」を利用して、サブフォルダを1つずつ取り出し、全てのフォルダに対してそれ以降の処理(③から⑦)を繰り返します。
③では、「フォルダサイズ」シートの「No」列に1からの連番を書き込みしています。
④では、「フォルダ名」列にサブフォルダパスを書き込みします。
⑤では、「フォルダサイズ(バイト)」列にサブフォルダのフォルダサイズをバイト単位で書き込みしています。
⑥では、「フォルダサイズ(MB)」列にサブフォルダのフォルダサイズをメガバイト単位で書き込みしています。
バイトを1024で割っているのは、1キロバイト(KB)は1024バイトだからです。
さらに1024で割っているのは、1メガバイト(MB)は1024バイト×1024バイトだからです。
「WorksheetFunction.RoundDown」は、EXCEL関数の「RoundDown」(切り捨て)を呼び出しています。
小数点第3位以下の値を切り捨てしています。
⑦ではこの機能の肝となる部分です。
「WriteFolderSize」関数内で「WriteFolderSize」を呼んでいます。
つまり、自分自身から自分自身を呼んでいます。
これを「再帰呼び出し」といいます。
具体的には、現在のフォルダのサブフォルダを対象にフォルダサイズを調べるように指示を出しています。
そのサブフォルダの処理から、さらに「WriteFolderSize」が呼ばれることになります。
サブフォルダがなくなるまで、再帰的に処理が繰り返されます。
結果として、指定されたフォルダ配下の全てのサブフォルダを対象に、フォルダサイズを調べることができるようになります。
それでは、フォルダサイズを調べるツールを作って、作業を効率化しましょう。
以上です。
手っ取り早く、このツールを利用したい方は、以下から「ダウンロード購入」できます。
BOOTH)各フォルダのサイズを一覧化するツール:【ExcelVBAツール】
最後まで読んでいただきありがとうございました。
この記事をシェアしていただけると喜びます。

