【ExcelVBA】サブフォルダ含めて全てのフォルダ内のファイルの数を拡張子別に円グラフで表示するには

この記事では、サブフォルダ含めて全てのフォルダ内のファイルの数を拡張子別に円グラフで表示する方法についてご説明します。

【動画】サブフォルダ含めて全てのフォルダ内のファイルの数を拡張子別に円グラフで表示する実際の動き

本題に入る前に、まずは次の動画をご覧ください。


サブフォルダ含めて全てのフォルダ内のファイルを取得したら、ファイルの種類ごとにいくつファイルがあるのか集計します。

集計したら、その集計した結果をグラフに参照させて表示させます。

マクロ作成の流れ

STEP.1
トップのフォルダ配下全てのフォルダからフォルダオブジェクトを取得する
トップのフォルダ配下全てのフォルダからフォルダオブジェクトを取得します。
STEP.2
フォルダ配下全てのファイルの拡張子を取得するため、再帰処理を使って繰り返し(For Eachステートメントを使用)行う
フォルダ配下全てのファイルの拡張子を取得するため、再帰処理を使って繰り返し(For Eachステートメントを使用)行います。
STEP.3
STEP.2で取得したファイル名をシート「data」に出力する
STEP.2で取得したファイル名をシート「data」に出力します。
STEP.4
Dictionaryを使って、STEP.3で出力されたファイルの拡張子を種類別に合計した数をDictionaryに格納する
Dictionaryを使って、STEP.3で出力されたファイルの拡張子を種類別に合計した数をDictionaryに格納します。
STEP.5
Dictionaryの値をシート「data」に出力するため、シート「data」をクリアする
Dictionaryの値をシート「data」に出力するため、シート「data」をクリアします。
STEP.6
Dictionaryに格納された拡張子と拡張子ごとに合計されたファイル数をシート「data」に出力する
Dictionaryに格納された拡張子と拡張子ごとに合計されたファイル数をシート「data」に出力します。
STEP.7
円グラフを生成し、シート「data」の値を参照させて円グラフに表示させる
円グラフを生成し、シート「data」の値を参照させて円グラフに表示させます。

Excelファイルの例

今回は次のExcelファイルを用意しました。

サブフォルダ含めて全てのフォルダ内のファイルを検索するトップディレクトリを入力するセル(黄色のセル)、そしてグラフを出力するボタンが設置されています。

トップディレクトリを入力するセル(黄色のセル)にトップディレクトリを入力してグラフを出力するボタンをクリックすると、下のようにグラフが出力されます。

なお、今回のマクロではファイルの数だけでなく割合についても表示させています。(拡張子ごとに全体の何パーセントを占めているのか)

ちなみにサブフォルダ含めて全てのフォルダ内のファイルは下の通りです。

  1. 「sample.iso」:「C:¥work¥10_勉強¥10_VBA関連¥0268¥file」配下
  2. 「temp1.txt」:「C:¥work¥10_勉強¥10_VBA関連¥0268¥file」配下
  3. 「tmp.docx」:「C:¥work¥10_勉強¥10_VBA関連¥0268¥file」配下
  4. 「data10000.csv」:「C:¥work¥10_勉強¥10_VBA関連¥0268¥file¥1」配下
  5. 「test.mdb」:「C:¥work¥10_勉強¥10_VBA関連¥0268¥file¥1」配下
  6. 「2020.csv」:「C:¥work¥10_勉強¥10_VBA関連¥0268¥file¥2」配下
  7. 「file.mdb」:「C:¥work¥10_勉強¥10_VBA関連¥0268¥file¥2」配下
  8. 「info.pdf」:「C:¥work¥10_勉強¥10_VBA関連¥0268¥file¥2」配下
  9. 「ltr.csv」:「C:¥work¥10_勉強¥10_VBA関連¥0268¥file¥2」配下
  10. 「file.mdb」:「C:¥work¥10_勉強¥10_VBA関連¥0268¥file¥2¥2_1」配下
  11. 「sample.csv」:「C:¥work¥10_勉強¥10_VBA関連¥0268¥file¥2¥2_1」配下
  12. 「test_bk.docx」:「C:¥work¥10_勉強¥10_VBA関連¥0268¥file¥2¥2_1」配下
  13. 「to.pdf」:「C:¥work¥10_勉強¥10_VBA関連¥0268¥file¥2¥2_1」配下
  14. 「DBSQbk.msi」:「C:¥work¥10_勉強¥10_VBA関連¥0268¥file¥3」配下
  15. 「test_data2.xlsm」:「C:¥work¥10_勉強¥10_VBA関連¥0268¥file¥3」配下
  16. 「DBS.msi」:「C:¥work¥10_勉強¥10_VBA関連¥0268¥file¥3¥3_1」配下

