File searching in VBA

后端 未结 3 875
青春惊慌失措
青春惊慌失措 2020-12-21 01:29

I wrote a vba code that browse all path folder and search for \"strings.xml\" file.

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


        
相关标签:
3条回答
  • 2020-12-21 01:58

    The following will look recursively under your root working folder for Values\Strings.xml matches and list them in a Scripting.Dictionary object.

    The main file/folder search is performed by the simple Dir function.

    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
    

    If you wish to convert the late binding of the Scripting.Dictionary to early binding, you must add Microsoft Scripting Runtime to the VBE's Tools ► References.

    0 讨论(0)
  • 2020-12-21 02:15

    replace:

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

    with:

    sPath = "D:\Workspace\values\" 'Change Path
    sFil = Dir(sPath & "*.xl*") 'All files in Directory matching name
    
    0 讨论(0)
  • 2020-12-21 02:16

    I think you are saying that you want to look in the sub-folder "\values" for files called strings.xms

    If that's right, try the below amended code:

    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
    

    of course, you may not want to specify the sub-folder.

    Here is another option:

    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 !"
    

    Have you considered using the FileSystemObject to do a recursive search in a sub-folder only?

    MSDN - How to do a recursive search using the FileSystemObject

    HTH

    Philip

    0 讨论(0)
提交回复
热议问题