日常業務を行うにあたって、「あるフォルダ内にあるフォルダやファイルの容量やそのフォルダにあるフォルダの数とファイルの数を一発で知りたい。」ということを思ったことはないでしょうか。
そのような場合は、以下のような操作を繰り返していないでしょうか。
- フォルダ情報を調べたいフォルダのパスに移動する。
- 対象のフォルダで右クリックして「プロパティ」をクリックする。
- ファイルサイズや含まれているファイル数/フォルダ数を確認する。
※上記の作業を対象のフォルダ数分繰り返す。
このような単純作業を自分の時間を削って、何度も何度も繰り返し行っていては、時間が非常にもったいないです。
そんな場面で、無駄な作業を効率化できる、フォルダ容量やファイル数を一発で知ることができる『ファイル・フォルダ情報を検索するマクロツール』をExcel VBAで作りました。
なお、アップデートしたツールも作成しましたので、良かったら参照ください。
アップデート版の変更点は以下になります。
- 選択したフォルダ内にあるサブファイル、サブフォルダを含めた全ての情報を表示します。
- 表示したサブフォルダ等の情報は一番左より折りたたむことができます。
当記事にはマクロの元になるExcelファイルがダウンロード可能で、VBAのコードも記事内に記載がありますので、Excel VBAやマクロが良く分からないという方でもすぐに使用できます。
当ツールを使用すれば定例業務の業務効率化が図れるかと思いますので、是非ご活用頂けたらと思います。
・当ツールの直下にあるファイル/フォルダだけでなく、指定したフォルダ内にあるファイル/フォルダ情報を取得できるように変更しました。
・全体的なUIを変更しました。
『フォルダ/ファイル情報表示ツール』の概要
当ツールがあるフォルダと同階層にあるファイルとフォルダのサイズ、種類、パスなどの情報やフォルダの場合はその直下にあるファイル数やフォルダ数を一覧で表示します。
基本的な機能、操作方法の説明
- フォルダ/ファイル情報表示ツールのマクロが入ったExcelファイル(***.xlsm)を開きます。
<当ツールがあるフォルダと同階層のファイル/フォルダ情報を検索したい場合>
- 「当ツールがあるフォルダ内のフォルダ/ファイル情報を検索」ボタンをクリックします。
開いているExcelファイルと同階層にあるファイルとフォルダの情報が表示されます。
各フォルダ、ファイルのプロパティから確認した情報はこちら
<指定したフォルダ内にあるファイル/フォルダ情報を検索したい場合>
- 「指定したフォルダ内のフォルダ/ファイル情報を検索」ボタンをクリックします。
- 表示されたファイル/フォルダ指定ダイアログより、対象のフォルダを選択します。
- 「OK」をクリックします。
指定したフォルダにあるファイル/フォルダ情報が表示されます。
使用する際の事前準備
このページの下部にある「Excelファイルのサンプル」からExcelファイルを取得し、「準備の手順」内にあるVBAコードを取得したExcelファイルに記載して保存すれば、すぐに当ツールを使用できます。
以下にその手順を説明していきます。
準備の手順
<手順1>
- 「サンプルのダウンロードはこちら」からサンプル(Excelファイル)をダウンロードし、ファイルを開きます。
※インターネットにあるマクロファイルをダウンロードすることはセキュリティ上リスクがあるので、マクロ無しExcelファイルを公開しています。
<手順2>
ダウンロードしたExcelファイルを開いて、VBE(Visual Basic Editor)を起動させます。
- Excelファイルの上部にあるリボンの「開発」タブを選択します。
- 「Visual Basic」をクリックして、VBE(Visual Basic Editor)を起動させます。
リボンに「開発」タブが表示されていない場合は、以下を参照ください。
(参考サイト:記事「Excel VBAを始める前に、最初にやっておくべき初期設定内容はこれ」の『開発』タブを表示させる)
<手順3>
- 「Microsoft Excel Object」を右クリックします。
- 「挿入」を選択します。
- 「標準モジュール」をクリックします。
<手順4>
- 「Module1」をダブルクリックします。
- 表示されている右側の欄(エディター)に以下のVBAコードを記載します。
VBAのソースコードはこちら
以下のVBAコードをコピーして、「Module1」内のエディターに貼り付けます。
※VBAコードの右上のアイコンをクリックするとソースコードをコピーできます
Option Explicit
'---------(設定値)---------------------------
Private Const START_DATA_ROW = 10 '1.テーブル見出し行の行番号
Private Const START_DATA_COL_NUM = 2 '2.テーブル見出し列の列番号
Private Const SUM_COUNT_POINT = "C5" '3.合計ファイル数/フォルダ数のセル位置
Private Const SUM_SIZE_POINT = "C6" '4.合計サイズのセル位置
'---------(メッセージ)-----------------------
Private Const Msg1 = "検索ワードを入力してください。"
Private Const Msg2 = "検索対象が見つかりませんでした。"
Private Const Msg3 = "ファイル/フォルダ情報を検索する対象のフォルダを指定して下さい。"
Private Const EMsg1 = "予期せぬエラーが発生しました"
'----------------------------------------------
Private TmpFilesCnt As Long
Private TmpFoldersCnt As Long
Private BaseSheet As Worksheet
'===========================================
'このフォルダ内のファイル/フォルダ情報検索を実行した際のメイン処理
'===========================================
Sub このフォルダ内のファイルフォルダ情報を検索_Click()
On Error GoTo err
Application.ScreenUpdating = False
Application.EnableEvents = False
Set BaseSheet = ThisWorkbook.ActiveSheet
'初期処理
Call Initialize
'ファイル、フォルダ情報を取得する処理
Call searchFileInfo(ThisWorkbook.Path)
Application.ScreenUpdating = True
Application.EnableEvents = True
Exit Sub
err:
MsgBox EMsg1
End Sub
'===========================================
'フォルダを指定してファイル/フォルダ情報検索を実行した際のメイン処理
'===========================================
Sub フォルダを指定してファイルフォルダ情報を検索_Click()
On Error GoTo err
Application.ScreenUpdating = False
Application.EnableEvents = False
Set BaseSheet = ThisWorkbook.ActiveSheet
'初期処理
Call Initialize
Dim importDir As String '検索するファイル等が入っている対象のフォルダ
'フォルダ選択ダイアログを表示させる
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = Msg3
If .Show <> 0 Then
importDir = .SelectedItems(1)
Else
End
End If
End With
'ファイル、フォルダ情報を取得する処理
Call searchFileInfo(importDir)
Application.ScreenUpdating = True
Application.EnableEvents = True
Exit Sub
err:
MsgBox EMsg1
End Sub
'-------------------------------------
'指定したフォルダ内にあるファイル/フォルダの情報を取得する
'-------------------------------------
Sub searchFileInfo(folderPath As String)
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject") 'ファイルシステムオブジェクトの生成
Dim pfl As Object '親フォルダ
Set pfl = fso.GetFolder(folderPath) '親フォルダを取得
Dim fl As Object '子フォルダ
Dim f As Object '子ファイル
Dim row As Long: row = START_DATA_ROW
Dim sumFileCnt As Long '合計ファイル数
Dim sumFolderCnt As Long '合計フォルダ数
Dim sumSize As Double '合計サイズ
Dim dspFormat As String '表示書式
'サブフォルダの一覧を取得
For Each fl In pfl.subFolders
On Error Resume Next
'フォルダ数/ファイル数を取得する関数
Call GetfFolderFileCnt(fl.Path)
BaseSheet.Cells(row, START_DATA_COL_NUM).Value = fl.Name 'フォルダの名称
BaseSheet.Cells(row, START_DATA_COL_NUM + 1).Value = fl.Type 'フォルダの種類
BaseSheet.Cells(row, START_DATA_COL_NUM + 2).Value = GetSize(fl.Size, dspFormat) 'フォルダのサイズ
BaseSheet.Cells(row, START_DATA_COL_NUM + 2).NumberFormatLocal = dspFormat '書式を変更する
BaseSheet.Cells(row, START_DATA_COL_NUM + 3).Value = TmpFoldersCnt 'フォルダ数
BaseSheet.Cells(row, START_DATA_COL_NUM + 4).Value = TmpFilesCnt 'ファイル数
BaseSheet.Cells(row, START_DATA_COL_NUM + 5).Value = fl.Path 'フォルダのパス
sumSize = sumSize + fl.Size
sumFolderCnt = sumFolderCnt + 1
row = row + 1
TmpFoldersCnt = 0
TmpFilesCnt = 0
Next
' ファイルの一覧を取得
For Each f In pfl.Files
'実行ファイル以外のファイルに対してファイル情報を取得する
If InStr(f.Name, ThisWorkbook.Name) = 0 Then
BaseSheet.Cells(row, START_DATA_COL_NUM).Value = f.Name 'ファイルの名称
BaseSheet.Cells(row, START_DATA_COL_NUM + 1).Value = f.Type 'ファイルの種類
BaseSheet.Cells(row, START_DATA_COL_NUM + 2).Value = GetSize(f.Size, dspFormat) 'ファイルのサイズ
BaseSheet.Cells(row, START_DATA_COL_NUM + 2).NumberFormatLocal = dspFormat '書式を変更する
BaseSheet.Cells(row, START_DATA_COL_NUM + 3).Value = "-" 'フォルダ数(ハイフン固定)
BaseSheet.Cells(row, START_DATA_COL_NUM + 4).Value = "-" 'ファイル数(ハイフン固定
BaseSheet.Cells(row, START_DATA_COL_NUM + 5).Value = f.Path 'ファイルのパス
sumSize = sumSize + f.Size
sumFileCnt = sumFileCnt + 1
row = row + 1
End If
Next
BaseSheet.Range(SUM_COUNT_POINT).Value = sumFolderCnt & "フォルダ / " & sumFileCnt & "ファイル"
BaseSheet.Range(SUM_SIZE_POINT).Value = GetSize(sumSize, dspFormat)
BaseSheet.Range(SUM_SIZE_POINT).NumberFormatLocal = dspFormat
Dim endRow As Long
Dim endCol As Long
'表の最終行番号を取得する
endRow = Cells.Find(What:="*", LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).row
endCol = Cells.Find(What:="*", LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Column
Dim bs As Borders
Set bs = Range(Cells(START_DATA_ROW, START_DATA_COL_NUM), Cells(endRow, endCol)).Borders ' 上下左右の罫線
bs.LineStyle = xlContinuous '罫線:実践(細)
bs.ColorIndex = 15 '罫線色:灰色
Set fso = Nothing
End Sub
'-------------------------------------
'初期処理を行う(表内の値の削除、罫線の削除)
'-------------------------------------
Sub Initialize()
Dim endRange As Range
Set endRange = BaseSheet.Cells(START_DATA_ROW, START_DATA_COL_NUM).SpecialCells(xlLastCell)
BaseSheet.Range(Cells(START_DATA_ROW, START_DATA_COL_NUM), Cells(endRange.row, endRange.Column)).ClearContents '範囲内の数式と文字を削除
BaseSheet.Range(Cells(START_DATA_ROW, START_DATA_COL_NUM), Cells(endRange.row, endRange.Column)).Borders.LineStyle = xlLineStyleNone '範囲内の罫線:表示しない
End Sub
'-------------------------------------
'ファイルサイズを取得する
' ※丸め処理をする
'-------------------------------------
Function GetSize(roundSize As Double, Optional ByRef dspFmt As String)
Dim fileSize As String
If roundSize > 1000000000 Then
fileSize = Round(roundSize / 1000000000, 3)
dspFmt = "###.###,,,"" GB"""
ElseIf roundSize > 1000000 Then
fileSize = Round(roundSize / 1000000, 3)
dspFmt = "###.###,,"" MB"""
ElseIf roundSize > 1000 Then
fileSize = Round(roundSize / 1000, 3)
dspFmt = "###.###,"" KB"""
Else
fileSize = roundSize
dspFmt = "###.###"" B"""
End If
GetSize = roundSize
End Function
'-------------------------------------
'フォルダ内のファイルとフォルダ数を取得する
' ※再帰的に取得する
'-------------------------------------
Private Sub GetfFolderFileCnt(folderPath As String)
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim fileCnt As Variant
Dim folderCnt As Variant
If fso.GetFolder(folderPath).subFolders.Count > 0 Then
'フォルダパスを指定してすべてのサブフォルダを取得
Dim subFolders As Object
For Each subFolders In fso.GetFolder(folderPath).subFolders
Call GetfFolderFileCnt(subFolders.Path) 'サブフォルダが存在した場合は再帰処理をする
TmpFoldersCnt = TmpFoldersCnt + 1
Next subFolders
End If
TmpFilesCnt = TmpFilesCnt + fso.GetFolder(folderPath).Files.Count
Set fso = Nothing
End Sub
<手順5>
マクロを含んだExcelとして、ファイルを保存します。
- 左上にある「保存」アイコンをクリックします。
- 「ファイルの種類」から「Excelマクロ有効ブック」を選択します。
- 「保存」をクリックします。
<手順6>
「当ツールがあるフォルダ内のフォルダ/ファイル情報を検索」ボタンにメイン処理「このフォルダ内のフォルダ/ファイル情報を検索_Click」のマクロを設定します。
- 「当ツールがあるフォルダ内のフォルダ/ファイル情報を検索」ボタンを右クリックします。
- 「マクロの登録」をクリックします。
- 「このフォルダ内のフォルダ/ファイル情報を検索_Click」を選択します。
- 「OK」をクリックします。
<手順7>
「指定したフォルダ内のフォルダ/ファイル情報を検索」ボタンにメイン処理「フォルダを指定してフォルダ/ファイル情報を検索_Click」のマクロを設定します。
- 「指定したフォルダ内のフォルダ/ファイル情報を検索」ボタンを右クリックします。
- 「マクロの登録」をクリックします。
- 「フォルダを指定してフォルダ/ファイル情報を検索_Click」を選択します。
- 「OK」をクリックします。
「当ツールがあるフォルダ内のフォルダ/ファイル情報を検索」ボタンと「指定したフォルダ内のフォルダ/ファイル情報を検索」ボタンにカーソルを当てて、指の形になっていることを確認します。
これで事前準備は完了です。
あとは「当ツールの使用方法」で記載された方法でツールを実行できます。
なお、当マクロの開発環境は、OS:Windows10 、Excelソフトウェア:Microsoft Office 365となっており、当環境では動作確認ができていますが、他の環境で正常に動作するかは確認できていません。
正常に動作しない場合は、コメントいただければ幸いです。
また以下にて、このような業務効率化できるツールを機能ごとの一覧でまとめてますので、ご興味のある方はご覧ください。
自力で業務効率化できるツール等を作成する場合は、「オンラインITスクール」を利用するとモチベーションを保ちつつ、効率的に学習とアウトプットができると思います。
上記の「侍テラコヤ」は月額2,980円~ という日本最安級の料金でプログラミング学習ができ、今なら初めての方でも安心できる「1か月全額返金保証」があります。
自分に合わないと感じた場合は返金してもらえるため、ノーリスクで試すことができます。是非一度体験してみることをオススメします ^ ^
ツールのダウンロードはこちら
下記よりExcelファイルをダウンロードして、記事の途中にありました VBAのソースコードをツール内に組み込んで使用してください。
【Excel VBA】フォルダ/ファイル情報表示ツール
※インターネットにあるマクロファイルをダウンロードすることはセキュリティ上リスクがあるので、マクロ無しExcelファイルを公開しています
他に要望等ありましたら、可能な限り改修等を対応しますのでコメント頂ければと思います。
<このツールが『結構使える!』と思ったら、下のグッドボタンを押していただけたら幸いです>
フォルダーとサブフォルダーに入っているすべてのファイル情報を表示するマクロツールはどんな感じになるのでしょうか?
管理人のRHです。
初心者さん、コメントありがとうございます。
全てのフォルダとサブフォルダに入っている全てのファイル情報を表示するようツールを改良する場合は、既存のツールのB列にあたる「フォルダ名/ファイル名」を内包されているファイル階層分だけ列を増やした形式になると思います。
作成する場合は、ファイルの数だけ処理を行うので、大多数のフォルダをダイアログで指定した際は処理がとても重くなる可能性があります。
ありがとうございます。
ソースコードだけ編集してB列にフォルダーとサブフォルダーに入っているすべてのファイルを取得する方法はありますか?
上記の説明のやり方はうまく理解できなかったので。初心者で申し訳ないです。
管理人のRHです。
初心者さん、コメントありがとうございます。
失礼しました、ご要望内容を承知しました。
ではどのようにすれば、サブフォルダのファイル情報も表示できるかを追記しますので、少々お待ちください。
管理人のRHです。
初心者さん、お待たせしました。
指定したフォルダ内のサブフォルダを含むすべてのファイルの情報を表示できるツールを作成しましたので、以下よりご参照ください。
https://resthill.blog/excel-vba-tool22/