スポンサーリンク

【Excel VBA】FileSystemObjectを使いこなす!(実践編) 第五回目 フォルダ以下のすべてのファイルパスを取得する(階層構造版)

VBAでの操作

こんにちは、blueです。

前回は実践編の四回目としてフォルダ以下の全てのファイルパスを取得する方法について説明しました。

前回の記事はこちら

今回は前回のコードを改良して階層構造、ハイパーリンクを追加したものを紹介します。

この方法を使えばフォルダ内の階層構造が把握しやすくなるのとともに、検索機能でひかかったファイルパスをワンクリックで開くことができるようになります。

参考にしていただければ幸いです。

スポンサーリンク

今回の流れ

今回のコードの流れと最終的な結果は以下になります。

  1. 最初のセルを選択する
  2. フォルダを選択する(FileDialogとGetFolder)
  3. 対象のフォルダに対して以下の再帰処理を行う
  4. フォルダ名を取得する
  5. 1列ずれる(下層に当たる為)
  6. サブフォルダオブジェクトを取得する
  7. ファイルがあれば1行ずれる(同階層の為)
  8. ファイル名を記載する
  9. 1行ずれる(同階層の為)
クリックすると拡大します

前回と異なるのは階層構造が追加されたこと、それぞれの名前にリンクが貼り付けられたことです。

実コード

実際のコードは以下になります。

Scripting.Runtimeの参照設定さえしておけばコピペでも可能です。

Dim tRow As Long
Dim ws As Worksheet

Private Sub GetFileFolderInformation()
         
    Dim FSO As New Scripting.FileSystemObject
    Dim FD As FileDialog
    Dim FolderName As String
    Dim objFolder As Scripting.Folder
    Dim tColumn As Long
    
    'グローバル変数の初期化
    tRow = 0
    
    '最初のセル情報を与える
    Set ws = ThisWorkbook.Worksheets("Sheet1")
        tRow = 2
        tColumn = 2
        
    'フォルダを選択する(FileDialogとGetoFolder)
    Set FD = Application.FileDialog(msoFileDialogFolderPicker)
    
    If FD.Show = True Then
        FolderName = FD.SelectedItems(1)
        Set objFolder = FSO.getFolder(FolderName)
        Call getFolder(objFolder, tColumn)
    End If
    
End Sub

Sub getFolder(objFolder As Scripting.Folder, ByVal tColumn As Long)
    
    Dim objSubFolder As Scripting.Folder
    Dim objFile As Scripting.File
    
    
    'フォルダ名を取得する
    ws.Cells(tRow, tColumn).Value = objFolder.Name
    'セルにハイパーリンクを貼る
    ws.Hyperlinks.Add Anchor:=Cells(tRow, tColumn), Address:=objFolder.Path, TextToDisplay:=objFolder.Name
    
    '1列ずれる(下層に当たる為)
    tColumn = tColumn + 1
    
    'サブフォルダオブジェクトを取得する
    For Each objSubFolder In objFolder.SubFolders
        Call getFolder(objSubFolder, tColumn)
    Next
    
    
    '下層にファイルがない場合は1行ずれる。ある場合はずれない
    If objFolder.Files.Count = 0 Then
        tRow = tRow + 1
    Else
        'ファイル名を記載する
        For Each objFile In objFolder.Files
            ws.Cells(tRow, tColumn).Value = objFile.Name
            'セルにハイパーリンクを貼る
            ws.Hyperlinks.Add Anchor:=Cells(tRow, tColumn), Address:=objFile.Path, TextToDisplay:=objFile.Name
            '1行ずれる(同階層の為)
            tRow = tRow + 1
        Next
    End If
   
End Sub

コードの詳細は以降で詳しく説明します。

コードの説明

今回のコードも2つのプロシージャに分かれています。

  1. (起点となる)フォルダオブジェクトを取得するプロシージャ(Private Sub getFileFolderInfomation())
  2. 再帰処理を使って中のファイルとサブフォルダを取得するプロシージャ(Private Sub getFolder(objFolder As Scripting.Folder)

前回と異なるのは最初にサブフォルダの情報を取得しているところです。

この方法を用いることで各最下層のファイルから情報を取得することができます。

またWorksheets.HyperLinksのAddメソッドで各セルにリンクを貼っています。

メソッドの引数の詳細と自動化している内容は以下になります。

クリックすると拡大します

このコードで階層構造を持ったフォルダとファイル名の情報が取れます。

なお(残念ながら)体裁まで整えるコードは記載していませんので必要であれば処理後に操作ください。

まとめ

今回は 前回に対して階層構造とハイパーリンクを追加したコードを紹介しました。

複雑な階層構造だと逆に見づらくなるのでどちらがよいかはお好みですが、ハイパーリンクは付与しておくと検索後にすぐに目的のファイルを開くことができます。

業務効率も大きく上がると思いますので使っていただければ幸いです。

以上でFSOに関する記事を終了することとします。ここまで見てくださった方ありがとうございました。

コメント

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