4

すべてのパス フォルダーを参照して "strings.xml" ファイルを検索する vba コードを作成しました。

Dim oFS As Office.FileSearch
Dim i As Integer
Set oFS = Application.FileSearch

With oFS
    .NewSearch
    .FileType = msoFileTypeAllFiles
    .Filename = "strings.xml"
    .LookIn = "D:\Workspace"
    .SearchSubFolders = True
    .Execute

    MsgBox "Finish ! " & .FoundFiles.Count & " item found !"
End With

ただし、私のワークスペースには、この現在のコードが見つける多くの「strings.xml」ファイルがありますが、特定のサブフォルダー内の「strings.xml」のみを検索したいです。例えば./values/strings.xml ファイル。

4

3 に答える 3

1

以下は、ルート作業フォルダーの下でValues\Strings.xml一致するものを再帰的に検索し、それらをScripting.Dictionaryオブジェクトにリストします。

メインのファイル/フォルダー検索は、単純なDir 関数によって実行されます。

Sub dir_ValuesStringsXML_list()
    Dim f As Long, ff As String, fp As String, fn As String, tmp As String
    Dim vfn As Variant, dFILEs As Object    'New scripting_dictionary

    Set dFILEs = CreateObject("Scripting.Dictionary")
    dFILEs.CompareMode = vbTextCompare

    'set vars for c:\temp\Workspace\*\Values\Strings.xml
    fp = Environ("TMP") & Chr(92) & "Workspace"
    ff = "Values"
    fn = "Strings.xml"
    dFILEs.Item(fp) = 0

    'get folder list
    Do
        f = dFILEs.Count
        For Each vfn In dFILEs
            If Not CBool(dFILEs.Item(vfn)) Then

                tmp = Dir(vfn & Chr(92) & Chr(42), vbDirectory)
                Do While CBool(Len(tmp))
                    If Not CBool(InStr(1, tmp, Chr(46))) Then
                        dFILEs.Item(vfn & Chr(92) & tmp) = 0
                    End If
                    tmp = Dir
                Loop
                'Debug.Print dFILEs.Count
                dFILEs.Item(vfn) = 1
            End If
        Next vfn
    Loop Until f = dFILEs.Count

    'remove the folders and check for Values\Strings.xml
    For Each vfn In dFILEs
        If CBool(dFILEs.Item(vfn)) Then
            If LCase(Split(vfn, Chr(92))(UBound(Split(vfn, Chr(92))))) = LCase(ff) And _
               CBool(Len(Dir(vfn & Chr(92) & fn, vbReadOnly + vbHidden + vbSystem))) Then
                dFILEs.Item(vfn & Chr(92) & fn) = 0
            End If
            dFILEs.Remove vfn
        End If
    Next vfn

    'list the files
    For Each vfn In dFILEs
        Debug.Print "from dict: " & vfn
    Next vfn

    dFILEs.RemoveAll: Set dFILEs = Nothing

End Sub

Scripting.Dictionary の遅延バインディングを事前バインディングに変換する場合は、Microsoft Scripting Runtimeを VBE のツール ► 参照に追加する必要があります。

于 2016-02-06T10:04:29.347 に答える
0

サブフォルダー「\values」でstrings.xmsというファイルを探したいと言っていると思います

それが正しい場合は、以下の修正されたコードを試してください。

Dim oFS As Office.FileSearch
Dim i As Integer
Set oFS = Application.FileSearch

With oFS
    .NewSearch
    .FileType = msoFileTypeAllFiles
    .Filename = "strings.xml"
    .LookIn = "D:\Workspace\values"
    .SearchSubFolders = True
    .Execute

    MsgBox "Finish ! " & .FoundFiles.Count & " item found !"
End With

もちろん、サブフォルダーを指定したくない場合もあります。

別のオプションを次に示します。

Dim sPath As String 
Dim sFil As String 
Dim strName As String 

sPath = "D:\Workspace\values" 'Change Path
sFil = Dir(sPath & "string.xml") 'All files in Directory matching name

Do While sFil <> "" 
    strName = sPath & sFil 
    sFil = Dir 
     'Your Code Here.
    i=i+1
Loop 

MsgBox "Finish ! " & .FoundFiles.Count & " item found !"

FileSystemObject を使用して、サブフォルダーのみを再帰的に検索することを検討しましたか?

MSDN - FileSystemObject を使用して再帰検索を行う方法

HTH

フィリップ

于 2013-03-11T13:05:01.387 に答える