フォルダ内一覧化

フォルダ内を一覧化するアプリを作ろう その1~4まとめ

フォルダ内一覧化
スポンサーリンク

ご家庭でも、お仕事でも、どちらでも使えるような、
フォルダの階層内すべてを検索する『フォルダ一覧化マクロ』の作り方を解説してきました。

再帰呼び出しというちょっと特殊なテクニックも含めて解説したので、
その1~4の4部構成になりました。

4つに分けて解説してきた影響で、
 ●結局最終の完成形はこれで合ってる??
 ●いろんなテクニック説明していたが、後で見返すときにどこにあるか分からない!
となるかと思いましたので、
その1~その4までのダイジェスト版を作りました

これを見ていただければ、
 ・最終完成形のマクロのイメージ
 ・各関数・コマンドの解説部分へのワープ

が可能になるかと思います。

その1~その4までを読まれた方も、これから読んでいただける方にも、
どちらにも有意義なものになるかと思いますので、是非とも読んでみてください。

【本記事の目標】

その1~その4で作ったフォルダ検索マクロの全体像を確認しよう

どの記事でどんな関数・コマンドを解説していたかを知ろう



完成品の構成

ExcelVBAの各モジュールのコード一覧

完成品のExcelファイルはシートが1つあるだけで、下記のような形で作っています。
(検索フォルダは本来は白紙ですが、わかりやすいように適当なデータを入れてあります)

また、完成品のExcelVBAマクロのモジュールは下記のような構成になっています。

モジュールは、今回は下記の4つを作っています。

  • FolderLinkInput:検索したいフォルダのリンクを入力するマクロを記載。
            Excelシートの『検索フォルダを選択』ボタンで起動する。
  • SearchInFolders:フォルダ検索のメインのマクロを記載。
            Excelシートの『フォルダ内を検索』ボタンで起動する。
  • SaikiYobidashi:再帰呼び出しする部分のマクロを記載。

それぞれのコードを下記に書きだします。

モジュール名:FolderLinkInput、プロシージャ名:SearchFolderLinkInput

Option Explicit

Sub SearchFolderLinkInput()
'検索したいフォルダのリンクを入力するマクロ

'変数の定義
Dim FilePath1 As String     '選択したフォルダのフルパスを入れる変数

With Application.FileDialog(msoFileDialogFolderPicker)
    If .Show = True Then    'フォルダが選択された場合に実行(キャンセルの場合は何もしない)
        
        '1つのファイルのパスだけ入力したいので、SelectedItemsの(1)を指定
        FilePath1 = .SelectedItems(1)
        
        '検索結果一覧のシートのB1セルに選択したフォルダのフルパスを入力
        ThisWorkbook.Sheets("検索結果一覧").Range("B1").Value = FilePath1
        
    End If
End With


End Sub

モジュール名:SearchInFolders、プロシージャ名:FolderSearchMain

(※ Public変数はここで宣言)

Option Explicit

'Public変数の定義場所
Public StopNum As Integer   '指定階層
Public KaisouNum As Integer 'カウンター変数


Sub FolderSearchMain()
'フォルダ検索のメイン部分

'Excelシートの初期化
Dim LastRow1 As Integer
With ThisWorkbook.Sheets("検索結果一覧")
    LastRow1 = .Cells(.Rows.Count, 1).End(xlUp).Row
    .Range(.Cells(6, 1), .Cells(LastRow1 + 1, 4)).ClearContents
End With

'検索したいフォルダのフルパスを入れる変数
Dim SearchFolderPath1 As String
SearchFolderPath1 = ThisWorkbook.Sheets("検索結果一覧").Range("B1").Value

'検索を止める階層を入力
StopNum = ThisWorkbook.Sheets("検索結果一覧").Range("D4").Value

'カウンター変数の初期化
KaisouNum = 0

'再帰呼び出しするプロシージャを呼び出す部分。
'引数に、検索したいフォルダのフルパスを与えています。
Call FolderSearchSub(SearchFolderPath1)


End Sub

モジュール名:SaikiYobidashi、プロシージャ名:FolderSearchSub

(※ 引数としてフォルダのパスが必要)

Option Explicit

Sub FolderSearchSub(SearchFolderPath2 As Variant)
'再帰呼び出しをするプロシージャ

'階層数をカウントアップ
KaisouNum = KaisouNum + 1

'参照設定を使用する場合(fso1は任意に設定OK)
Dim fso1 As Scripting.FileSystemObject      'FileSystemObjectの変数
Set fso1 = New Scripting.FileSystemObject

'For Eachで使う変数の定義
Dim FilesList1 As Variant
Dim FoldersList1 As Variant

'ファイルの情報を一旦入れておくための変数
Dim FileName1 As String
Dim FilePath1 As String
Dim FileExtensionName1 As String
Dim FileChangeDate As Variant

'シートの最終行の変数
Dim LastRow1 As Integer

If KaisouNum <= StopNum Then

'=====再帰呼び出しを含む実行部分======
'Filesコレクションの操作
For Each FilesList1 In fso1.GetFolder(SearchFolderPath2).Files

    FileName1 = fso1.GetFile(FilesList1).Name
    FilePath1 = fso1.GetFile(FilesList1).Path
    FileChangeDate = fso1.GetFile(FilesList1).DateLastModified
    FileExtensionName1 = fso1.GetExtensionName(FilePath1)
    
    'データをシートに記載
    With ThisWorkbook.Sheets("検索結果一覧")
        LastRow1 = .Cells(.Rows.Count, 1).End(xlUp).Row
        LastRow1 = LastRow1 + 1
        
        .Cells(LastRow1, 1).Value = FileName1
        .Cells(LastRow1, 2).Value = FilePath1
        .Cells(LastRow1, 3).Value = FileExtensionName1
        .Cells(LastRow1, 4).Value = FileChangeDate
    End With