以上のファイルの拡張子ごとの合計の内訳は下の通りです。

  1. txt:1
  2. docx:2
  3. csv:4
  4. mdb:3
  5. pdf:2
  6. msi:2
  7. xlsm:1
 「C:¥work¥10_勉強¥10_VBA関連¥0268¥file」配下

 「C:¥work¥10_勉強¥10_VBA関連¥0268¥file¥1」配下

 「C:¥work¥10_勉強¥10_VBA関連¥0268¥file¥2」配下

 「C:¥work¥10_勉強¥10_VBA関連¥0268¥file¥2¥2_1」配下

 「C:¥work¥10_勉強¥10_VBA関連¥0268¥file¥3」配下

 「C:¥work¥10_勉強¥10_VBA関連¥0268¥file¥2¥3_1」配下

コードの例

Option Explicit

Private Sub btn_exec_Click()

    Dim ws          As Worksheet    'ワークシート変数
    Dim dWs         As Worksheet    'ワークシート変数
    Dim FolderPath  As String       'フォルダのパス
    Dim cnt         As Integer      'カウンタ用変数
    Dim chartObj    As ChartObject  'グラフ用変数
    Dim dict        As Object       'Dictionary用のインスタンス変数
    Dim cell        As Range        'セル用変数
    Dim Key         As Variant      'Dictionary用のインスタンスのキー用変数
    Dim tCnt        As Long         '総数
    
    'シートを取得する
    Set ws = Worksheets("work")
    
    '「data」のシートを取得する
    Set dWs = ThisWorkbook.Sheets("data")
    
    'シート「data」をクリアする
    dWs.Cells.ClearContents
    
    'フォルダとファイルを検索したいフォルダのトップ階層のパスを取得する
    FolderPath = Worksheets("work").Range("dirPath").Value
    
    'カウンタを初期化する
    cnt = 1
    
    'フォルダとファイルを検索するサブルーチンを呼び出す
    Call fileSearch(FolderPath, cnt)
    
    'シート上に存在しているグラフの数だけ処理を繰り返すFor文
    For Each chartObj In ws.ChartObjects
    
        'グラフを削除する
        chartObj.Delete
        
    Next chartObj

    'Dictionaryを使うために、Dictionary用のインスタンスを生成する
    Set dict = CreateObject("Scripting.Dictionary")

    'シート「data」に出力されたCSVファイルのデータ件数分処理を繰り返すFor文
    For Each cell In dWs.Range("A1:A" & dWs.Cells(dWs.Rows.Count, "A").End(xlUp).Row)

        'シート「data」のA列のセルの値(データの種類)をDictionaryインスタンスに格納し、その出現回数をカウントする
        dict(cell.Value) = dict(cell.Value) + 1

        DoEvents

    Next cell

    'CSVファイルのデータを集計した値が格納された「dict」の値をシート「data」に出力するため、シート「data」をクリアする
    dWs.Cells.ClearContents
    
    'カウンタを初期化する
    cnt = 1
    
    'Dictionaryインスタンスに格納された拡張子の種類数分処理を繰り返すFor文
    For Each Key In dict.Keys

        'シート「data」のA列にデータの種類を出力する
        dWs.Cells(cnt, "A").Value = Key

        'シート「data」のB列にデータの種類の出現回数を出力する
        dWs.Cells(cnt, "B").Value = dict(Key)
        
        '総数をカウントする
        tCnt = tCnt + dWs.Cells(cnt, "B").Value

        cnt = cnt + 1

        DoEvents

    Next Key

    If dict.Count = 1 Then

        '拡張子が1種類だけの場合

        '⇒グラフに表示される拡張子の文言表示が正常に表示されないので、ダミーで1件追加しておく
        'シート「data」のセルA2に「ダミー」の文字列を出力する(適当な文字列「ダミー」を出力)
        dWs.Cells(2, "A").Value = "ダミー"

        'シート「data」のセルB2に0を出力する(適当な値「0」を出力)
        dWs.Cells(2, "B").Value = 0

        'シート「data」のA2とB2にダミー用に用意したデータをDictionaryインスタンスに格納する
        dict("ダミー") = dict("ダミー") + 1

    End If

    ' グラフを作成します。
    Set chartObj = ws.ChartObjects.Add(Left:=0, Width:=400, Top:=50, Height:=225)
    
    With chartObj.Chart
    
        'シート「data」の集計データのあるセルをグラフに指定する
        .SetSourceData Source:=dWs.Range("A1:B" & dict.Count)
    
        '表示するグラフの種類を円グラフにする
        .ChartType = xlPie
        
        'グラフのタイトルを追加可能にする
        .HasTitle = True
        
        'グラフのタイトルに「拡張子別のファイル数」の文字列を設定する
        .ChartTitle.Text = "拡張子別のファイル数"
        

        For cnt = 1 To .SeriesCollection(1).Points.Count
        
            '円グラフのデータラベルを表示させる
            .SeriesCollection(1).Points(cnt).HasDataLabel = True
            
            'データラベルに表示させる値を設定する
            .SeriesCollection(1).Points(cnt).DataLabel.Text = dWs.Cells(cnt, "A").Value & " (" & dWs.Cells(cnt, "B").Value & "(" & Format(dWs.Cells(cnt, "B").Value / tCnt, "0%") & "))"
        
        Next cnt
        
        If dWs.Cells(2, "A").Value = "ダミー" Then
                
            'シート「data」のセルA2の値が「ダミー」の場合
            '⇒拡張子が1種類だけの場合
            
            '1行目だけをグラフに参照させる
            .SetSourceData Source:=dWs.Range("A1:B1")
        
        End If
                
    End With
    
