はじめに
Windows パソコンで「空き容量が不足しています」といったメッセージが表示されたとき「どのフォルダが大きいのだろう?」と悩んだことはありませんか?
エクスプローラーで見てみてもフォルダのサイズが表示されないんです。
「フォルダサイズがぱっとパっとわかるようにしたい」そんな時は Excel マクロです。
Excel マクロをつかえば、自分で指定したパスのフォルダサイズの一覧をファイル名 + ファイルサイズで取得し、そのデータをもとにグラフ化できます。
この記事では、実際に私が作成したフォルダサイズの一覧表を算出しそのデータをもとにグラフ化する Excel マクロの作成方法(シート構成 + ソースコード)についてご紹介します。
※ 2019/10/17 時点でバージョンアップしました!!!
- 入力済みの値とグラフの削除
- フォルダパスを入力ダイアログから指定
- フォルダサイズ取得時にエラーが発生した場合、空白で出力
- その他(タイトル、ボタン等の追加)
フォルダサイズをグラフ化するマクロ
今回作成する Excel マクロは下記のような動作を行います。
- マクロの実行ボタンを押します。
- ダイアログ画面を表示させ、フォルダサイズ一覧を表示させるフォルダを選択します。
- シートにフォルダサイズ一覧とグラフが表示されます。
作成方法
(1)Excel のシートを以下のようなレイアウトを作成します。
※ 表のレイアウトについてですが、一行目の A 列、B列に下記画面のように表のヘッダー名を入力してください。
(2)VBA の編集画面(赤枠の箇所)に次の全てコードをコピーして貼り付けます。
※ 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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
' 定数定義 Const GRAPH_TITLE As String = "ファイルサイズ一覧" Const LABEL_Y As String = "ファイルサイズ (Bytes)" Const LABEL_X As String = "ファイル名" Const GRAPH_PLACE As String = "D4" ' 指定したフォルダ内のファイルサイズをグラフ表示 Sub main() Dim fname As String ' ダイアログからファイル名取得 fname = printDialog() ' ファイル名取得できたらグラフで出力 If fname <> "" Then Call printGraph(fname) End If End Sub ' グラフ出力 Private Sub printGraph(ByVal fname As String) Dim num As Long: num = 1 Dim FSO As Object, fileinfo As Variant Set FSO = CreateObject("Scripting.FileSYstemObject") ' グラフに表示させる値を出力 For Each fileinfo In FSO.GetFolder(fname).subFolders num = num + 1 Cells(num, 1) = FSO.GetFolder(fileinfo).Name Cells(num, 2) = FSO.GetFolder(fileinfo).Size Next fileinfo Set FSO = Nothing ' 出力するグラフの種類 With ActiveSheet.Shapes.AddChart.Chart .ChartType = xlColumnClustered .SetSourceData Source:=ActiveSheet.Range("A1:B" & getMaxRow(2)) .ChartTitle.Text = GRAPH_TITLE .HasLegend = False ' Y軸の設定 With .Axes(xlValue) .HasTitle = True ' .AxisTitle.Caption = LABEL_Y End With ' X軸の設定 With .Axes(xlCategory) .HasTitle = True ' .AxisTitle.Caption = LABEL_X End With End With ' グラフの位置 With ActiveSheet.ChartObjects .Top = Range(GRAPH_PLACE).Top .Left = Range(GRAPH_PLACE).Left .Height = 300 .Width = 400 End With End Sub ' ファイル選択用ダイヤログ表示 Function printDialog() Dim fname As Variant With Application.FileDialog(msoFileDialogFolderPicker) If .Show = True Then fname = .SelectedItems(1) End If End With printDialog = fname End Function ' 最終行番号 Function getMaxRow(row As Integer) As Integer getMaxRow = Range(convertAToNum(row) & "65536").End(xlUp).row End Function ' 列番号変換 アルファベット → 数値 Function convertAToNum(ByVal num As Long) As String tmp = Cells(1, num).Address(True, False) convertAToNum = Left(tmp, InStr(tmp, "$") - 1) End Function |
(3)上記のマクロをボタン化します(マクロ名 : 「main」、ボタン名はなんでもOK!)
※ マクロをボタン化する方法は、下記リンクを参考ください。
ソースコード詳細
今回作成したマクロは主に3つの関数(Sub プロシージャ)から構成されています。
この章で、定数の定義と下記の関数について説明します。
- メイン関数(下記2つの処理を含む関数)
- ファイル名を取得するダイアログを表示させる関数
- フォルダ名からグラフ出力する関数
定数の定義
グラフの表示項目について定義します。
- GRAPH_TITLE : グラフのタイトル名
- LABEL_X,LABEL_Y : X軸とY軸のラベル名
- GRAPH_PLACE : 表の位置
1 2 3 4 5 |
' 定数定義 Const GRAPH_TITLE As String = "ファイルサイズ一覧" Const LABEL_Y As String = "ファイルサイズ (Bytes)" Const LABEL_X As String = "ファイル名" Const GRAPH_PLACE As String = "D4" |
メイン関数
メイン関数内では、2つの処理を行います。
- ダイアログからフォルダ名取得し fname という変数に代入(ダイアログから取得したフォルダ名)
- 取得したフォルダ名 fname からフォルダ内のファイルサイズを取得しグラフ化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
' 指定したフォルダ内のファイルサイズをグラフ表示 Sub main() Dim fname As String ' ダイアログからファイル名取得 fname = printDialog() ' ファイル名取得できたらグラフで出力 If fname <> "" Then Call printGraph(fname) End If End Sub |
ファイル名を取得するダイアログを表示させる関数
Application.FIleDialog から フォルダ名を取得します。
今回は「キャンセル」ボタンが押されたときは何も処理していません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
' ファイル選択用ダイヤログ表示 Function printDialog() Dim fname As Variant With Application.FileDialog(msoFileDialogFolderPicker) If .Show = True Then fname = .SelectedItems(1) End If End With printDialog = fname End Function |
フォルダ名からグラフ出力する関数
長いので分けて説明します。
(本当はプロシージャ内のコードは 20行に抑えたかったのですが、長くなってしまいすみません)。
まず、フォルダ内の情報(フォルダ名、フォルダサイズ)を取得します。
そしてその情報を A列にフォルダ名、B列からフォルダサイズを順に出力させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
' グラフ出力 Private Sub printGraph(ByVal fname As String) Dim num As Long: num = 1 Dim FSO As Object, fileinfo As Variant Set FSO = CreateObject("Scripting.FileSYstemObject") ' グラフに表示させる値を出力 For Each fileinfo In FSO.GetFolder(fname).subFolders num = num + 1 Cells(num, 1) = FSO.GetFolder(fileinfo).Name Cells(num, 2) = FSO.GetFolder(fileinfo).Size Next fileinfo Set FSO = Nothing |
グラフを棒グラフとして出力させるように設定します(xlColumnClustered)。
グラフにはタイトル名と軸ラベル付きで表示させるようにしています。
A列、B列で出力させた値をグラフにします。A列 → X 軸 、B列 → Y軸 に表示させます。
下記、4行目の getMaxRow は引数を列番号とし、その列番号から最大行番号を取得するプロシージャです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
' 出力するグラフの種類 With ActiveSheet.Shapes.AddChart.Chart .ChartType = xlColumnClustered .SetSourceData Source:=ActiveSheet.Range("A1:B" & getMaxRow(2)) .ChartTitle.Text = GRAPH_TITLE .HasLegend = False ' Y軸の設定 With .Axes(xlValue) .HasTitle = True ' .AxisTitle.Caption = LABEL_Y End With ' X軸の設定 With .Axes(xlCategory) .HasTitle = True ' .AxisTitle.Caption = LABEL_X End With End With |
グラフの位置とサイズについて指定します。
今回はグラフの位置をセル番号D4(定数 : GRAPH_LABELとして定義済み)に表示しています。
1 2 3 4 5 6 7 8 |
' グラフの位置 With ActiveSheet.ChartObjects .Top = Range(GRAPH_PLACE).Top .Left = Range(GRAPH_PLACE).Left .Height = 300 .Width = 400 End With End Sub |
以下は私がよく使う便利プロシージャです。
いいなと思いましたら是非参考にしてみてください。
- getMaxRow : ある列の最終行番号を取得(引数は列番号)
- convertAToNum : 列番号のアルファ別途変換をします(例 列番号A → 1 に変換)
1 2 3 4 5 6 7 8 9 10 |
' 最終行番号 Function getMaxRow(row As Integer) As Integer getMaxRow = Range(convertAToNum(row) & "65536").End(xlUp).row End Function ' 列番号変換 アルファベット → 数値 Function convertAToNum(ByVal num As Long) As String tmp = Cells(1, num).Address(True, False) convertAToNum = Left(tmp, InStr(tmp, "$") - 1) End Function |
最後に
いかがでしたでしょうか?
コマンドプロンプトでもフォルダ内のサイズはわかるんですが、グラフ化することで一目でわかるようにしたく今回作成しました。
もし作成した Excel マクロが欲しい方は下記ボタンからダウンロードください。