|
|
| Excel VBA Macro ・ 開始終了 ・ FAQ |
|
FileSearchでファイル検索すると重複したりするが?
|
|
|
|
Question 48.8 |
|
 |
 |
|
|
いつも大変参考にさせていただいています。 データの検索が正常でなく、こまっています。
拡張子で各ドライブからファイルを検索する場合、.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」に変更しておきました。

テスト結果は左図のとおりです。
エクスプローラー画面には 「新作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関係かなと思いますが、拡張子辞典 には見当たらなかったので、差し支えなければ教えてください。
|
|
|
|
|