End Sub


Sub fileSearch(FolderPath As String, cnt As Integer)

    Dim dWs         As Worksheet   'ワークシート変数
    Dim fso         As Object       'FileSystemObjectのインスタンス用変数
    Dim Folder      As Object       'フォルダ用変数
    Dim FileItem    As Object       '取得したファイル用変数
    Dim SubFolder   As Object       'サブフォルダ用変数

    '「data」のシートを取得する
    Set dWs = ThisWorkbook.Sheets("data")

    'FileSystemObjectのインスタンスを生成する
    Set fso = CreateObject("Scripting.FileSystemObject")

    'GetFolderメソッドを使用して、指定したパスのフォルダを取得する
    Set Folder = fso.GetFolder(FolderPath)

    'フォルダ内にあるファイルの数分処理を繰り返す
    For Each FileItem In Folder.Files

        If fso.GetExtensionName(FileItem.Path) = "" Then

            '拡張子なしのファイルの場合

            '「拡張子なし」の文字列をAのセルに出力する
            dWs.Range("A" & cnt).Value = "拡張子なし"

        Else

            '拡張子ありのファイルの場合

            'ファイルの拡張子をAのセルに出力する
            dWs.Range("A" & cnt).Value = fso.GetExtensionName(FileItem.Path)

        End If

        cnt = cnt + 1

    Next FileItem

    'パスのサブフォルダを対象にループする
    For Each SubFolder In Folder.SubFolders

        '本サブルーチンを再帰呼び出しする
        Call fileSearch(SubFolder.Path, cnt)

    Next SubFolder

