Office Space: Microsoft Excel を使用してファイルを検索する
Office Space へようこそ。Office Space は、Microsoft® Office アプリケーションのスクリプト作成に関するヒントとテクニックを紹介するコラムです。毎週火曜日と木曜日に新しいヒントを掲載します。過去のヒントについては、Office Space アーカイブを参照してください。Microsoft Office でのスクリプト作成について質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。
Microsoft Excel を使用してファイルを検索する
Scripting Guys には、少なくとも 1 人の熱狂的な野球ファンがいます。それは今後も変わらないでしょう。野球ファンだからといって、野球の試合が完全無欠だと思っているわけではありません。たとえば、この野球好きの Scripting Guy は、最近は当たり前になってきている専門分化を好ましく思っていないでしょう。たとえば、指名打者 (守備をしないプレーヤー)、左バッターに対してのみ、しかも 7 回だけ登板するサウスポーのリリーフ、スタメンを決める前に経度、緯度、気圧、チベット占術の図表を評価するマネージャなどです。ただフィールドに出て野球をすることはできないのでしょうか。
この野球に見られる専門分化に対する狂気じみた執着は、この Scripting Guy が Microsoft Office を使うと少し癒されることを説明するのに役立ちます ("少し" というところに注意してください)。現代の野球選手とは異なり、Microsoft Office アプリケーションでは、さまざまな処理を行えます。Microsoft PowerPoint を使用して、スライドを作成できることに驚く人はいないでしょう。また、Microsoft Word を使用して文書を処理できると聞いて驚く人もいないでしょう。これは、当たり前のことになっています。
ここでは、それを伝えたいのではありません。Office がすばらしいのは、Office アプリケーションを使用すると、Office アプリケーションを使用しない場合には遂行が困難な作業を行えるという点です。たとえば、コンピュータに D:\Music という名前のフォルダがあるとします。このフォルダには、さまざまなサブフォルダがあり、サブフォルダには多数の Windows Media ファイルが含まれています。これらのメディア ファイルの一覧を取得するスクリプトを記述することにしましょう。このタスクに最適なスクリプト テクノロジは何でしょうか。
ごもっともです。Microsoft Excel です (Microsoft Word や Microsoft PowerPoint でも問題ありません)。FileSystemObject を使用して、D:\Music にあるファイルを検索することはできるでしょうか。もちろんです。ただし、すべてのサブフォルダを検索するには、再帰関数を記述する必要があり、再帰関数を記述することは、可能であったとしても、厄介な作業です (再帰関数を使用した検索方法の例については、この「Hey, Scripting Guy!」コラムを参照してください)。では、WMI を使用してファイルを検索することはできるでしょうか。もちろんですとも。ただし、この場合も、(すぐに説明しますが) 特定のフォルダにある特定のファイルを検索するので、詳細な検索を行う場合、WMI の構文は、かなり複雑になります (WMI は、コンピュータ全体に対して、単純な検索を行うことには優れています)。
これに対して、次に示す D:\Music とそのサブフォルダにあるすべての .WMA ファイルの一覧を返す Microsoft Excel スクリプトは、単純でわかりやすいものです。
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objSearch = objExcel.FileSearch
objSearch.Lookin = "D:\Music"
objSearch.SearchSubfolders = TRUE
objSearch.FileName = "*.wma"
objSearch.Execute
For Each strFile in objSearch.FoundFiles
Wscript.Echo strFile
Next
objExcel.Quit
とてもわかりやすいでしょう。特に、次に示す D:\Music とそのサブフォルダにあるすべてのファイルを一覧する "簡略化した" WMI のスクリプトと比較すると、その差は歴然だと思います (このスクリプトは、拡張子が .wma のファイルだけでなく、すべてのファイルを一覧表示するため、スクリプトを簡略化しました)。
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
strFolderName = "D:\Music"
Set colSubfolders = objWMIService.ExecQuery _
("Associators of {Win32_Directory.Name='" & strFolderName & "'} " _
& "Where AssocClass = Win32_Subdirectory " _
& "ResultRole = PartComponent")
Wscript.Echo strFolderName
arrFolderPath = Split(strFolderName, "\")
strNewPath = ""
For i = 1 to Ubound(arrFolderPath)
strNewPath = strNewPath & "\\" & arrFolderPath(i)
Next
strPath = strNewPath & "\\"
Set colFiles = objWMIService.ExecQuery _
("Select * from CIM_DataFile where Path = '" & strPath & "'")
For Each objFile in colFiles
Wscript.Echo objFile.Name
Next
For Each objFolder in colSubfolders
GetSubFolders strFolderName
Next
Sub GetSubFolders(strFolderName)
Set colSubfolders2 = objWMIService.ExecQuery _
("Associators of {Win32_Directory.Name='" & strFolderName & "'} " _
& "Where AssocClass = Win32_Subdirectory " _
& "ResultRole = PartComponent")
For Each objFolder2 in colSubfolders2
strFolderName = objFolder2.Name
Wscript.Echo
Wscript.Echo objFolder2.Name
arrFolderPath = Split(strFolderName, "\")
strNewPath = ""
For i = 1 to Ubound(arrFolderPath)
strNewPath = strNewPath & "\\" & arrFolderPath(i)
Next
strPath = strNewPath & "\\"
Set colFiles = objWMIService.ExecQuery _
("Select * from CIM_DataFile where Path = '" & strPath & "'")
For Each objFile in colFiles
Wscript.Echo objFile.Name
Next
GetSubFolders strFolderName
Next
End Sub
このコードを見るときに防護眼鏡をかけるようにお勧めしなかったことをお詫びします。
では、この Excel の検索スクリプトがどのように動作するのかを説明しましょう。このスクリプトでは、まず Excel.Application オブジェクトのインスタンスを作成し、Visible プロパティを True に設定します。Visible プロパティを True に設定したのは、Excel が画面に表示され、スクリプトが動作していることを視覚的に確認できるようにするためです。このコード行をスクリプトから省略しても、スクリプトは問題なく動作するので、Excel をこっそり検索エンジンとして使用していることには、だれも気付かないでしょう。
注 : FileSearch オブジェクトは、Microsoft Office のオブジェクトなので、他の Office アプリケーションでも使用できます。ファイルの検索に PowerPoint を使用したい場合は、PowerPoint を使用してファイルを検索できます。PowerPoint でも、FileSearch オブジェクトを使用できます。 |
Excel のインスタンスを作成したら、FileSearch オブジェクトのインスタンスを作成し、このオブジェクトについて次のプロパティを設定します。
プロパティ |
説明 |
Lookin |
検索の開始位置。ここでは、D:\Music とそのサブフォルダのみを検索するので、Lookin プロパティの値には D:\Music を指定します。ドライブ D にあるすべてのフォルダを検索する場合はどうでしょうか。このような場合は、Lookin プロパティの値に D:\ を指定します。 2 つの異なる場所を検索する場合についても知りたいようですね。問題はありません。Lookin プロパティの値を指定する際に、区切り文字にセミコロンを使用して、両方の場所を指定することができます。たとえば、次のコード行は、フォルダ D:\Music とフォルダ D:\Archive を検索するよう Excel に通知します。 objSearch.Lookin = "D:\Music;D:\Archive" |
SearchSubfolders |
では、あるフォルダのすべてのサブフォルダを検索する場合はどうでしょうか。複雑な再帰関数を記述する必要はあるのでしょうか。いいえ、その必要はありません。SearchSubfolders プロパティを True に設定するだけです。逆に、D:\Music フォルダだけを検索し、そのサブフォルダを検索しない場合はどうでしょうか。このような場合は、SearchSubfolders プロパティを False に設定するだけなので、とても簡単です。 |
FileName |
驚くべきことに、FileName プロパティには、検索するファイルの名前を指定します。ファイル名には、一般的なワイルドカード文字を使用できます。そのため、*.wma ファイルを検索することができます。この値を指定した場合、拡張子が .wma のファイルが返されます。特定のファイルを検索する場合は、ファイル名を指定することができます。次のコードでは、mysong.wma という名前のファイルのみが検索されます。 objSearch.FileName = "mysong.wma" 複数のファイルや複数の種類のファイルを同時に検索できることも説明しておきましょう。ここでも、区切り文字にセミコロンを使用して、検索するファイル名とファイルの種類を指定できます。たとえば、次のコードでは、.wma と .mp3 ファイルの両方を検索するよう Excel に通知します。 objSearch.FileName = "*.wma;*.mp3" |
全体的に、Microsoft Excel スクリプトは、WMI スクリプトを記述して同じ処理を行うよりも簡単です。
プロパティの値を設定したら、Execute メソッドを呼び出して、検索を開始します。Execute メソッドは、検索条件に一致したすべてのファイルのファイル パスで構成されたコレクション (FoundFiles コレクション) を返します。これらのファイルとファイル パスを一覧表示するには、FoundFiles コレクションを繰り返し処理する For Each ループが必要です。
For Each strFile in objSearch.FoundFiles
Wscript.Echo strFile
Next
必要なのは、これだけです。スクリプトを実行すると、次のような出力が返されます (D:\Music フォルダのサイズによっては、スクリプトを実行すると同時に出力が返されることもあります)。
D:\Music\John Prine\Lost Dogs and Mixed Blessings\01 New Train.wma
D:\Music\John Prine\Lost Dogs and Mixed Blessings\10 Same Thing Happened to Me.wma
D:\Music\Dire Straits\Brothers in Arms\01 So Far Away.wma
D:\Music\Dire Straits\Brothers in Arms\02 Money for Nothing.wma
D:\Music\Dire Straits\Brothers in Arms\03 Walk of Life.wma
すばらしい。では、一番すばらしい点を説明しましょう。Microsoft Office は、サウスポーのリリーフのように、1 つの処理 (この場合は、特定のファイル名やファイル拡張子の検索) しかできないものではありません。Microsoft Office には、汎用的な検索機能が備わっています。来週は、Office を使用して、ファイル内のテキスト、特定の期間内に変更されたファイル、および特定の人が作成したファイルを検索する方法を紹介します。次回にご期待ください (きっと、待ちきれないはずです)。