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

なにがどう

フォルダ階層中にある特定ファイルを探して列挙する。

探索方法

  1.  フォルダを探す
  2.  検索で見つかったフォルダ内に、検索条件に合致するファイルを探す。
  3.  ファイルが無いとき、フォルダ内にフォルダがあるかを探す。

フォルダもファイルも無いとき、探索終了。

どう実装するのか

使うオブジェクト

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

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