Excel VBAでフォルダのファイル数を取得したいときはないでしょうか。
けど、そんな中で悩むことは、
・Excel VBAでサブフォルダを含むフォルダのファイル数を取得するやり方がわからない。
ですよね。
今回はそんなお悩みを解決する
についてまとめます!
もくじ
Excel VBAでサブフォルダを含むフォルダのファイル数を取得する完成イメージ
Excel VBAでサブフォルダを含むフォルダのファイル数を取得する完成イメージについて説明します。
Excel側へフォルダパス、ファイル数が出力されるシートを作成し、1行目に項目を入力します。
VBAを実行し、ダイアログを表示させ、ファイル一覧を取得したいフォルダを選択しOKを押します。
空白だった箇所にフォルダパスとファイル数が出力されます。
また、ボタンを実装し、ボタンクリックでも実行できるようにします。
ボタンを押すとダイアログが出て即ファイル数が取得されます!
ワンポチで即ファイル数が出力されるので便利ですね。
それではさっそくやってみましょう。
ファイルとフォルダを用意する
ファイルとフォルダを用意しましょう。
すでにあるフォルダとファイルを対象としてもOKです。
サブフォルダも対象としますので、2階層、3階層と作成してファイルを格納していきましょう。
フォルダパスとファイル数が出力されるExcelシートを用意する
フォルダパスとファイル数が出力されるExcelシートを用意しましょう。
A列にフォルダパス、B列にファイル数が出力されますので、
分かりやすいように1行目に項目名を入力しておきます。
サブフォルダを含むフォルダ内のファイル数を取得する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を入れています。
実行時にExcelシートの値をクリアする範囲を指定します。
範囲を変えたい場合は、”A2:B1000000″を変更してください。
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 "フォルダの選択をキャンセルしました。"
次に「ファイル数取得プロシージャ」について説明をします。
今回は「ファイル名取得プロシージャ」をファイル数をカウントするよう変更を加えました。
元の内容については前回の記事、
をご参照ください。
ファイル名を取得しているのは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】ボタンにマクロを登録する方法!引数の設定も!
さいごに
いかがでしょうか。
今回は、
についてまとめました。
また、他にも便利な方法がありますので、よろしければご参照頂ければと思います。
コメントを残す