End Sub

注目すべきコード①

最初に見て頂きたいのは25行目です。

    'フォルダとファイルを検索したいフォルダのトップ階層のパスを取得する
    FolderPath = Worksheets("work").Range("dirPath").Value

コードの説明

以上のコードは、Accessのデータベースファイルの置き場を取得しているコードです。

Accessのデータベースファイルを検索する対象のトップフォルダのパスの取得は、C2の黄色のセルに入力されたパスから取得します。
※C2の黄色のセルには「dirPath」という名前を付けています。

注目すべきコード②

次に見て頂きたいのは31行目です。

    'フォルダとファイルを検索するサブルーチンを呼び出す
    Call fileSearch(FolderPath, cnt)

サブフォルダ含めて全てのフォルダ内のファイルを検索するサブルーチン「fileSearch」を呼び出す処理です。

「fileSearch」には以下の引数を渡して呼び出します。

  1. FolderPath:ファイル名の検索先フォルダ
  2. cnt:取得したファイル名の拡張子を出力するセルの行位置を格納する変数

FolderPath

FolderPathにはファイル名の検索先フォルダを指定します。

FolderPathで指定されたフォルダを「fileSearch」に渡し、「fileSearch」内でファイルが存在するか検索します。

cnt

aryCntは、取得したファイル名の拡張子を出力するセルの行位置を格納する変数です。

実際に変数cntを使うコードはどれかというと、次のコードです。

        'ファイルの拡張子をAのセルに出力する
        dWs.Range("A" & cnt).Value = fso.GetExtensionName(FileItem.Path)

ファイルから取得した拡張子をシート「data」のセルに出力するのに変数cntを使います。

注目すべきコード③

次に見て頂きたいのは149行目から152行目です。

    'FileSystemObjectのインスタンスを生成する
    Set fso = CreateObject("Scripting.FileSystemObject")
        
    'GetFolderメソッドを使用して、指定したパスのフォルダを取得する
    Set Folder = fso.GetFolder(FolderPath)

コードの説明

以上のコードは、FileSystemObjectのインスタンスを生成し、フォルダとファイルを検索したいフォルダのトップ階層のパスのフォルダを取得する処理のコードです。

FileSystemObjectのインスタンスのGetFolderメソッドに、フォルダとファイルを検索したいフォルダのトップ階層のパスを指定して実行することで、パス内のフォルダ名やファイル名を取得できます。

注目すべきコード④

次に見て頂きたいのは155行目から175行目です。

    'フォルダ内にあるファイルの数分処理を繰り返す
    For Each FileItem In Folder.Files

        If fso.GetExtensionName(FileItem.Path) = "" Then

            '拡張子なしのファイルの場合

            '「拡張子なし」の文字列をAのセルに出力する
            dWs.Range("A" & cnt).Value = "拡張子なし"

        Else

            '拡張子ありのファイルの場合

            'ファイルの拡張子をAのセルに出力する
            dWs.Range("A" & cnt).Value = fso.GetExtensionName(FileItem.Path)

        End If

        cnt = cnt + 1

    Next FileItem

コードの説明

以上のコードは、フォルダ内にあるファイルの数だけファイルから拡張子を取得し、シート「data」のセルに拡張子を出力している処理のコードです。

ファイルの中には拡張子がないファイルもあるので、拡張子がないファイルの場合は「拡張なし」という文字列をセルに出力します。

シート「data」のセルに拡張子が出力された結果は下のとおりです。

ファイルの数だけシート「data」のA列のセル拡張子が出力されています。

以上の状態から、拡張子ごとに件数が何件あるのかを集計します。

コードの詳細

