vba VBA中的文件搜索

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/15339006/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-08 15:07:18  来源:igfitidea点击:

File searching in VBA

excelvbaexcel-vbadir

提问by ARM

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

我写了一个 vba 代码来浏览所有路径文件夹并搜索“strings.xml”文件。

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

However, in my workspace I have many "strings.xml" files that this current code locates and but I only want to find the "strings.xml" within a specific subfolder; e.g. ./values/strings.xmlfiles.

但是,在我的工作区中,我有许多当前代码定位的“strings.xml”文件,但我只想在特定子文件夹中找到“strings.xml”;例如./values/strings.xml文件。

回答by ARM

The following will look recursively under your root working folder for Values\Strings.xmlmatches and list them in a Scripting.Dictionaryobject.

以下内容将在您的根工作文件夹下递归查找Values\Strings.xml匹配项,并将它们列在Scripting.Dictionary对象中。

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

主要文件/文件夹搜索由简单的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


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

如果您希望将 Scripting.Dictionary 的后期绑定转换为早期绑定,您必须将Microsoft Scripting Runtime添加到 VBE 的工具中?参考。

回答by Our Man in Bananas

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

我想你是说你想在子文件夹“\values”中查找名为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?

您是否考虑过使用 FileSystemObject 仅在子文件夹中进行递归搜索?

MSDN - How to do a recursive search using the FileSystemObject

MSDN - 如何使用 FileSystemObject 进行递归搜索

HTH

HTH

Philip

菲利普

回答by user3201590

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