【Excel VBA】ファイル数を取得する方法!サブフォルダも対応可!

Excel VBAでフォルダのファイル数を取得したいときはないでしょうか。

けど、そんな中で悩むことは、

・Excel VBAでフォルダのファイル数を取得するやり方がわからない。
・Excel VBAでサブフォルダを含むフォルダのファイル数を取得するやり方がわからない。

ですよね。

今回はそんなお悩みを解決する

・Excel VBAでサブフォルダを含むフォルダのファイル数を取得する方法

についてまとめます!

Excel VBAでサブフォルダを含むフォルダのファイル数を取得する完成イメージ

Excel VBAでサブフォルダを含むフォルダのファイル数を取得する完成イメージについて説明します。

Excel側へフォルダパス、ファイル数が出力されるシートを作成し、1行目に項目を入力します。

VBAを実行し、ダイアログを表示させ、ファイル一覧を取得したいフォルダを選択しOKを押します。

空白だった箇所にフォルダパスとファイル数が出力されます。

また、ボタンを実装し、ボタンクリックでも実行できるようにします。

ボタンを押すとダイアログが出て即ファイル数が取得されます!

ワンポチで即ファイル数が出力されるので便利ですね。

それではさっそくやってみましょう。

ファイルとフォルダを用意する

ファイルとフォルダを用意しましょう。
すでにあるフォルダとファイルを対象としてもOKです。

サブフォルダも対象としますので、2階層、3階層と作成してファイルを格納していきましょう。

タカヒロ
タカヒロ
なお、対象となるファイル数が多い場合は処理に時間がかかるか、メモリがオーバーフローする場合がありますので、はじめは数ファイル程度と少ない件数で検証することをオススメします。

フォルダパスとファイル数が出力されるExcelシートを用意する

フォルダパスとファイル数が出力されるExcelシートを用意しましょう。
A列にフォルダパス、B列にファイル数が出力されますので、
分かりやすいように1行目に項目名を入力しておきます。

タカヒロ
タカヒロ
VBAを実行する際はこのシートを表に出すようにしてください。

サブフォルダを含むフォルダ内のファイル数を取得するVBA

フォルダ内のファイル数を取得するVBAを実装していきましょう。

以下サンプルコードです。

Sub ダイアログからサブフォルダ含むファイル数を取得()

    Dim intIchi As Integer
    Dim strFolderpass As String
    Dim objFileDialog As Object
    
    'ファイル名一覧を出力する行番号を指定します。
    intIchi = 2
    
    '指定範囲の値をクリアします。
    Range("A2:B1000000").Clear
    
    'ファイルダイアログオブジェクトをフォルダ選択モードでオブジェクトに設定します。
    Set objFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
    
    'ダイアログボックスを表示させます。
    If objFileDialog.Show = True Then
        
        'ダイアログで選択したフォルダのパスをSelectedItemsプロパティ(1番目のインデックス値)から取得し代入します。
        strFolderpass = objFileDialog.SelectedItems(1)
        
        'ファイル名取得プロシージャを呼び出します。
        Call ファイル数取得プロシージャ(strFolderpass, intIchi)
    
    Else
        '「キャンセル」ボタンが押された場合メッセージを表示させます。
        MsgBox "フォルダの選択をキャンセルしました。"
    End If
    
    Set objFileDialog = Nothing

End Sub



Sub ファイル数取得プロシージャ(strFolderpass As String, intIchi As Integer)

    Dim objfFSO As Object
    Dim objFiles As Object
    Dim objFile As Object
    Dim objSubFolders As Object
    Dim objSubFolder As Object
    
    
    '対象フォルダのパスの値があれば処理をおこないます。
    If strFolderpass = "" Then
        MsgBox "対象フォルダのパスがありません。パスを入力してください。"
    Else
    
        'FileSystemObjectはファイルやフォルダを操作する専用のオブジェクトです。インスタンスにセットします。
        Set objfFSO = CreateObject("Scripting.FileSystemObject")
    
        '対象フォルダのファイルオブジェクトをセットします。
        Set objFiles = objfFSO.GetFolder(strFolderpass).Files
        
        '1階層目のフォルダパスとファイル数を出力します。
        Cells(intIchi, 1) = strFolderpass
        Cells(intIchi, 2) = objFiles.Count
        intIchi = intIchi + 1
        
        '対象フォルダのサブフォルダファイルオブジェクトをセットします。
        Set objSubFolders = objfFSO.GetFolder(strFolderpass).SubFolders
    
        'サブフォルダを含むファイル数取得の処理をおこないます。
        For Each objSubFolder In objSubFolders
         
            If objSubFolder.Path <> "" Then
                
                'サブフォルダのパスを本プロシージャへ渡して再帰的に処理を繰り返します。
                Call ファイル数取得プロシージャ(objSubFolder.Path, intIchi)

            End If
             
        Next objSubFolder
    
    End If
    
    Set objfFSO = Nothing
    Set objFiles = Nothing
    Set objFile = Nothing
    Set objSubFolders = Nothing
    Set objSubFolder = Nothing

End Sub

VBAの設定

