次の方法で共有


Office Space: Microsoft Excel を使用してファイルを検索する : エピソード 2

Office Space

Office Space へようこそ。Office Space は、Microsoft® Office アプリケーションのスクリプト作成に関するヒントとテクニックを紹介するコラムです。毎週火曜日と木曜日に新しいヒントを掲載します。過去のヒントについては、Office Space アーカイブを参照してください。Microsoft Office でのスクリプト作成について質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。

Microsoft Excel を使用してファイルを検索する : エピソード 2

世間の人々は、エイリアンとプレデターの戦いでどちらが勝利を収めるかについてはもう興味がなくなったようで、新しい議論が世界中の注目を集めました。その議論とは、6 部構成のスター ウォーズ シリーズと、ファイルの検索方法として Microsoft Excel を使用することに関する 2 部構成の Office Space クロニクルではどちらの方がすばらしいシリーズになるかということです。私のつつましさからすると、どちらがすばらしいかについて意見を述べることはできませんが、どちらの方が短時間で終わるかをお伝えすることはできます。要するに、アナキン スカイウォーカーがダース ベーダーになる経緯がわかるまでには 30 年近くかかりましたが、Microsoft Office ドキュメント内でテキストを検索する方法を知るまでには 1 週間しかかかりませんでした。

でもほら、ジョージ ルーカス、あまり落ち込まないで。結局、すべてが Office Space コラムになるわけではないのですから。

前回のエキサイティングなエピソード (現在のタイトルは "エピソード 1") では、コンピュータ上のファイルを検索する方法として Microsoft Excel (または他の Microsoft Office アプリケーション) を使用する考えをご紹介しました。そのとき、ハラハラするエンディングの 1 つで、Microsoft Office ドキュメント内でのテキストの検索や過去 x 日間に更新された Office ファイルの検索に Excel を使用する可能性を示して読者の皆さんをやきもきさせました。このような問題に対する答えを真っ先に確認したいとコンピュータの前で寝ていた方には、大変長らくお待たせいたしました。「ファイルの検索 (エピソード 2): 事実上の旅立ち」へようこそ。

: エピソード 1 をまだお読みでない方は、エピソード 1 に戻り、最初にお読みになることをお勧めします (申し訳ありませんが、まだ DVD では提供されていません)。今日のコラムの大部分では、エピソード 1 に記載した検索の基本概念については説明しません。

まず始めに、C:\Scripts とそのサブフォルダにあるすべての Office ドキュメント内のテキストを検索するスクリプトを見てみましょう (今回実行する検索は、Office ドキュメントに限定されることに注意してください。この技法を使用して、テキスト ファイルや他の種類のファイルを検索することはできません)。次のスクリプトでは、ドキュメント自体またはドキュメントのプロパティ (作成者、タイトル、キーワードなど) のいずれかに "Ken Myer" という名前を含むすべてのドキュメントを検索しています。

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True

Set objSearch = objExcel.FileSearch
objSearch.Lookin = "C:\Scripts"
objSearch.SearchSubfolders = TRUE
objSearch.TextOrProperty = "Ken Myer"
objSearch.Execute

For Each strFile in objSearch.FoundFiles
    Wscript.Echo strFile
Next

objExcel.Quit

エピソード 1 のエキサイティングな検索シーンを思い出すと、このスクリプトはとても馴染み深いものでしょう。まず、Excel.Application オブジェクトのインスタンスを作成し、Visible プロパティを True に設定しています。この Visible プロパティを True に設定する手順は省略できます。ここでは、単に Excel が画面に表示されるように設定しているだけです。次に、FileSearch オブジェクトのインスタンスを作成し、検索オブジェクトのパラメータを構成して、Execute メソッドを呼び出しています。これにより、"Ken Myer" という名前を含むすべてのドキュメントのコレクションが返されます。その後、各ドキュメントのファイル パスをエコー出力してから、Excel を終了しています。

上記のスクリプトとエピソード 1 のスクリプトの 1 つの違いは次のコード行です。

objSearch.TextOrProperty = "Ken Myer"

エピソード 1 では、特定のファイル名やファイル拡張子を検索していたので、FileName プロパティを構成しました。ここでは、特定のテキスト文字列を検索しているので、TextOrProperty プロパティを構成します。つまり、TextOrProperty に検索する値を割り当てるだけです。

ちなみに、TextOrProperty 値を構成するときにワイルドカード文字を使用できます。たとえば、次のコード行により、Ken Myer、Ken Meyer、Ken Meier、"Ken M" で始まるその他の文字列がスクリプトで検索されます。

objSearch.TextOrProperty = "Ken M*"

これでもまだ物足りない場合は、FileType プロパティを使用して、ファイル検索を特定の種類のドキュメントに限定できます (たとえば、PowerPoint スライドや Excel ワークシートではなく、Microsoft Word 文書のみがスクリプトで検索されるように限定できます)。この次のスクリプトでは、Microsoft Word 文書のみで "Ken Myer" が検索されます。その驚くべき機能を実現するために、単に msoFileTypeWordDocuments という名前の定数を定義し、値を 3 に設定しました。その後、FileType プロパティの値にこの定数を設定しました。

objSearch.FileType = msoFileTypeWordDocuments

これでほぼ完成です。完成したスクリプトは次のようになります。

Const msoFileTypeWordDocuments = 3

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True

