VBA・マクロツール

【知らなくても使える】フォルダ/ファイル情報を表示するマクロツール(Excel VBA)


日常業務を行うにあたって、「あるフォルダ内にあるフォルダやファイルの容量やそのフォルダにあるフォルダの数とファイルの数を一発で知りたい。」ということを思ったことはないでしょうか。

 

そのような場合は、以下のような操作を繰り返していないでしょうか。

  1. フォルダ情報を調べたいフォルダのパスに移動する。
  2. 対象のフォルダで右クリックして「プロパティ」をクリックする。
  3. ファイルサイズや含まれているファイル数/フォルダ数を確認する。

※上記の作業を対象のフォルダ数分繰り返す。

このような単純作業を自分の時間を削って、何度も何度も繰り返し行っていては、時間が非常にもったいないです。

 

そんな場面で、無駄な作業を効率化できる、フォルダ容量やファイル数を一発で知ることができる『ファイル・フォルダ情報を検索するマクロツール』をExcel VBAで作りました。

 

当記事にはマクロの元になるExcelファイルがダウンロード可能で、VBAのコードも記事内に記載がありますので、Excel VBAやマクロが良く分からないという方でもすぐに使用できます

当ツールを使用すれば定例業務の業務効率化が図れるかと思いますので、是非ご活用頂けたらと思います。

 

ツールの更新履歴

(2022年6月29日:更新)
・当ツールの直下にあるファイル/フォルダだけでなく、指定したフォルダ内にあるファイル/フォルダ情報を取得できるように変更しました。

(2022年11月26日:更新)
・全体的なUIを変更しました。

 

『フォルダ/ファイル情報表示ツール』の概要

当ツールがあるフォルダと同階層にあるファイルとフォルダのサイズ、種類、パスなどの情報やフォルダの場合はその直下にあるファイル数やフォルダ数を一覧で表示します。

 

基本的な機能、操作方法の説明

  1. フォルダ/ファイル情報表示ツールのマクロが入ったExcelファイル(***.xlsm)を開きます。

<当ツールがあるフォルダと同階層のファイル/フォルダ情報を検索したい場合>

  1. 「当ツールがあるフォルダ内のフォルダ/ファイル情報を検索」ボタンをクリックします。

 

開いているExcelファイルと同階層にあるファイルとフォルダの情報が表示されます。

 

各フォルダ、ファイルのプロパティから確認した情報はこちら

 

<指定したフォルダ内にあるファイル/フォルダ情報を検索したい場合>

  1. 「指定したフォルダ内のフォルダ/ファイル情報を検索」ボタンをクリックします。
  2. 表示されたファイル/フォルダ指定ダイアログより、対象のフォルダを選択します。
  3. 「OK」をクリックします。

 

指定したフォルダにあるファイル/フォルダ情報が表示されます。

 

使用する際の事前準備

このページの下部にある「Excelファイルのサンプル」からExcelファイルを取得し、「準備の手順」内にあるVBAコードを取得したExcelファイルに記載して保存すれば、すぐに当ツールを使用できます。

 

以下にその手順を説明していきます。

 

準備の手順

<手順1>

  1. サンプルのダウンロードはこちら」からサンプル(Excelファイル)をダウンロードし、ファイルを開きます。

※インターネットにあるマクロファイルをダウンロードすることはセキュリティ上リスクがあるので、マクロ無しExcelファイルを公開しています。

 

<手順2>

ダウンロードしたExcelファイルを開いて、VBE(Visual Basic Editor)を起動させます。

  1. Excelファイルの上部にあるリボンの「開発」タブを選択します。
  2. 「Visual Basic」をクリックして、VBE(Visual Basic Editor)を起動させます。

 

リボンに「開発」タブが表示されていない場合は、以下を参照ください。

(参考サイト:記事「Excel VBAを始める前に、最初にやっておくべき初期設定内容はこれ」の『開発』タブを表示させる

 

<手順3>

  1. 「Microsoft Excel Object」を右クリックします。
  2. 「挿入」を選択します。
  3. 「標準モジュール」をクリックします。

 

<手順4>

  1. 「Module1」をダブルクリックします。
  2. 表示されている右側の欄(エディター)に以下の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として、ファイルを保存します。

  1. 左上にある「保存」アイコンをクリックします。
  2. 「ファイルの種類」から「Excelマクロ有効ブック」を選択します。
  3. 「保存」をクリックします。

 

<手順6>

「当ツールがあるフォルダ内のフォルダ/ファイル情報を検索」ボタンにメイン処理「このフォルダ内のフォルダ/ファイル情報を検索_Click」のマクロを設定します。

  1. 「当ツールがあるフォルダ内のフォルダ/ファイル情報を検索」ボタンを右クリックします。
  2. 「マクロの登録」をクリックします。
  3. 「このフォルダ内のフォルダ/ファイル情報を検索_Click」を選択します。
  4. 「OK」をクリックします。

 

<手順7>

「指定したフォルダ内のフォルダ/ファイル情報を検索」ボタンにメイン処理「フォルダを指定してフォルダ/ファイル情報を検索_Click」のマクロを設定します。

  1. 「指定したフォルダ内のフォルダ/ファイル情報を検索」ボタンを右クリックします。
  2. 「マクロの登録」をクリックします。
  3. 「フォルダを指定してフォルダ/ファイル情報を検索_Click」を選択します。
  4. 「OK」をクリックします。

 

「当ツールがあるフォルダ内のフォルダ/ファイル情報を検索」ボタンと「指定したフォルダ内のフォルダ/ファイル情報を検索」ボタンにカーソルを当てて、指の形になっていることを確認します。

 

これで事前準備は完了です。

あとは「当ツールの使用方法」で記載された方法でツールを実行できます。

 

また、このようなExcelVBAを用いた業務効率化を行うときに、以下の書籍が実際のVBAコードを書く際に参考になると思いますので、良かったらご参照ください。

 

なお、当マクロの開発環境として、OSは “Windows10” 、Excelのバージョンは Microsoft Office 365″ で行っており、当該環境では動作確認ができていますが、他の環境で正常に動作するかは確認できていません。

 

正常に動作しない場合は、コメントいただければ幸いです。
また、このような業務効率化できるツールを以下に一覧でまとめてありますので、ご興味のある方はご覧ください。

業務効率化ツールの一覧(まとめ)

操作ごとにまとめて一覧で表示してあります。

Excel VBAを活用した便利マクロツール(まとめ)"Microsoft Excel"を使って業務効率化する際に使用できる便利なマクロツールを一覧で紹介します。 ...

 

サンプルのダウンロードはこちら

下記よりExcelファイルをダウンロードして、記事の途中にありました VBAのソースコードをツール内に組み込んで使用してください。

【Excel VBA】フォルダ/ファイル情報表示ツール

ツールのダウンロードはこちら

※インターネットにあるマクロファイルをダウンロードすることはセキュリティ上リスクがあるので、マクロ無しExcelファイルを公開しています

他に要望等ありましたら、可能な限り改修等を対応しますのでコメント頂ければと思います

 

<このツールが『結構使える!』と思ったら、下のグッドボタンを押していただけたら幸いです>

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です