以下の設定をおこないます。

ファイル名一覧を出力する行番号を指定します。サンプルではA2から出力していますので2行目の2を入れています。

intIchi = 2

実行時にExcelシートの値をクリアする範囲を指定します。
範囲を変えたい場合は、”A2:B1000000″を変更してください。

Range(“A2:B1000000”).Clear

VBAの実装手順

実装手順は以下の通りです。

VBAを実装します。

①Excelを新規に開き、「開発」タブをクリックし、「VisualBasic」をクリックします。
もしくはショートカットキー「Alt」+「F11」でもOKです。

②標準モジュールを追加します。
左ペインのVBAProjectを右クリックし、「挿入」、「標準モジュール」を選択します。

③右ペインのウインドウに上記のVBAを入力します。

こちらで完了です。

VBAを実行する

では早速VBAの実行をしてみましょう。

①「開発」タブの「VBA」をクリックし実行したいマクロを選択し、「実行」をクリックします。

②ダイアログボックスが表示されたら対象のフォルダを選択し、「OK」を押します。

はい、指定フォルダの一階層目以降のフォルダパスとファイル数が取得できていますね!

VBAの説明

まずメインのプロシージャ「ダイアログからサブフォルダ含むファイル数を取得」について説明をします。

ファイルダイアログオブジェクトをフォルダ選択モードでオブジェクトに設定します。

Set objFileDialog = Application.FileDialog(msoFileDialogFolderPicker)

ファイルダイアログタイプに使用する定数は以下の通りです。

msoFileDialogFilePicker ファイル選択モード
msoFileDialogFolderPicker フォルダ選択モード

ダイアログボックスを表示させます。OKが押された場合はTrueが返りますのでそれで次の処理に行くかを判定しています。

If objFileDialog.Show = True Then

ダイアログで選択したフォルダのパスをSelectedItemsプロパティ(1番目のインデックス値)から取得し代入します。

strFolderpass = objFileDialog.SelectedItems(1)

ファイル名取得プロシージャを呼び出します。

Call ファイル名取得プロシージャ(strFolderpass, intIchi)

「キャンセル」ボタンが押された場合メッセージを表示させます。

MsgBox "フォルダの選択をキャンセルしました。"

次に「ファイル数取得プロシージャ」について説明をします。

今回は「ファイル名取得プロシージャ」をファイル数をカウントするよう変更を加えました。
元の内容については前回の記事、

【Excel VBA】サブフォルダを含むファイル名・パスを取得する方法!拡張子削除も対応!


をご参照ください。

ファイル名を取得しているのはFileSystemObjectで、
ファイルやフォルダを操作したり、情報を取得するオブジェクトとなり、
このFileSystemObjectオブジェクトをインスタンスにセットします。

Set objfFSO = CreateObject(“Scripting.FileSystemObject”)

Filesプロパティ対象フォルダのファイルオブジェクトをセットします。

Set objFiles = objfFSO.GetFolder(strFolderpass).Files

1階層目のフォルダパスとファイル数を出力します。

Cells(intIchi, 1) = strFolderpass
Cells(intIchi, 2) = objFiles.Count
intIchi = intIchi + 1

サブフォルダ分も同様に処理していきます。
対象フォルダのサブフォルダファイルオブジェクトをセットします。

Set objSubFolders = objfFSO.GetFolder(strFolderpass).SubFolders

サブフォルダを含むファイル数取得の処理をおこないます。

For Each objSubFolder In objSubFolders

サブフォルダ内のパスがある場合処理を継続します。

If objSubFolder.Path <> "" Then

サブフォルダのパスを本プロシージャへ渡して再帰的に処理を繰り返します。

Call ファイル数取得プロシージャ(objSubFolder.Path, intIchi)

ボタンからVBAを実行する

次にボタンを配置し、ボタンをクリックしたらVBAを実行できるようにしましょう。

ボタンをワークシートへ配置していきます。

開発タブの挿入アイコンをクリックし、フォームコントロールの「ボタン」を選択します。

ボタンが挿入されたらボタンの中の表示名を適当な内容に変更します。

続いて、ボタンを右クリックし、マクロの登録を選択します。
上記VBAを選択し、「OK」を押下します。

ボタンを押して実行してみましょう。

はい、ファイル数が取得できましたね!

タカヒロ
タカヒロ
ボタン配置および設定の詳細を知りたい方は以下のページもご参照ください。


【Excel VBA】ボタンにマクロを登録する方法!引数の設定も!

さいごに

いかがでしょうか。

今回は、

・Excel VBAでサブフォルダを含むフォルダのファイル数を取得する方法

についてまとめました。

また、他にも便利な方法がありますので、よろしければご参照頂ければと思います。



この記事の関連キーワード

こちらの記事の関連キーワード一覧です。クリックするとキーワードに関連する記事一覧が閲覧できます。



タカヒロ

タカヒロ
実質無料で読めるExcelVBA本についてまとめました。
もしVBA本購入を検討されていたら、どれだけお得か確かめてみてください。

【¥0】実質無料のExcelVBAおすすめ本25選!初級~中級まで網羅!

コメントを残す

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