Set objSearch = objExcel.FileSearch
objSearch.Lookin = "C:\Scripts"
objSearch.SearchSubfolders = TRUE
objSearch.TextOrProperty = "Ken Myer"
objSearch.FileType = msoFileTypeWordDocuments
objSearch.Execute

For Each strFile in objSearch.FoundFiles
    Wscript.Echo strFile
Next

objExcel.Quit

ここで、さまざまなドキュメントの種類の定数 (msoFileTypeWordDocuments など) とそれらの値を次の表に示します。

定数

msoFileTypeAllFiles

1

msoFileTypeBinders

6

msoFileTypeCalendarItem

11

msoFileTypeContactItem

12

msoFileTypeDatabases

7

msoFileTypeDataConnectionFiles

17

msoFileTypeDesignerFiles

22

msoFileTypeDocumentImagingFiles

20

msoFileTypeExcelWorkbooks

4

msoFileTypeJournalItem

14

msoFileTypeMailItem

10

msoFileTypeNoteItem

13

msoFileTypeOfficeFiles

2

msoFileTypeOutlookItems

9

msoFileTypePhotoDrawFiles

16

msoFileTypePowerPointPresentations

5

msoFileTypeProjectFiles

19

msoFileTypePublisherFiles

18

msoFileTypeTaskItem

15

msoFileTypeTemplates

8

msoFileTypeVisioFiles

21

msoFileTypeWebPages

23

msoFileTypeWordDocuments

3

もちろん、1 回の検索で複数のドキュメントの種類を検索できます。そのためには、まず、必要なすべての定数を定義します。FileType プロパティを最初のドキュメントの種類に設定し、Add メソッドを使用して新たなドキュメントの種類を FileTypes コレクションに追加します。たとえば、次のコードでは、最初に Microsoft Word 文書を FileType に割り当ててから、Excel ブックも追加しています。

objSearch.FileType = msoFileTypeWordDocuments
objSearch.FileTypes.Add msoFileTypeExcelWorkbooks

Word 文書と Excel ドキュメントの両方で "Ken Myer" という値を検索する完成したスクリプトは次のようになります。

Const msoFileTypeWordDocuments = 3
Const msoFileTypeExcelWorkbooks = 4

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True

Set objSearch = objExcel.FileSearch
objSearch.Lookin = "C:\Scripts"
objSearch.SearchSubfolders = TRUE
objSearch.TextOrProperty = "Ken Myer"
objSearch.FileType = msoFileTypeWordDocuments
objSearch.FileTypes.Add msoFileTypeExcelWorkbooks
objSearch.Execute

For Each strFile in objSearch.FoundFiles
    Wscript.Echo strFile
Next

objExcel.Quit

あなたが思うとおり、既にスターウォーズ エピソード 2 よりも多くのアクションを起こしています。しかし、まだ終わってはいません。もう 1 つ別のスクリプトをご紹介します。このスクリプトはとても使いやすく、最終更新日に基づいて Microsoft Office ドキュメントを検索できます。ご覧のとおり、この検索方法は WMI を使用して最終更新日に基づいてファイルを検索する方法よりもはるかに簡単です。これは、FileSearch オブジェクトには、定数を使用して構成できるパラメータ (LastModified) があるためです。たとえば、次のような、C:\Scripts (およびそのサブフォルダ) にある最終更新日が先月の Office ドキュメントをすべて検索するスクリプトがあるとします。

Const msoLastModifiedLastMonth = 5

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True

Set objSearch = objExcel.FileSearch
objSearch.Lookin = "C:\Scripts"
objSearch.SearchSubfolders = TRUE
objSearch.LastModified = msoLastModifiedLastMonth
objSearch.Execute

For Each strFile in objSearch.FoundFiles
    Wscript.Echo strFile
Next

objExcel.Quit

この例では、基本の検索スクリプトを使って、次の作業を行っただけです。

  • msoLastModifiedLastMonth という名前の定数を定義し、値を 5 に設定しました。

  • この定数を LastModified プロパティに割り当てました。

これだけです。先月更新されたすべての Office ドキュメントの一覧を取得することはとても簡単ですね。

注意すべき点を簡単に 2 つ挙げましょう。1 つ目は、このスクリプトは Microsoft Office ドキュメントだけで機能するということです。テキスト ファイルやスクリプト、Office ドキュメント以外の種類のファイルは検索できません。2 つ目は、対象を非常に絞り込んだ検索 (たとえば、1938 年 4 月 17 日に更新されたドキュメントの検索) は実行できないということです。実際、次の表に示す定数 (および時間間隔) に限定されます。

定数

msoLastModifiedAnyTime

7

msoLastModifiedLastMonth

5

msoLastModifiedLastWeek

3

msoLastModifiedThisMonth

6

msoLastModifiedThisWeek

4

msoLastModifiedToday

2

msoLastModifiedYesterday

1

任意の種類のファイルや特定の更新日を検索する必要がある場合は、代わりに WMI スクリプトを使用する必要があります。

それでは、サガはこれで終わりでしょうか。そうかもしれませんね。でも、そうではないかもしれません。Microsoft Excel を使用したファイルの検索については、まだ 1 つのテクニックあるいは 2 つの切り札があります。ただし、これらのテクニックをすぐに使えるかどうかはまた別の問題です。それまでは、次のような議論が沸騰する問題を皆さんに残しておきます。エイリアンと Scripting Guy の戦いで勝利を収めるのはどちらでしょうか。

この問題は、予想よりもはるかに速く決着が着きました。