从Excel 2003替换Application.FileSearch(VBA)

时间:2014-10-03 12:58:37

标签: excel vba excel-vba excel-2003

我试图将一个旧的Excel VBA代码(可能是用VB 2003编写)移植到更新的版本,但由于我以前没有使用VB的经验(从未使用过它或者学过它)我没有运气更换部件整个代码。
我确实有其他编程语言的工作知识,并告诉我错误在以下代码模块中:

Set fs = Application.FileSearch
With fs
    .LookIn = dirname
    .Filename = "*.*"
    .SearchSubFolders = True
    If .Execute > 0 Then
        nrFiles = .FoundFiles.Count
        For i = 1 To nrFiles
            ffilename(i) = .FoundFiles(i)
        Next i
    Else
        'MsgBox "There were no files found."
    End If
End With

在网上挖掘后,我发现微软已弃用Application.FileSearch 我有两个解决方法选项,用Application.FileSearch替换Dir和我忘记的另一个可能的解决方案 由于我从未学过VB,因此我无法实现Dir方法来实现该功能。如果有人只有几分钟,如果他们可以帮我重写这个几乎没有10行代码那就太好了。

注意:此模块将dirname作为输入(在此部分之前定义)并设置两个全局变量nrFilesffilename()的值,稍后将通过其余代码使用。

我只需要一个可以做同样的替换,而不是像Application.FileSearch

那样抛出异常

我已经尝试过在互联网上散布的一些例子,但实施它们并没有太多运气。任何帮助都会非常感激。

编辑我已经提到我几乎有0个VB的工作知识,所以无论我想尝试的是在一天内尝试学习西班牙语。 @Ken White 这是我到目前为止所做的以及我得到的例外情况。

Dim objFSO As Object
Dim objFolder As Object
Dim objFile As Object
Dim i As Integer

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(dirname)
If objFolder.Files.Count > 0 Then
    nrFiles = objFolder.Files.Count
    i = 1
    For Each objFile In objFolder.Files
        ffilename(i) = objFile.Name(i)
        i = i + 1
    Next objFile
Else
    'MsgBox "There were no Files found."
End If

错误

  

运行时错误'451':
  属性let过程未定义,属性get过程没有返回对象

编辑2:
将我的代码更改为

Dim objFSO As Object
Dim objFolder As Object
Dim objFile As Object
Dim i As Integer

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(dirname)
If objFolder.Files.Count > 0 Then
    nrFiles = objFolder.Files.Count
    i = 1
    For Each objFile In objFolder.Files
        ffilename(i) = objFile  ''<-Change is here''
        i = i + 1
    Next objFile
Else
    'MsgBox "There were no Files found."
End If

像魅力一样工作。它现在有效。
所有人都试图指出帖子的两面性并指出我不自己的工作
我在开始时写道,我对VB有0知识,所以我公开要求一个例子,它可以完成与代码片段相同的工作,设置一个整数变量和一个数组变量。我已经提到过,我们无需考虑这一点!所以,不要张贴建议行,并试图蔑视线程创建者没有尝试(他从未有过的经验或知识!)下次尝试提供实际帮助,如果你有时间或继续前进,如果没有。 我知道如何使用Google   @Blackhawk 我在发布之前就这样做了(或者至少差不多类似的搜索字符串)。我建议你这样做并阅读前5篇文章,每篇文章在VB上显示40~50行精美的示例代码(一种我不知道的语言)并告诉我与我的问题有多少关系。我知道我可以在互联网上找到它!我用我的基本知识工作,而不是在任何人的帮助下!让每个人开始认识到这个问题让我很难过。 如果你正在访问一个语言不为人所知的国家,幸运的是你有一个来自那个国家的朋友,你走到他那里,让他教你如何说水,食物,厕所,电话和其他非常重要的世界,以便您可以在急需使用!相反,你的朋友要求你在一所大学里学习该语言的一个学期的高级文学课?嗯,我只是觉得一样,有很多建议要求我深入了解我以前没有的知识! !这有什么用?我敢打赌,如果你对VB有足够的了解,那么你可以在几分钟内写下我写的(抄袭)!那为什么要玩神? 现在对于那些可能会怀疑的人我的立场写得这么多,嗯,我和ECE毕业。我知道C,C ++,C#,ASP,JavaScript,CUDA,HSpice,Verilog,Perl,Matlab以及其他一些编程语言。我不是在挑战任何人或炫耀他们。我从来没有学过VB,所以看看VB的样式对我来说非常不舒服,这就是为什么我决定要求更换Application.FileSearch(我找不到足够的解释可以启发某人)的确切而紧凑的解决方法没有VB的高级知识)!好吧,我必须自己帮忙!

主持人请关闭主题。** 无论如何,谢谢大家。

1 个答案:

答案 0 :(得分:0)

Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")

nrFiles = ListContents(fso, fso.GetFolder(dirName), 0)

If nrFiles = 0 Then
  'MsgBox "There were no Files found."
End If
Private Function ListContents(ByVal fso As Object, ByVal root As Object, ByVal index As Long) As Long
  Dim f As Object 'File
  For Each f In root.Files
    index = index + 1
    'Debug.Print index, fso.BuildPath(root.Path, f.Name)
    ffilename(index) = fso.BuildPath(root.Path, f.Name)
  Next

  Dim d As Object 'Folder
  For Each d In root.SubFolders
    index = ListContents(fso, d, index)
  Next

  ListContents = index
End Function