【VBA FSO】FileSystemObjectファイルの場所がすぐわかる。深い階層のフォルダ内のファイル一覧。

【VBA FSO】FileSystemObject

FileSystemObject深い階層のフォルダ内のファイル一覧。
タイトル

動画でExcel タイトル

【VBA FSO】FileSystemObjectで大量の子フォルダ内のファイル一覧を見出し付で作成する。

FileSystemObject(ファイルシステムオブジェクト)はファイルとフォルダ操作をするために用意されたオブジェクトです。
オブジェクトというとそれだけで敬遠されがちです。
しかし、そこを乗り越えるととても便利で快適なExcel環境、いやPC環境が手に入ります。

(サンプルファイルは、こちらです。 タイトル、サンプル#rn#回

マクロ動画 タイトル

https://youtu.be/W9YyUN9EkXk
  • 【タイムライン】
  • 00:00 - イントロ
  • 00:15 今回の動画の内容 大量の子フォルダとその中のファイル一覧を作成
  • 01:21 FSOを使った「子フォルダのファイルリスト作成」マクロ実行(動作を確認)
  • 03:03 FileSystemObject FSOを使った「子フォルダのファイルリスト作成」マクロコードの解説。
  • 03:09 Scripting Runtime 参照設定ーFileSystemObjectを使うための準備
  • 03:33 CreateObject関数を使う場合
  • 04:29 変数の説明
  • 05:51 ファイルリスト一覧の古いデータを削除
  • 06:18 FileDialogファイルダイアログを表示して、ユーザーに親フォルダを選択してもらう。
  • 07:05 FileDialogファイルダイアログの.show= -1 の意味
  • 07:52 ファイルリストの名前を設定する
  • 08:07 子フォルダを取得してその名前とシートとリスト用の変数に書き込む
  • 10:28 子フォルダ内のファイルを一つずつ取り出し名前を取得し、シートとリスト用の変数に書き込む
  • 11:48 FSOでテキストファイルを作成し、そこにリスト変数の値を書き込む
  • 12:53 コードタイム
  • 14:44 END

階層の深いフォルダでどのファイルがどこにあるのかを一覧にする

本日の動画ではファイルシステムオブジェクトを使ってこの『English Words』というフォルダーの中にある『TOFLE単語』というこの子フォルダーを操作します。
そしてこの子フォルダー『TOFLE単語』の中には、10個のフォルダーがつまり孫フォルダーがあります。

NAMAE1

それぞれ音声データが入っている(mp3)ということ設定です。設定は前回の動画と同じです。
ただし、今回はmp3ファイルを上の階層に上げてやるというのではなくて、フォルダーの中に入ったままでいいけれども、どのフォルダーにどのファイルが入っているかを一覧にしたいということです。 その一覧表については、まずシート上にフォルダ名、ファイル名の列挙の形で表示する。
さらに、フォルダ内にも、一覧表を作成するというものです。

NAMAE2

ファイル一覧作成プログラム実行後

イメージがつかめないと思いますので、先にプログラムを実行します。
フォルダの選択ダイアログが表示されます。ユーザーは一覧を作成したい親フォルダを選択します。

NAMAE12

フォルダを選択すると、ファイルリストという名前のシート上にファイルの一覧が作成されます。
また、ファイル一覧はテキストでも作成されます。

NAMAE3

ファイル一覧.textは、親フォルダの『TOFLE単語』直下に作成されています。

NAMAE13

階層の深いファイル一覧作成のコード

今回も、前回同様、事前バインディングをしておきます。
FileSystemObjectを使うには、[MicroSoft Scripting Runtime] への参照設定を行う必要があります。
VBEを開きから以下のステップで参照設定を行います。:
1.メニューのツールをクリックします。
2.ツールの参照設定をクリックします。
3.表示される参照可能なライブラリから、「Microsoft Scripting Runtime」を探し、 4.「Microsoft Scripting Runtime」の左にあるチェック欄にチェックを入れます。OKをクリックして閉じます。
以上で FileSystemObjectを利用できるようになります。

NAMAE4

ではコードを見てみましょう。
最初にコメントアウトしてあるコードは、事前バインディングできないケースの、CreateObjectメソッドを使ったFileSystemObjectを使うためのObjectを作成するコードです。

NAMAE5

変数について説明します。
親フォルダは、 Dim ParentFolder As Object,
子フォルダ、 ChildFolder As Object,
ファイル、File As Object
選択したフォルダへのパス、Dim sParentFolderPath As String
ファイル一覧作成するためのリスト、 Dim sList As String,
ファイル一覧表テキストの名前、 txtFileName As String
シートに出力する行、Dim r As Long '
対象のシート、 Dim ws As Worksheet

NAMAE6

以下のコードは、このファイル一覧が繰り返し使われる可能性を考えて入れています。
たとえば、どんどんファイルがふえていく可能性のある画像フォルダや、移動があるフォルダに対して一覧を作成するケースが考えられます。

NAMAE7

Dim FSO As New FileSystemObject
変数fsoをFileSystemObjectのobjectとして宣言し、インスタンス化しています。
次にWith文を使って、親フォルダの選択をユーザーにしてもらいます。

   With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "親フォルダを選択してください"
        If .Show = -1 Then
            sParentFolderPath = .SelectedItems(1)
        Else
            Exit Sub
        End If
    End With
NAMAE8

親フォルダを選択したことで、フォルダーのパスが取得できますから、パスにつなげてテキストファイル名の設定をします。

    ' テキストファイル名の設定
    txtFileName = sParentFolderPath & "\ファイル名一覧.txt"

    Set ParentFolder = FSO.GetFolder(sParentFolderPath)
    For Each ChildFolder In ParentFolder.SubFolders
        Dim Cname As String
        Cname = "【" & ChildFolder.Name & "】"  ' 子フォルダ名を変数に格納
        ' 子フォルダ名をシートに追加
        ws.Cells(r, 1).Value = Cname
        sList = sList & Cname & vbCrLf
        r = r + 1 ' シートに次の行に移動

For Each ChildFolder In ParentFolder.SubFolders
For Each...Next ステートメントを使って、ParentFolder.SubFoldersから、一つずつ ChildFolder を取り出します。
ChildFolder の名前を変数Cnameに設定します。

そのCnameをシートのws.Cells(r, 1).Value に転記します。
sList = sList & Cname & vbCrLf で、sList にCname フォルダ名を追加します。

NAMAE9

子フォルダーの処理

For Each...Next ステートメントを使って、ChildFolderから、一つずつファイルを取り出して、その名前を
ws.Cells(r, 1).Value = File.Nameに転記します。

NAMAE10

sList = sList & File.Name & vbCrLf で、 取得したファイル名をsList追加します。
このようにして、繰り返し子フォルダを全部取得し、その中のファイル名を転記したり、リストに追加したりします。

NAMAE11

最後にテキストを作成するための変数Dim ts As Objectを宣言し、
Set ts = FSO.CreateTextFile(txtFileName, True)
テキストファイルを作成します。 ts.Write sList  tsにsListを書き込み、
ts.Close tsを閉じます。
最後に終了したことを MsgBox でユーザーに報告します。

NAMAE14

以上がコードの解説です。
以下が今回紹介した動画「親フォルダ内の子フォルダにあるファイル名を取得して一覧を作成し、Txt保存。 」のコード全体です。

'==============================================================
'=指定親フォルダ内の子フォルダにあるファイル名を取得して一覧を作成し、Txt保存。   シートにも一覧を作成する。
'==============================================================

Sub 子フォルダのファイルリスト作成()
    Dim ParentFolder As Object, ChildFolder As Object, File As Object
    Dim sParentFolderPath As String
    Dim sList As String, txtFileName As String
    
    Dim r As Long ' シートに出力する行
    Dim ws As Worksheet

    ' リストシートを初期化
    Set ws = ThisWorkbook.Sheets("FileList") ' "FileList"というシートを作成
    ws.Range("A:A").Clear ' 既存の内容をクリア
    r = 1

    Dim FSO As New FileSystemObject
    ' 親フォルダの選択
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "親フォルダを選択してください"
        If .Show = -1 Then
            sParentFolderPath = .SelectedItems(1)
        Else
            Exit Sub
        End If
    End With

    ' テキストファイル名の設定
    txtFileName = sParentFolderPath & "\ファイル名一覧.txt"

    Set ParentFolder = FSO.GetFolder(sParentFolderPath)
    For Each ChildFolder In ParentFolder.SubFolders
        Dim Cname As String
        Cname = "【" & ChildFolder.Name & "】"  ' 子フォルダ名を変数に格納
        ' 子フォルダ名をシートに追加
        ws.Cells(r, 1).Value = Cname
        sList = sList & Cname & vbCrLf
        r = r + 1 ' シートに次の行に移動
    
        ' 子フォルダ内の各ファイルを取得
        For Each File In ChildFolder.Files
            ws.Cells(r, 1).Value = File.Name
            sList = sList & File.Name & vbCrLf
            r = r + 1 ' シートに次の行に移動
        Next File
            sList = sList & vbCrLf ' 空行を追加
    Next ChildFolder

    Dim ts As Object    ' テキストファイルにリストを書き込み
    Set ts = FSO.CreateTextFile(txtFileName, True)
    ts.Write sList
    ts.Close

    MsgBox "ファイルの一覧が作成されました。", vbInformation
End Sub