Next FilesList1


'SubFoldersコレクションの操作
For Each FoldersList1 In fso1.GetFolder(SearchFolderPath2).SubFolders

    '自己プロシージャを呼び出している部分
    Call FolderSearchSub(fso1.GetFolder(FoldersList1).Path)
    
Next FoldersList1

'=====再帰呼び出しを含む実行部分の終わり======

End If


'階層数をカウントダウン
KaisouNum = KaisouNum - 1

End Sub



その1~その4で記載している内容

その1:完成品のイメージづくりと設計図作成

その1では、【完成品と、大まかなマクロの流れをイメージするための設計図作り】について記載しています。

説明の流れとしては、

  1. 完成品のイメージ(具体的な動き)
  2. マクロのフロー図(設計図)

という流れで説明しています。

具体的な内容も箇条書きしておきます。

  • 完成品のイメージづくり
  • フォルダの表示方法
  • マクロの動きをイメージするフロー図の作り方
  • フロー図を作る上での注意点
    (マクロの書き方が分からなくても、とりあえず書いてみるのが重要)



その2:フォルダ操作の下準備

その2では、【フォルダ操作の下準備、FileSystemObjectの使い方1つのフォルダ内の検索方法について記載しています。

説明の流れとしては、

  1. Excelシートの下準備
  2. メインモジュール・プロシージャの準備
  3. FileSystemObjectの準備
  4. 検索したいフォルダの入力マクロの作り方
  5. 1つのフォルダ内を検索するマクロの作り方

という流れで説明しています。

具体的な内容も箇条書きしておきます。

  • Excelシートの準備
  • メインのモジュール・プロシージャの準備
  • 参照機能を使用する場合について
  • 参照機能を使用しない場合について
  • 参照機能の説明と、使用する・しないのメリット・デメリット
  • 参照設定の方法
  • FileSystemObjectの定義方法
  • フォルダを選択するダイアログを表示する方法
  • ダイアログでファイル・フォルダを選択したときの動き
  • コメントブロックとは
  • FileSystemObjectを使ってフォルダ内のフォルダを調べる(GetFolder)
  • For Eachについて(コレクションの繰り返し)
  • データ形式『Variant』について
  • FileSystemObjectを使ってフォルダ内のファイルを調べる(GetFile)
  • FileSystemObjectを使ってファイルの拡張子を調べる(GetExtensionName)



その3:再帰呼び出しについて

その3では、【再帰呼び出しについての説明と使い方】について記載しています。

説明の流れとしては、

  1. これまでのおさらいと今回やりたいこと
  2. フォルダ階層を深く調べる強引な方法
  3. 再帰呼び出しについて(再帰呼び出しとは?)
  4. 実際のマクロの書き方

という流れで説明しています。

具体的な内容も箇条書きしておきます。

  • フォルダ内のファイルとフォルダを調べるときの違い
  • 強引なフォルダ階層の深掘り方法(複雑なコードの繰り返し)
  • 再帰呼び出しとは
  • プロシージャとは
  • プロシージャの自己呼び出しとは
  • 再起呼び出しの注意点
  • 再帰呼び出しした場合、定義した変数の取り扱いについて
  • 再帰呼び出しするプロシージャの書き方
  • プロシージャの『引数』(と『戻り値』)について



その4:好みの階層で検索を止める方法

その4では、【好みの階層で検索を止める方法、およびそのために必要なPublic変数】について記載しています。

説明の流れとしては、

  1. 前回のおさらいとやりたいこと、そのために解決する必要がある課題
  2. 変数の定義と適用範囲(Dim、Private、Public)
  3. Public変数の使い方、実際のコード
  4. シートの初期化のコード

という流れで説明しています。

具体的な内容も箇条書きしておきます。

  • 再帰呼び出しでの動きのイメージ
  • 再帰呼び出しの任意階層での止め方イメージ
  • 繰り返し回数を確認する『カウンター変数』について
  • 再帰呼び出しでの変数の定義と適用範囲について
  • 変数の定義と適用範囲について『Dim』
  • 変数の定義と適用範囲について『Private』
  • 変数の定義と適用範囲について『Public』
  • Public変数の具体的な定義の方法
  • シートの初期化方法



完成!

その1~その6を読んでいただければ、フォルダ検索アプリ 完成です!!

このマクロを使えば、パソコンの中がごちゃごちゃになったとしても、欲しいファイルを探しやすくなり作業効率が格段に上がると思います
(そもそも、ごちゃごちゃになる前に整理しておくのが一番ですが。。。)
またこのマクロでファイルやフォルダを操作する方法の一部を説明していますので、この内容を派生させていけば、Excelファイル以外を操作する方法に広げていくことができ、マクロ作りのレベルが上がると思います。

できる限り一般的に使える方法として紹介しているので、自分専用の自分が使いやすい形に改造していってもらえれば、より作業効率も上がり、マクロ作りのレベルアップにもなるので、是非とも挑戦してみてください。

ではまた。

コメント

タイトルとURLをコピーしました