155行目のコードは、フォルダ内にあるファイルの数分処理を繰り返すFor文で、もしファイルの拡張子がない場合は157行目の条件に合致します。

ファイルの拡張子がない場合は162行目で「拡張子なし」の文字列をセルに出力します。

ファイルの拡張子がある場合は164行目のELSEに合致し、169行目でファイルの拡張子をA列のセルに出力します。

注目すべきコード⑤

次に見て頂きたいのは178行目から183行目です。

    'パスのサブフォルダを対象にループする
    For Each SubFolder In Folder.SubFolders
        
        '本サブルーチンを再帰呼び出しする
        Call fileSearch(SubFolder.Path, cnt)
        
    Next SubFolder

コードの説明

以上のコードは、サブフォルダが存在する間は自分自身のサブルーチンを繰り返し呼び出す再帰処理を行っているコードです。

再帰処理とは、サブルーチンの処理が行われている途中で、強制的に自分自身のサブルーチンを呼び出して再度サブルーチンの最初から処理を行わせることを言います。

強制的に自分自身のサブルーチンを呼び出しているのは181行目です。

181行目でfileSearchが呼び出されると、fileSearchの処理の途中で137行目(fileSearchの最初)から強制的に開始されます。

この再帰処理(fileSearch処理中の再呼び出し)は、178行目のFor文内で繰り返し行われますが、このFor文が終わらないかぎりfileSearchが再度呼び出されます。

なお、For文から抜ける条件は、すべてのサブフォルダの参照が終わることです。(引数にサブフォルダを指定してfileSearchを呼び出す)

すべてのサブフォルダを参照すればFor文を抜けます。

For文から抜ければfileSearchが呼び出されることがなくなるので(再帰処理が行われない)、fileSearchのEnd Subまで処理が進みfileSearchの処理を抜けて、fileSearchの呼び出し元の31行目に遷移します。

そのまま34行目の次の行に処理が遷移します。

注目すべきコード⑥

次に見て頂きたいのは34行目から39行目です。

    'シート上に存在しているグラフの数だけ処理を繰り返すFor文
    For Each chartObj In ws.ChartObjects
    
        'グラフを削除する
        chartObj.Delete
        
    Next chartObj

コードの説明

以上のコードは、シート上に存在しているグラフの数だけグラフを削除する処理のコードです。

何回も本マクロを実行する場合は、一度生成したグラフは不要になるのでこのコードでグラフを削除しておきます。

注目すべきコード⑦

次に見て頂きたいのは42行目から52行目です。

    'Dictionaryを使うために、Dictionary用のインスタンスを生成する
    Set dict = CreateObject("Scripting.Dictionary")
        
    'シート「data」に出力されたCSVファイルのデータ件数分処理を繰り返すFor文
    For Each cell In dWs.Range("A1:A" & dWs.Cells(dWs.Rows.Count, "A").End(xlUp).Row)
        
        'シート「data」のA列のセルの値(データの種類)をDictionaryインスタンスに格納し、その出現回数をカウントする
        dict(cell.Value) = dict(cell.Value) + 1
        
        DoEvents
        
    Next cell

コードの説明

以上のコードは、Dictionaryを使うために、Dictionary用のインスタンスを生成し、Dictionary用インスタンスにシート「data」の拡張子の文字列と、その拡張子の文字列をキーにして、拡張子ごとに何件あるのかを集計した値をdictに格納する処理のコードです。

シート「data」に出力された拡張子が存在する最後の行まで走査し(45行目)、拡張子の種類ごとに何件あるのかを1行ずつ繰り返しカウントします。(48行目)

カウントした値はdictに格納されます。また、拡張子の文字列自体もdictに格納されます。(拡張子の文字列がキーとなる)

dictの中身のイメージは次の通りです。

注目すべきコード⑧

次に見て頂きたいのは55行目です。

    'CSVファイルのデータを集計した値が格納された「dict」の値をシート「data」に出力するため、シート「data」をクリアする
    dWs.Cells.ClearContents

