搜索包含文件夹和子文件夹中特定扩展名的所有文件

时间:2014-06-20 13:18:43

标签: excel excel-vba file-io vba

我理解这个问题的答案可能与另一个问题的答案类似,但这个问题是以不同的方式提出的。这个问题是基于这样一个事实,即用户,我不知道FileSearch被删除了。另一个是基于概念的,包含excel 2010年变更的先验知识......

我找到了一些代码here

Sub Search()
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
End Sub

我试图在我的机器上运行该代码,它适应我的一个文件夹和文件夹中的扩展,但它返回了错误445(对象不支持此操作)。我正在使用excel 2010。

有谁知道发生了什么事?我正在尝试帮助一个同事,但除了VBA中的简单内容之外,我对File I / O知之甚少。

2 个答案:

答案 0 :(得分:1)

FileSearch已从Office 2007中的VBA中删除。值得庆幸的是,使用FileSystemObject创建自己的例程来搜索文件并不困难(添加Windows Scripting Runtime作为获取Intellisense代码提示的参考)

这是我使用的那个 - 你的文件列表将由FileList函数作为Collection返回。为此添加过滤器应该很简单,只使用特定扩展名的文件填充集合。

[请注意,您需要添加上面提到的Windows Scripting Runtime引用,因为在我的示例中对象是早期绑定的]

Function FileList(Path As String) As Collection

    Dim FSO as New Scripting.FileSystemObject
    Dim StartingFolder As Scripting.Folder
    Set StartingFolder = FSO.GetFolder(Path)

    Set FileList = New Collection
    RecursiveGetFiles StartingFolder, FileList

End Function


Private Sub RecursiveGetFiles(StartingFolder As Scripting.Folder, ByRef FullFileList As Collection)

    Dim File As Scripting.File
    For Each File In StartingFolder.Files
        FullFileList.Add File, File.Path
    Next File

    Dim SubFolder As Scripting.Folder
    For Each SubFolder In StartingFolder.SubFolders
        RecursiveGetFiles SubFolder, FullFileList
    Next SubFolder

End Function

然后可以通过某些父例程调用此代码,即

Sub Search(Path As String)

     Dim ListOfFiles As Collection
     Set ListOfFiles = FileList(Path)

     Dim File As Scripting.File
     For Each File In ListOfFiles
         Debug.Print File.Name
     Next File

End Sub

答案 1 :(得分:1)

Sub Search()
Dim StrFile As String, Path As String, FileName As String

Path = "D:\Music"
FileName = "*.wma"
StrFile = Dir(Path & FileName)
Do While Len(StrFile) > 0
    Msgbox StrFile 
    StrFile = Dir
Loop
End Sub