この記事では、EXCELで指定されたフォルダの下に作成されているフォルダのサイズを調べて一覧化する方法について説明しています。
VBAを利用してフォルダサイズを調べることができるので、簡単にすべてのフォルダサイズを把握することができます。
しかも、フォルダ階層もVBAが勝手に調べてくれます。
それでは、EXCELで指定したフォルダ配下のフォルダサイズを調べる機能を作成していきましょう。
困っている女性
困っている女性
困っている女性
解決する男性
解決する男性
困っている女性
◆似たような作業で、ファイル一覧を取得する方法については、以下の記事を参照してください。
【EXCEL:VBA】指定したフォルダに存在するファイル一覧を取得したい
◆他には、指定したフォルダ階層を一気に作成する方法については、以下の記事を参照してください。
【EXCEL: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 Scripting Runtime」を一覧から探し、チェックをつけて、OKボタンを押します。
【ステップ3】VBAでフォルダサイズを調べる機能を記入する
「Microsoft Visual Basic for Applications」にVBAプログラムを入力します。
標準モジュールを追加して、以下のソースを書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
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プログラムも記入します。
以下のソースも書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
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セルにベースとなるフォルダパスを入力します。
次に、「開発」タブの「マクロ」をクリックします。
先程作成した自作関数「MainProc」が一覧に表示されていますので、選択します。
次に、「実行」ボタンをクリックしてフォルダを作成します。
しばらく待つと、指定したフォルダ配下に存在するフォルダ全てのフォルダサイズが4行目以降に書かれます。
B列には、調べたフォルダパスが書かれます。
C列には、フォルダサイズをバイト単位で書かれます。
D列には、フォルダサイズをメガバイト(MB)単位で書かれます。
ちなみに、実際のフォルダは以下のようになっています。
フォルダサイズを調べるVBAプログラム(MainProc)の説明
それでは、VBAプログラム(MainProc)を説明します。
①参照するシートを変数に格納する
1 2 |
'①参照するシートを変数に格納する Set sht = ThisWorkbook.Sheets("フォルダサイズ") |
そうすることにより、入力するプログラムを短くすることができるからです。
何度も「ThisWorkbook.Sheets(“フォルダサイズ”)」と入力するより、「sht」と入力するほうが少なくてすむからです。
②ベースフォルダを変数に格納する
1 2 |
'②ベースフォルダを変数に格納する baseFd = sht.Range("A2") |
このあとの処理で、何度もベースフォルダを使うからです。
③FileSystemObjectを変数に格納する
1 2 3 4 |
'③FileSystemObjectを変数に格納する Set fso = CreateObject("Scripting.FileSystemObject") nowRow = 4 |
「FileSystemObject」はファイル操作やフォルダ操作をVBAで行うときに大変お世話になる便利なライブラリです、覚えておくと良いです。
④指定したフォルダ配下のサイズを調べる
1 2 |
'④指定したフォルダ配下のサイズを調べる Call WriteFolderSize(fso, sht, nowRow, baseFd) |
この自作関数は、指定したフォルダ配下の各フォルダのサイズを調べ、調べた結果をEXCELに書き込む機能になっています。
⑤FileSystemObjectをクリアする
1 2 |
'⑩FileSystemObjectをクリアする Set fso = Nothing |
フォルダサイズを調べるVBAプログラム(WriteFolderSize)の説明
それでは、VBAプログラム(WriteFolderSize)を説明します。
①フォルダオブジェクトを取得する
1 2 |
'①フォルダオブジェクトを取得する Set fdBase = fso.GetFolder(path) |
フォルダオブジェクトを取得し、フォルダ操作を行うからです。
②サブフォルダオブジェクトを取得する
1 2 |
'②サブフォルダオブジェクトを取得する Set fds = fdBase.SubFolders |
指定されたフォルダ配下のフォルダのサイズを調べるためです。
③各フォルダのサイズを調べ、EXCELに書き込みする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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 |
③では、「フォルダサイズ」シートの「No」列に1からの連番を書き込みしています。
④では、「フォルダ名」列にサブフォルダパスを書き込みします。
⑤では、「フォルダサイズ(バイト)」列にサブフォルダのフォルダサイズをバイト単位で書き込みしています。
⑥では、「フォルダサイズ(MB)」列にサブフォルダのフォルダサイズをメガバイト単位で書き込みしています。
バイトを1024で割っているのは、1キロバイト(KB)は1024バイトだからです。
さらに1024で割っているのは、1メガバイト(MB)は1024バイト×1024バイトだからです。
「WorksheetFunction.RoundDown」は、EXCEL関数の「RoundDown」(切り捨て)を呼び出しています。
小数点第3位以下の値を切り捨てしています。
⑦ではこの機能の肝となる部分です。
「WriteFolderSize」関数内で「WriteFolderSize」を呼んでいます。
つまり、自分自身から自分自身を呼んでいます。
これを「再帰呼び出し」といいます。
具体的には、現在のフォルダのサブフォルダを対象にフォルダサイズを調べるように指示を出しています。
そのサブフォルダの処理から、さらに「WriteFolderSize」が呼ばれることになります。
サブフォルダがなくなるまで、再帰的に処理が繰り返されます。
結果として、指定されたフォルダ配下の全てのサブフォルダを対象に、フォルダサイズを調べることができるようになります。
それでは、フォルダサイズを調べるツールを作って、作業を効率化しましょう。
以上です。
最後まで読んでいただきありがとうございました。
この記事をシェアしていただけると喜びます。