コードの説明

以上のコードは、dictに格納された値をシート「data」に出力したいので、シート「data」をクリアする処理のコードです。

注目すべきコード⑨

次に見て頂きたいのは61行目から76行目です。

    'Dictionaryインスタンスに格納された拡張子の種類数分処理を繰り返すFor文
    For Each Key In dict.Keys

        'シート「data」のA列にデータの種類を出力する
        dWs.Cells(cnt, "A").Value = Key

        'シート「data」のB列にデータの種類の出現回数を出力する
        dWs.Cells(cnt, "B").Value = dict(Key)
        
        '総数をカウントする
        tCnt = tCnt + dWs.Cells(cnt, "B").Value

        cnt = cnt + 1

        DoEvents

    Next Key

コードの説明

以上のコードは、dict(Dictionaryインスタンス)に格納された拡張子の種類数分、dictの値をExcelのシートに出力する処理のコードです。

dict.Keysにはdictに格納された拡張子のことを指し、その拡張子の種類分、Aのセルに拡張子の文字列を(64行目)、Bのセルに拡張子に対しての総数を出力ています。(67行目)

dictからシート「data」に出力するイメージは下の通りです。

右側の黒枠の中がdictに格納されているデータのイメージで、このdictの値をA列とB列に出力しています。

注目すべきコード⑩

次に見て頂きたいのは78行目から92行目と、122行目から130行目です。

    If dict.Count = 1 Then
    
        '拡張子が1種類だけの場合
        '⇒グラフに表示される拡張子の文言表示が正常に表示されないので、ダミーで1件追加しておく
                
        'シート「data」のセルA2に「ダミー」の文字列を出力する(適当な文字列「ダミー」を出力)
        dWs.Cells(2, "A").Value = "ダミー"
        
        'シート「data」のセルB2に0を出力する(適当な値「0」を出力)
        dWs.Cells(2, "B").Value = 0
        
        'シート「data」のA2とB2にダミー用に用意したデータをDictionaryインスタンスに格納する
        dict("ダミー") = dict("ダミー") + 1
            
    End If
        If dWs.Cells(2, "A").Value = "ダミー" Then
                
            'シート「data」のセルA2の値が「ダミー」の場合
            '⇒拡張子が1種類だけの場合
            
            '1行目だけをグラフに参照させる
            .SetSourceData Source:=dWs.Range("A1:B1")
        
        End If

コードの説明

以上のコードは、拡張子の種類が1つの場合はグラフのX軸のタイトルが正しく表示されない事象に対応する処理のコードです。

正しく表示されない事象とはどういう事象かと言うと下の画面のとおりです。


※上記は「C:¥work¥10_勉強¥10_VBA関連¥0026」配下を指定した結果

拡張子が表示されず、「1」が出力されてしまうのですが、拡張子が1種類の場合にこの事象が起きます。

拡張子が1種類しかない場合、シート「data」には下のように出力されますが、1行目にしかデータが存在しない場合はグラフのX軸のタイトルが正しく表示されません。

グラフが出力された後に、グラフのシート「data」のデータ参照状態を見てみると下の通りです。

以上のように「1」の値をグラフ側が出力してしまいます。

拡張子が1つしかないと正常に表示されないのに対して、拡張子が2つ以上だと正常に拡張子の文字列が表示されます。


※上記は「C:¥work¥10_勉強¥10_VBA関連¥0026」配下を指定した結果

拡張子が2種類以上あれば良いので、今回は存在しない架空の「ダミー」という文言の拡張子を用意します。

その「ダミー」という拡張子の文字列をA2のセルに出力し(84行目)、B2のセルには適当な値を出力させます。今回は「0」をセルB2に出力しています。(87行目)

また、今回は架空の「ダミー」という文言の拡張子を一つ用意したので、90行目でdictに「ダミー」という拡張子の文字列(キー情報)が1つ存在すると関連付けするために、+1しておきます。

