社内の共有フォルダでありがち
- ファイルがどこのフォルダにあるかわからない…
- フォルダの中に何が入っているかわからない…
フォルダの中身が多いと検索も時間がかかる…
そこで、フォルダ内のフォルダ構成とファイル名をExcelの一覧表として表示できるExcelのVBAマクロコードを作成しました。
【フォルダ内のフォルダ構成とファイル名をExcelに一覧として表示する】Excel VBAのマクロのコードを解説しています。
ボタン1つで【フォルダ内のフォルダ構成とファイル名をExcelに一覧として表示する】できる、Excelシートを無料配布。
【フォルダ内のフォルダ構成とファイル名をExcelに一覧として表示する】VBAマクロの内容と使い方
以下のコードを実行すると、指定されたフォルダ内のファイルとフォルダの一覧を取得し、Excelワークシートに出力します。
【フォルダ内のフォルダ構成とファイル名をExcelに一覧として表示する】VBAマクロの内容と使い方
- ボタンを押す
- フォルダ構成を知りたいフォルダを選択
- フォルダ構成とファイル名一覧を表示
ボタンを押す
「フォルダツリー取得」または「フォルダツリー取得 セル色変更」をクリックします。
フォルダ構成を知りたいフォルダを選択
出てきたダイアログで、フォルダ構成を知りたいフォルダを選択します。
フォルダ構成とファイル名一覧を表示
フォルダ構成とファイル名の一覧がExcelに一覧表として表示されます。
【フォルダ内のフォルダ構成とファイル名をExcelに一覧として表示する】VBAマクロのコードの解説
以下のコードは、4つのパートに分かれます。
メインの処理をするコード
このVBAコードは、選択されたフォルダ内のすべてのファイルとサブフォルダをリストし、それらをExcelワークシート上に表示します。それに加えて、特定のセルの色付け処理も行います。エラーが発生した場合のエラーハンドリングも含まれています。
以下に、処理ごとの詳細な解説を行います。
Sub ProcessFilesAndFoldersInFolder_yellow()
On Error GoTo ErrorHandler
Dim FolderPath As String
Dim OutputWorksheet As Worksheet
Dim RowCounter As Long
Dim lastValues As Object
' Turn off screen updating, automatic calculations and events.
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
' Select the folder path from dialog box.
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "Select a Folder"
.Show
If .SelectedItems.Count > 0 Then
FolderPath = .SelectedItems(1)
Else
' If the user chooses cancel, stop the process.
' Reset Excel settings before exiting.
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Exit Sub
End If
End With
' Set Sheet1 as the target.
Set OutputWorksheet = ThisWorkbook.Sheets("Sheet1")
Set lastValues = CreateObject("Scripting.Dictionary")
RowCounter = 2 ' Start from second row
' List files and folders in the folder.
Call ListMyFilesAndFolders(FolderPath, FolderPath, RowCounter, OutputWorksheet, lastValues)
' Write the selected folder path at first row
OutputWorksheet.Cells(1, 1).Value = FolderPath
' Delete the old first row (now second row)
OutputWorksheet.Rows(2).EntireRow.Delete
' Apply the color to the rightmost non-empty cell of each row.
Call ColorizeRightmostCells(OutputWorksheet)
' Reset Excel settings at the end.
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
' Show completion message
MsgBox "処理が完了しました。", vbInformation
ExitSub:
Exit Sub
ErrorHandler:
' Reset Excel settings in case of error.
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
MsgBox "エラーが発生しました。" & vbCrLf & "エラーメッセージ: " & Err.Description, vbCritical
Resume ExitSub
End Sub
エラーが発生した場合にジャンプする位置を設定します。
On Error GoTo ErrorHandler
必要な変数を定義します。フォルダパス、出力ワークシート、行カウンタ、最後の値を定義しています。
Dim FolderPath As String ~ Dim lastValues As Object
画面更新、自動計算、イベントの処理を一時停止します。これは、処理速度を向上させるためです。
Application.ScreenUpdating = False ~ Application.EnableEvents = False
ファイルダイアログを使用してユーザーにフォルダを選択させます。
With Application.FileDialog(msoFileDialogFolderPicker) ~ End With
“Sheet1″を出力の対象として設定し、lastValuesに新たなScripting.Dictionaryオブジェクトを設定します。
Set OutputWorksheet = ThisWorkbook.Sheets("Sheet1") Set lastValues = CreateObject("Scripting.Dictionary")
選択されたフォルダ内のファイルとサブフォルダをリスト化し、それをExcelワークシートに表示します。
Call ListMyFilesAndFolders(FolderPath, FolderPath, RowCounter, OutputWorksheet, lastValues)
選択されたフォルダパスをワークシートの最初の行に書き込み、旧第一行(現在の第二行)を削除します。
OutputWorksheet.Cells(1, 1).Value = FolderPath OutputWorksheet.Rows(2).EntireRow.Delete
各行の最も右側にある非空のセルに色を適用します。
Call ColorizeRightmostCells(OutputWorksheet)
処理の終了後にExcelの画面更新、自動計算、イベント処理を再開します。
Application.ScreenUpdating = True ~ Application.EnableEvents = True
処理が完了したことを通知するメッセージボックスを表示します。
MsgBox "処理が完了しました。", vbInformation
エラーが発生した場合に、Excelの設定を再開し、エラーメッセージを表示します。
ErrorHandler: ~ Resume ExitSub
一番右にあるセルの色を変更するコード
このVBAコードは、指定されたワークシートの各行で最も右側にある非空のセルを色付けするためのものです。
色付けにはRGB(255, 242, 204)の色(#FFF2CCと等価)が使用されます。
以下に、処理ごとの詳細な解説を行います。
Sub ColorizeRightmostCells(OutputWorksheet As Worksheet)
Dim rng As Range
Dim row As Range
Dim cell As Range
Dim lastCell As Range
' Define the range
Set rng = OutputWorksheet.UsedRange
' Loop through each row
For Each row In rng.Rows
Set lastCell = Nothing
' Find the rightmost non-empty cell
For Each cell In row.Cells
If cell.Value <> "" Then
Set lastCell = cell
End If
Next cell
If Not lastCell Is Nothing Then
' Change the color of the rightmost non-empty cell
lastCell.Interior.Color = RGB(255, 242, 204) ' equivalent to #FFF2CC
End If
Next row
End Sub
範囲、行、セル、最後のセルに対する変数を定義します。
Dim rng As Range ~ Dim lastCell As Range
ワークシート上で使用されている範囲を定義します。
Set rng = OutputWorksheet.UsedRange
使用範囲内の各行を順に処理します。
For Each row In rng.Rows ~ Next row
各行について、右端(最後)の非空のセルを探索します。
For Each cell In row.Cells ~ Next cell
見つけた最後の非空のセルに色を適用します。RGB(255, 242, 204)という色(#FFF2CCと等価)を適用します。
If Not lastCell Is Nothing Then ~ End If
パスを分割してシートに書き込むコード
このVBAコードは、指定されたフォルダ内のすべてのファイルとサブフォルダを処理します。
それぞれのファイルとサブフォルダについて、そのパスを分割し、ワークシートに各パートを別々の列に書き込みます。
さらに、この処理はすべてのサブフォルダに対して再帰的に行われます。
以下に、処理ごとの詳細な解説を行います。
Sub ListMyFilesAndFolders(FolderPath As String, ParentFolderPath As String, ByRef RowCounter As Long, OutputWorksheet As Worksheet, ByRef lastValues As Object)
Dim FSO As Object
Dim Folder As Object
Dim File As Object
Dim SubFolder As Object
Dim FilePathParts() As String
Dim i As Long
Dim j As Long
Dim startCol As Integer
Dim lastCol As Integer
' Create FileSystemObject.
Set FSO = CreateObject("Scripting.FileSystemObject")
' Set the folder.
Set Folder = FSO.GetFolder(FolderPath)
' Write the folder path itself first.
FilePathParts = Split(Replace(FolderPath, ParentFolderPath & "\", ""), "\")
WritePathParts FilePathParts, OutputWorksheet, RowCounter, lastValues
' Process each file in the folder.
For Each File In Folder.Files
' Calculate relative path and write in the worksheet.
FilePathParts = Split(Replace(File.Path, ParentFolderPath & "\", ""), "\")
WritePathParts FilePathParts, OutputWorksheet, RowCounter, lastValues
Next File
' Do the same process for each subfolder.
For Each SubFolder In Folder.SubFolders
Call ListMyFilesAndFolders(SubFolder.Path, ParentFolderPath, RowCounter, OutputWorksheet, lastValues)
Next SubFolder
End Sub
変数の定義
ファイルシステムオブジェクト、フォルダ、ファイル、サブフォルダ、ファイルパス部分、そしてカウンタに対する変数を定義します。
Dim FSO As Object ~ Dim lastCol As Integer
ファイルシステムオブジェクトの生成
“Scripting.FileSystemObject”を使ってファイルシステムオブジェクトを作成します。
Set FSO = CreateObject("Scripting.FileSystemObject")
フォルダの設定
指定されたパスからフォルダを取得します。
Set Folder = FSO.GetFolder(FolderPath)
フォルダパスの処理
フォルダパスを分割し、それをワークシートに書き込みます。
FilePathParts = Split(Replace(FolderPath, ParentFolderPath & "\", ""), "\") WritePathParts FilePathParts, OutputWorksheet, RowCounter, lastValues
各ファイルの処理
フォルダ内の各ファイルについて、そのパスを分割し、それをワークシートに書き込みます。
For Each File In Folder.Files ~ Next File
各サブフォルダの処理
フォルダ内の各サブフォルダについて、同様の処理を再帰的に行います。
For Each SubFolder In Folder.SubFolders ~ Next SubFolder
Sub WritePathParts(FilePathParts As Variant, OutputWorksheet As Worksheet, ByRef RowCounter As Long, ByRef lastValues As Object)
Dim i As Long
Dim j As Long
Dim startCol As Integer
Dim lastCol As Integer
' Output each part from A column.
startCol = 1 ' A column
For i = 0 To UBound(FilePathParts)
OutputWorksheet.Cells(RowCounter, startCol + i).Value = FilePathParts(i)
Next i
lastCol = startCol + UBound(FilePathParts)
' If the same data continues in the same column, delete the data other than the top data.
For j = startCol To lastCol
If lastValues.exists(j) Then
If OutputWorksheet.Cells(RowCounter, j).Value = lastValues(j) Then
OutputWorksheet.Cells(RowCounter, j).ClearContents
Else
lastValues(j) = OutputWorksheet.Cells(RowCounter, j).Value
End If
Else
lastValues(j) = OutputWorksheet.Cells(RowCounter, j).Value
End If
Next j
RowCounter = RowCounter + 1
End Sub
同一列情の同一データの削除
このVBAコードは、分割されたファイルパスの各部分をワークシートに書き込むためのものです。
各部分は、A列から開始して連続した列に書き込まれます。さらに、同じ列に連続した同じデータが存在する場合、そのデータの最初のエントリ以外は削除されます。
以下に、処理ごとの詳細な解説を行います。
ループカウンタと列の始点と終点を表す変数を定義します。
Dim i As Long ~ Dim lastCol As Integer
分割されたファイルパスの各部分を、A列から開始して連続した列に書き込みます。
startCol = 1 ' A column ~ Next i
同じ列に連続した同じデータが存在する場合、そのデータの最初のエントリ以外は削除します。
For j = startCol To lastCol ~ Next j
行カウンタを1つ増加させます。次回のデータ出力は次の行から始まります。
RowCounter = RowCounter + 1
VBAコードがわからないときは
「VBAマクロのコードがわからない!」
そんなときは、ココナラでVBAのプロに相談や作成依頼ができます。
まとめ:面倒な作業はVBAマクロで時短
【フォルダ内のフォルダ構成とファイル名をExcelに一覧として表示する】するExcel VBAマクロのコードの解説でした。
Excelのマクロなら数十分や数時間かかる作業も数秒や数分で終わります。
コメント