VBA:[Tips]フォルダ内にあるファイル名を検索する

「VBA:[Tips]フォルダ内にあるファイル名を検索する」の編集履歴(バックアップ)一覧に戻る

VBA:[Tips]フォルダ内にあるファイル名を検索する - (2015/07/17 (金) 11:10:04) のソース

*なにがどう
>フォルダ階層中にある特定ファイルを探して列挙する。
#image(無題1.png,width=200,height=262)
**探索方法
>+ フォルダを探す
>+ 検索で見つかったフォルダ内に、検索条件に合致するファイルを探す。
>+ ファイルが無いとき、フォルダ内にフォルダがあるかを探す。
>…
>フォルダもファイルも無いとき、探索終了。

**どう実装するのか
***使うオブジェクト
>FileSystemObject
Dir関数で検索も可能ですが、ネットワーク上のファイルなど名前が長すぎるファイルに対応できないのでFSOを使う方が良さそう

あとは再帰呼び出しをうまく活用する。
ファイルを探索するには以下のものが必要になる。
>1.全てのフォルダを探索する関数
>2.検索条件に合致するファイルを探索する関数
>3.取得したファイル名を煮たり焼いたりするコード

***まずフォルダを探索するメソッドを書く。
>Sub folderSearch(path)
>	'オブジェクトの生成
>	With CreateObject("Scripting.FileSystemObject")
>		'pathはフォルダのパス
>		For Each folder In .GetFolder(path).SubFolders
>			'再起呼び出し。検索でヒットしたフォルダのパスを引数に.
>			Call folderSearch(folder.path)
>		Next folder
>	End With
>End Sub

***同様に、ファイルを探索するメソッドを書く。
>For Each file in .GetFolder(path).files
>	'検索語句を含むファイル名を列挙する
>	If file.Name Like target Then
>		Cells(行,列)=file.path	'出力したいセルの位置を指定
>		Cells(行,列)=file.name	'出力したいセルの位置を指定
>	End If
>Next file

※補足
path
⇒探索フォルダのパス
file.path
⇒ファイルのフルパス
file.name
⇒ファイル名のみを取り出す

***最後に合体する
>Sub folderSearch(path)
>	'オブジェクトの生成
>	With CreateObject("Scripting.FileSystemObject")
>		'pathはフォルダのパス
>		For Each folder In .GetFolder(path).SubFolders
>			'ファイルの探索
>			For Each file in .GetFolder(path).files
>			'検索語句を含むファイル名を列挙する
>				If file.Name Like target Then
>					Cells(行,列)=file.path	'出力したいセルの位置を指定
>					Cells(行,列)=file.name	'出力したいセルの位置を指定
>				End If
>			Next file
>		'再起呼び出し。検索でヒットしたフォルダのパスを引数に.
>		Call folderSearch(folder.path)
>		Next folder
>	End With
>End Sub

わたしはファイルの探索を別メソッドにして強引に分けましたが無理やり中に書き込むとこんな感じ。
あとは出力先をループ中にインクリメントするように書いてあげて一覧表示させるとか、メッセージボックスでアラート出して遊ぶとか、そういう使い道がありそう。