0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

フォルダ構造を一覧にするExcel VBA

Last updated at Posted at 2020-10-29

仕事してて、フォルダ構造と収納されているファイルを一覧にしたいなって思ったことないですか?

#Excel VBAで作っておきました。

どうぞ。
使ってください。
編集しないといけない点は、変数”Path”の値だけです。

14年ぶりにプログラミング書いてるので、リファクタリングしてくれる人募集中ですm(__)m

Dim numOfDelimiter As Long

Sub mainFFs()
   
   'Declare
   Dim subFolders As Object
   Dim Path As String
   Dim rowP As Long
   Dim culP As Long
   Dim numOfSubF As Long
   Dim buf As String
   
   'Set values
   
   Path = "C:\Users\" 'ここに一番上のフォルダを指定してくださいね
   rowP = 1
   culP = 1
   
   'Pathに \ が何個あるか数える
   numOfDelimiter = UBound(Split(Path, "\"))
   
   '指定したフォルダだけ、書いてしまう
   Cells(1, 1) = Path
   culP = culP + 1
   buf = Dir(Path & "\*.*")
   Do While buf <> ""
       Cells(rowP, culP) = buf
       rowP = rowP + 1
       buf = Dir()
   Loop
   
   Call writeSubFFs(Path, culP, rowP)

End Sub

Sub writeSubFFs(Path As String, culP As Long, rowP As Long)
      
   '階層の調整
   Dim curPath As Long '文字カウント数
   curPath = UBound(Split(Path, "\"))
   
   If curPath <= numOfDelimiter + 1 Then
       culP = 3
   Else
       culP = culP + 1
   End If
   
   '*** Process ****
   
   '①フォルダ取得
   Set subFolders = CreateObject("Scripting.FileSystemObject").GetFolder(Path).subFolders
   
   For Each subFolders In subFolders
   
   '②フォルダ記載
       
       Path = subFolders.Path
       Cells(rowP, culP) = Path
       
   '③ファイル取得
       culP = culP + 1
       On Error Resume Next
       buf = Dir(Path & "\*.*")
   '④ファイル記載
       Do While buf <> ""
           Cells(rowP, culP) = buf
           rowP = rowP + 1
           buf = Dir()
       Loop
   
   
       culP = culP - 1
       rowP = rowP + 1
   
       Call writeSubFFs(Path, culP, rowP)
   
   Next subFolders
End Sub

因みに、writeSubFFsは自身を再起してます。
(下から4行目のCallで)
理由は、再起しないとSubフォルダ1階層分しか取得できなかったため。

今後の応用としては、パスをリンクにしてみたり、2個のHDDの差分のみを同期するみたいなファイルの前段の処理として利用したり(車輪再発名しそうな予感)、書き出す対象ファイルに条件を付けて、欲しいファイルのみ記載したりなど、色々できますよね。

注意点:
 Cドライブから実行すると、
 私の環境だと、とんでもない量のファイルになりそうでした。
 (以下は、45万ファイル検出くらいで処理を止めました。の図)
 そこまで検出したくない場合は、対象ファイルを限定するなり、行のカウンターに制限を設けるなりした方が良いかもです。

image.png

#参考にしたサイト

結局これを改編したのが今回のコード
https://www.moug.net/tech/exvba/0060088.html

これそのまま実装したかったけど、basファイルがめんどかった
https://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_080.html
https://www.asahi-net.or.jp/~ef2o-inue/download/sub09_020_110.html

SESだと、権限の関係でさわれないフォルダがあるので、on error resume nextで飛ばす
http://officetanaka.net/excel/vba/tips/tips104.htm

今後の応用
http://officetanaka.net/excel/vba/tips/tips95.htm
http://blog.jmiri.net/?p=1763

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?