我试图将一个旧的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
作为输入(在此部分之前定义)并设置两个全局变量nrFiles
和ffilename()
的值,稍后将通过其余代码使用。
我只需要一个可以做同样的替换,而不是像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的高级知识)!好吧,我必须自己帮忙!
主持人请关闭主题。** 无论如何,谢谢大家。
答案 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