非プログラマーでもできる!業務の自動化

【Excel VBA配布】フォルダ内のファイル名を一覧取得|マクロで効率化

当ページのリンクの一部に広告が含まれています。

社内の共有フォルダでありがち

  • ファイルがどこのフォルダにあるかわからない…
  • フォルダの中に何が入っているかわからない…

フォルダの中身が多いと検索も時間がかかる…

そこで、フォルダ内のフォルダ構成とファイル名を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のマクロなら数十分や数時間かかる作業も数秒や数分で終わります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次