マクロを実行すると、シート「data」は次のように出力されます。

グラフが出力された後に、グラフのシート「data」のデータ参照状態を見てみると下の通りです。

これで「1」の値をグラフ側が出力することはなくなるのですが、このままだと「ダミー」という文言がグラフ側に出力されてしまうので、「ダミー」という文言を除いて1行目だけをグラフが出力するようにしないといけません。

そこで、122行目から130行目のコードで、「ダミー」という文言を除いて1行目だけをグラフが出力するように対応します。

122行目のコードでは、シート「data」のセルA2に「ダミー」の文字列が入っているか判定し、入っている場合は128行目のコードでグラフのデータ参照先を1行目だけにします。

グラフのデータ参照先を1行目だけにすることで下のようにグラフが表示されます。


※上記は「C:¥work¥10_勉強¥10_VBA関連¥0026」配下を指定した結果

以上で、拡張子の種類が1つしかない場合でも正しくグラフに表示されるようになります。

注目すべきコード⑪

次に見て頂きたいのは95行目です。

    ' グラフを作成します。
    Set chartObj = ws.ChartObjects.Add(Left:=0, Width:=400, Top:=50, Height:=225)

コードの説明

以上のコードは、グラフを使うために、グラフ用のインスタンスを生成する処理のコードです。

グラフを描画するにはまずグラフ用のインスタンスを生成する必要があります。

グラフ用のインスタンスを生成するときに、グラフのサイズを指定します。

グラフ用のインスタンスを生成直後は下の通りです。

注目すべきコード⑫

次に見て頂きたいのは97行目から120行目です。

    With chartObj.Chart
    
        'シート「data」の集計データのあるセルをグラフに指定する
        .SetSourceData Source:=dWs.Range("A1:B" & dict.Count)
    
        '表示するグラフの種類を円グラフにする
        .ChartType = xlPie
        
        'グラフのタイトルを追加可能にする
        .HasTitle = True
        
        'グラフのタイトルに「拡張子別のファイル数」の文字列を設定する
        .ChartTitle.Text = "拡張子別のファイル数"

        
        For cnt = 1 To .SeriesCollection(1).Points.Count
        
            '円グラフのデータラベルを表示させる
            .SeriesCollection(1).Points(cnt).HasDataLabel = True
            
            'データラベルに表示させる値を設定する
            .SeriesCollection(1).Points(cnt).DataLabel.Text = dWs.Cells(cnt, "A").Value & " (" & dWs.Cells(cnt, "B").Value & "(" & Format(dWs.Cells(cnt, "B").Value / tCnt, "0%") & "))"
        
        Next cnt

コードの説明

以上のコードは、グラフの生成とグラフの各設定を行う処理のコードです。

コードの詳細

100行目のコードでは、グラフにシート「data」の値を参照させて出力しているコードです。

コードを実行すると下のようにグラフが表示されます。

100行目のコードを実行した直後は円グラフではないのですが、103行目でグラフを円グラフにするためにChartTypeプロパティにxlPieを設定します。

ChartTypeプロパティへの設定が終わると下のようにグラフが円グラフになります。

106行目のコードでは、グラフのタイトルを追加可能にします。

109行目のコードでは、グラフのタイトルに「拡張子別のファイル数」の文字列を設定します。

112行目のコードでは、拡張子の種類分処理を繰り返すFor文で、115行目では円グラフのデータラベルを表示させるよう設定します。

118行目のコードでは、データラベルに表示させる値を設定します。

動作確認

Excelファイルの例」をご覧ください。

最後に

この記事では、サブフォルダ含めて全てのフォルダ内のファイルの数を拡張子別に円グラフで表示する方法についてご説明しました。

サブフォルダ含めて全てのフォルダ内のファイルがいくつあるのか、ファイルの種類別にファイルがどのくらい存在するのかをグラフで確認してみたいときは本記事を参考にしてみてくださいね。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら