FileSearchでファイル検索すると重複したりするが?

Question 48.8 Previous Next
いつも大変参考にさせていただいています。 データの検索が正常でなく、こまっています。
拡張子で各ドライブからファイルを検索する場合、.FileSearchを使い行いますが、だぶって検索されたり、前回検索後に削除したファイルなのに、また今回検索されてしまったりして、正確に検索されません。
良い方法がありましたらご指導下さい。お願いします。Excel 97を使用しています。

(例)
 Set ファイル検索 = Application.FileSearch
    With ファイル検索
    .NewSearch
    .LookIn = "A:\;C:\;D:\"
    .Filename = "*.FDT"
    .SearchSubFolders = True
  If .Execute() > 0 Then
        MsgBox .FoundFiles.Count & " 個のファイルが・・・", vbOKOnly, "検索結果"
        For 検索結果 = 1 To .FoundFiles.Count
        Cells(検索結果, 1) = .FoundFiles(検索結果)
        Next 検索結果
          ・
Answer   Copyright (C) 2001.9.6 永井善王
だぶって検索されたり、削除したファイルが検索されたりするのでは、困りますね。
まずは、提示された FileSearchのマクロコードに問題がないか、見直してみましょう。
マクロコード 意味
NewSearch 検索条件をリセットする
LookIn = "A:\;C:\;D:\" 検索対象はA、C、D各ドライブのルートフォルダー
Filename = "*.FDT" 検索するファイルの名前は、拡張子が".FDT"のファイル
SearchSubFolders = True サブフォルダーを検索の対象にする
Execute() 検索を開始する
FoundFiles.Count 見つかったファイルの数
FoundFiles(検索結果) 見つかったファイルの名前を取得する
LookInプロパティは、Excelのヘルプで 「検索の対象となるフォルダーを設定する」と解説されています。 例えば、
"C:\My Documents;A:\Tamesi" のように、ドライブの異なる複数のフォルダーを指定することも可能です。
ルートも許されると考えるのは当然ですし、ヘルプの使用例にはサンプルもありますが、後述するように、やっかいな問題があります。

提示されたマクロコードの検討にもどります。
次のとおりテスト用のマクロを用意しました。提示されたマクロコードは末尾が省略されているので、推定で補いました。 また、テスト環境に合わせて検索対象ドライブと、検索対象ファイルの拡張子を変更しました。
このマクロは、Aドライブと Cドライブを(サブフォルダーを含む)検索して拡張子が xlsのファイルがあれば、そのファイル名をワークシートのセルにセットしようとするものです。
'------------------------------------------------------------------------------
Sub 指定ドライブのファイルの一覧を作成する()
    Worksheets("Sheet1").Activate
    Cells.Clear                                     'クリアする
    With Application.FileSearch
        .NewSearch
        .LookIn = "A:\;C:\"
        .FileName = "*.xls"
        .SearchSubFolders = True
        If .Execute() = 0 Then
            MsgBox "ファイルはありません", vbOKOnly, "検索結果"
        Else
            For 検索結果 = 1 To .FoundFiles.Count
                Cells(検索結果, 1) = .FoundFiles(検索結果)
            Next
        End If
    End With
    Columns("A:A").ColumnWidth = 70                 'A列の幅を設定する
    Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess
                                            	    'ソートする
End Sub
'------------------------------------------------------------------------------
このマクロを実行する直前に、テスト用パソコンの Cドライブにあった「新作0916」フォルダーの名前を、 「99新作0916」に変更しておきました。
FileSearchの結果
テスト結果は左図のとおりです。

エクスプローラー画面には 「新作0916」フォルダーは表示されていません。 しかし、ワークシートの A51:A54セルには確かに表示されています。
あなたが言われた削除したファイルとは異なりますが、旧名のフォルダーが検索されています。

視点を変えて、だぶって検索されたものがないか見てみました。左図では見えませんが同一のものがありました。それをエクスプローラーで確かめてみると、一方は
ショートカットでした。

テスト環境は、Excel 2000 (9.0.2812) &
Windows 95 (4.00.950) です。

Executeメソッド

FileSearchオブジェクトで Executeメソッドは、指定したファイルを検索します。
ファイルとショートカットは区分されません。だぶって検索されたかのように見える原因の 1つです。 これは Excelの仕様で、ショートカットかどうかを見分ける方法は不明です。

前に述べたやっかいな問題とは、ショートカットにはユーザー自身が作成したものと、Windows(OS)が作成したものとがあることです。そのため、検索対象としてルートを指定すると OSの管理下にあるフォルダーも含むことになる場合があるので、たくさんのショートカットが抽出されてしまいます。それに関連して指定していないつもりのドライブまでが、検索される場合もあります。

構文
expression.Execute(SortBy, SortOrder, AlwaysAccurate)
SortBy 検索結果を並べ替えるキーを指定、省略可能、
msoSortbyFileName:ファイル名、 msoSortbyFileType:ファイルの種類、 msoSortbyLastModified:更新日時、 msoSortbySize:サイズ
SortOrder 検索結果の並び順を指定、省略可能、
msoSortOrderAscending:昇順、msoSortOrderDescending:降順
AlwaysAccurate 検索の対象を指定、省略可能(既定値 True)、True:ファイル一覧が最後に更新されてから追加、変更、削除されたファイルも検索の対象にする

引数 AlwaysAccurateに注目してください。
Trueを指定するか省略すると 「
追加、変更、削除されたファイルも検索の対象にする」と明記されていますね。False にすれば良いように思いますが、「ファイル一覧が最後に更新されてから」との関連もはっきりわかりません。

まとめ

現段階では実務で FileSearchを活用しようとすると、以上のような問題点をクリアしなければなりません。何のために検索するのか、検索結果をどう使うのかにより一概には言えませんが、特定のフォルダーだけを検索してファイルがあれば一定の処理を行う程度ならば、使えるかも知れません。しかし、その程度の処理ならば Dir関数などでも実現できるでしょう。
【参考ページ】 
フォルダー名を取得する、 フォルダー中のファイル名をシートに書く

ところで、FDT という拡張子は何のファイルのことでしょうか? ひょっとするとCAD関係かなと思いますが、拡張子辞典 には見当たらなかったので、差し支えなければ教えてください。

Excel VBA Macro