サブフォルダも含め配下のフォルダパス全てを返すFunction
サブフォルダも含め配下のフォルダパス全てを返すFunction
作ってみた
いや、FileSystemObject
使えよ、って話なんですけどね。
Dir
関数使って作ったらどうなんのかな、と思って。
ソースコードを晒す
場当たり的に作ったやつなので、だいぶ恥ずかしいのですが、晒します。
リスト1
Public Function GetFolderPathAll( _ ByVal a_FolderPath As String) As String '配下の全てのフォルダのパスを、「>」で区切った文字列にして返す。 ' Dim ret As String ret = "" '対象のフォルダがなかったらReturn' If Dir(a_FolderPath, vbDirectory) = "" Then GoTo ReturnValues Dim tmp As String tmp = Dir(a_FolderPath & "\*", vbDirectory) Do 'Dirが文字列を返さなかったらループを抜ける。' If tmp = "" Then Exit Do 'Dirの返り値が「.」、「..」だったらContinue' If tmp = "." Then GoTo Continue If tmp = ".." Then GoTo Continue tmp = a_FolderPath & "\" & tmp '" 'フォルダパスじゃなかったらContinue' If GetAttr(tmp) <> vbDirectory Then GoTo Continue 'ここまでたどり着いたらフォルダパスのはず。' 'あとでSplitするときのために、区切り文字をファイルパスに' '使えない文字にする' ret = ret & tmp & ">" Continue: tmp = Dir() Loop Dim arr() As String arr = Split(ret, ">") Dim i As Long 'この段階では右端に「>」があるので、配列の最後の要素は空。' For i = LBound(arr) To UBound(arr) - 1 'GetFolderPathAllメソッドに投げるときには右端が「>」で' 'でないといけない。' If Right(ret, 1) <> ">" Then '一番底のフォルダまで行ったときは、右端に「>」が付いてい' 'ない文字列が「arr()」に入っている。' ret = ret & ">" End If 'サブフォルダを調べる。(再帰呼び出し)' ret = ret & GetFolderPathAll(arr(i)) Next ReturnValues: If ret <> "" Then If Right(ret, 1) = ">" Then '最後は右端の「>」をトル。' ret = Left(ret, Len(ret) - 1) End If End If GetFolderPathAll = ret End Function
ルートのフォルダのフルパスを渡して実行すると、配下のフォルダ全てのフルパスを「>
」で区切って一列棒状にした長~い文字列を返す、というもの。
地味に再帰を使っています。
使ってみる
とりあえずフォルダの準備
こんなフォルダ構成を、マクロを書いたDocumentのあるフォルダに作りました。
WordでVBAを書いているところにはツッコミなしで!
こんなコードで実行
次のコードを実行します。
リスト2
Private Sub test03() Dim tgtDir As String tgtDir = ThisDocument.Path Dim arr() As String arr = Split(GetFolderPathAll(tgtDir), ">") Dim i As Long For i = LBound(arr) To UBound(arr) Debug.Print arr(i) Next End Sub
GetFolderPathAll
メソッドの返り値は、配下の各フォルダパスが「>
」によって数珠つなぎにされた長~い文字列なので、Split
で区切って配列化し、それを一つづつ取り出してイミディエイトに書き出します。
実行結果
ほれ、この通り。
バッチリ!
おわりに
長らくDir
関数なんて使いませんでしたが、良い復習になりました。
今回作成したFunction、作った自分でも理解が追いついていないところがあるので、誰か解説よろしくお願いします。