wrote :: 2005.02.01

トップページ > Excel > VBA > ファイルを検索する

ファイルを検索する

Excelは表計算ソフトですから表だけ計算してればいいんですが、ときには「何でExcelでそんなことまでするの?」ということもあります。まあ、Excelでゲーム作ったりしてる私が言えるセリフではありませんけど…。
それでも、Excelでちゃんとしたシステムを作ろうとしたら、表の計算以外にもたくさんの機能が必要になります。ここでは、ファイルを検索するテクをご紹介しましょう。きっと何かのときに役立つと思いますよ。

ファイルを検索するにはFileSearchオブジェクトを使います。厳密に言うとFileSearchオブジェクトはExcelのオブジェクトではなく、Officeシステム全体のオブジェクトです。ここでは、検索した結果をシートに出力していますが、UserFormを使っても便利ですね。

Sub Sample()
    Dim f, buf As String, cnt As Long, FSO
    Set FSO = CreateObject("Scripting.FileSystemObject")
    With Application.FileSearch
        .NewSearch
        buf = InputBox("検索するファイル名を指定してください")
        If buf = "" Or buf = "False" Then Exit Sub
        .Filename = buf
        buf = GetFolder("検索を開始するフォルダを指定してください")
        If buf = "" Then Exit Sub
        .LookIn = buf
        .SearchSubFolders = True        ''サブフォルダも検索する
        If .Execute() > 0 Then
            For Each f In .FoundFiles
                cnt = cnt + 1
                Cells(cnt, 1) = f                           ''パス+ファイル名
                Cells(cnt, 2) = FSO.GetFile(f).Name         ''ファイル名
                Cells(cnt, 3) = FSO.GetFile(f).ParentFolder ''パス
            Next f
        Else
            MsgBox "見つかりませんでした"
        End If
    End With
    Set FSO = Nothing
End Sub

Function GetFolder(msg As String)
    Dim Shell, myPath
    Set Shell = CreateObject("Shell.Application")
    Set myPath = Shell.BrowseForFolder(&O0, msg, &H1 + &H10)
    If Not myPath Is Nothing Then
        GetFolder = myPath.Items.Item.Path
    Else
        GetFolder = ""
    End If
    Set Shell = Nothing
    Set myPath = Nothing
End Function

FileSearchオブジェクトでファイルを検索するには、まずNewSearchメソッドを実行して前回の検索結果や条件をクリアします。これはお約束ですから、はじめて検索するときでも実行しておきましょう。
FileSearchオブジェクトは、検索するファイル名や検索する場所などをそれぞれプロパティに設定しておき、最後にExecuteメソッドで検索を実行します。Executeメソッドは見つかったファイルの個数を返しますので、返り値が0だったら見つからなかったということです。

Filenameプロパティには検索するファイル名を指定します。普通は「*.lzh」や「資料??.xls」のようにワイルドカードを指定しますね。いえ、もちろん「Book1.xls」と特定のファイルを探してもけっこうですけど。上記のサンプルでは、InputBoxを使って毎回ユーザーから検索するファイル名を受け取っています。InputBoxの詳細については「実は奥が深いInputBox」をご覧ください。

LookInプロパティは検索するフォルダを指定します。ここでは[フォルダを選択]ダイアログボックスで指定しています。[フォルダを選択]ダイアログボックスについては「フォルダを選択するダイアログボックス」をご覧ください。同時に指定したいのはSearchSubFoldersプロパティです。SearchSubFoldersプロパティにTrueを指定すると、LookInプロパティに指定したフォルダ配下のフォルダもすべて検索します。

Executeメソッドで検索して見つかった結果は、FoundFilesプロパティで取得するFoundFilesオブジェクトに格納されます。FoundFilesオブジェクトはコレクションのように扱えますので、FoundFiles.Countで見つかったファイルの件数がわかります。個々のファイルにアクセスするにはFoundFiles(1)のようにインデックスを指定します。ただし、FoundFilesオブジェクトから得られるのは、見つかったファイルのフルパス+ファイル名だけです。「C:\My Documents\test\Book1.xls」のような形です。ここからファイル名だけを求めるのでしたらDir関数で一発なのですが、上記のサンプルではパス名なども抜き出しています。それにはFileSystemObjectオブジェクトを使いました。FileSystemObjectオブジェクトについては「FileSystemObjectオブジェクトの使い方」をご覧ください。



[目次]に戻る