2014-10-03 29 views
-1

我试图将旧的工作Excel VBA代码(可能写在VB 2003中)移植到较新的版本,但由于我以前没有使用VB的经验(以前没有使用它或了解它)我没有运气代替整个代码的一部分。
我有其他的编程语言的工作知识和告诉我的错误是下面的代码模块中:从Excel 2003中替换Application.FileSeach(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已经被微软弃用。
我有两个解决方案选项,用替换为Dir,另一个可能的解决方案是我忘记了。
因为我从来没有学过VB,所以我不能实现Dir方法来实现这个功能。如果有人只有几分钟,如果他们能够帮助我重写这个几乎没有的10行代码,那将是非常好的。

注:此模块占用dirname作为输入(这部分之前定义的),并设置两个全局变量nrFilesffilename()的值,这将是由代码的其余部分以后被使用。

我只是需要更换,会做同样的,而不是抛出异常喜欢Application.FileSearch

我已经尝试找到散落在互联网上的一些例子,但还没有多少运气实现它们。任何帮助将非常感激。

编辑我已经提到过,我几乎没有VB的工作知识,所以无论我尝试什么就像在1天试图学习西班牙语。 @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':
Property Let过程没有定义,属性获取过程未返回对象

编辑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的知识,所以我公开要求一个例子,会做同样的作为代码片段工作,设置一个整型变量和一个数组变量。我不需要弄明白,我已经提到过了!因此,如果你有时间或者在没有时间的情况下尝试提供实际的帮助,那么不要试图提出实际的帮助,而是试图暗示线程创建者不尝试(从未有过的经验或知识!)。我知道如何使用谷歌 @Blackhawk我这样做之前张贴在这里(或至少几乎相似的搜索字符串)。我建议你这样做,并阅读第5篇文章,每篇文章都展示了VB(我不知道的一种语言)上的40〜50行精美示例代码,并告诉我与我的问题有多大关系。我知道我可以在互联网上找到它!而且我使用我的基本知识工作,而不是在任何人的帮助下!这让我感到很难过,每个人都开始认识到这个问题。 如果你正在访问一个你不了解的语言的国家,幸运的是你有一个来自该国家的朋友,那么你走向他并要求他教你如何说水,食物,厕所,电话和其他非常重要的世界,以便您可以使用急需!而是你的朋友要求你在大学里参加一门语言的高级文学课?嗯,我只是觉得一样,有大量的建议要求我深入了解我没有事先知识!!!!这有帮助吗?我敢打赌,如果你对VB有足够的理解,那么你可以在几分钟内写出我写的(剽窃)!那么为什么要扮演神? 现在对于那些谁可能想知道我的立场是什么写这么多,那么,我和ECE毕业。我知道C,C++,C#,ASP,JavaScript,CUDA,HSpice,Verilog,Perl,Matlab和一些其他编程语言。我不会挑战任何人或炫耀。我从来没有学过VB,所以看着VB的风格对我来说是非常不舒服的,这就是为什么我决定问一下,以便可以有一个精确和紧凑的解决方法来替换Application.FileSearch(我没有找到足够的解释,可以启发某人没有VB的高级知识)!那么,我必须帮助自己!

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

+0

这是不相关的VB.NET;您可能还想向文本墙 – Plutonix 2014-10-03 13:05:26

+0

添加一些空格,感谢编辑,正如我所说的,我对宏/ vb没有任何知识或经验,所以我添加了自动建议的标记。但不知道你的意思是我用空白做什么。对不起,n00b。 – user2954612 2014-10-03 13:10:13

+1

FileSearch已从(我认为)Excel 2007中移除。您可能可以使用FileSystemObject来完成您想要的任务。这里的一些例子:http://stackoverflow.com/questions/3233203/how-do-i-use-filesystemobject-in-vba – Dave 2014-10-03 13:18:50

回答

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 
+0

嘿,谢谢你的解答,真的很感谢。我能够修改我的代码也可以工作。看看您的精致解决方案,我相信这会更好! – user2954612 2014-10-03 18:42:46

+0

@ user2954612这不是更好,它不同。 'Application.FileSearch'代码递归地遍历子文件夹,所以这个代码,而你的FSO代码只列出顶级文件。显然,这是你首先需要的,但是为什么你会拥有'.SearchSubFolders = True'。 – GSerg 2014-10-04 09:38:06