我在运行递归搜索多个文件夹中多个文件中的某些文本时遇到问题。下面的代码是我到目前为止的代码。这两个案例是为了帮助限制搜索。当我试图从用户那里搜索文本时,问题就来了。我无法将变量传递给另一个子。在下面设置它的方式,当我以递归方式调用getfiles子时,编辑器给出了一个错误(我假设因为我无法通过错误读取的方式使用“call”)。
如果我取出第二个变量“theString”,作为传递变量和硬编码到getfiles子中的东西,这很好用。如果我尝试在getfiles子中询问问题,它会一遍又一遍地弹出,因为它是递归的。
有没有办法提出问题并将变量传递给循环?
Sub somesub()
Dim theComp As String
Comp = InputBox("Enter 1 for CDL or 2 for MDF.", "Company")
Select Case Comp
Case Is = 1
theComp = "CDL"
Case Is = 2
theComp = "MDF"
End Select
theString = InputBox("Enter the accession #", "Accession")
path = "F:\Finance & Accounting\Revenue Services\HL7 archive\2015\" & theComp
Call getfiles(path, theString)
End Sub
Sub getfiles(ByVal path As String, ByVal theString As String)
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim folder As Object
Set folder = fso.GetFolder(path)
Dim subfolder As Object
Dim file As Object
Dim path2 As String
theString2 = theString
Do While path <> ""
For Each subfolder In folder.SubFolders
**getfiles (subfolder.path, theString2)**
Next subfolder
For Each file In folder.Files
path2 = file.path
Set filestuff = fso.OpenTextFile(path2)
Do While Not filestuff.AtEndOfLine
line = filestuff.ReadLine
If InStr(1, line, theString, vbTextCompare) > 0 Then
Debug.Print path2
Exit Do
End If
Loop
Next file
filestuff.Close
Set fso = Nothing
Set folder = Nothing
Set subfolder = Nothing
Set file = Nothing
Loop
End Sub
答案 0 :(得分:0)
我认为有一些问题可能导致错误。
首先,您需要将filestuff.close行移动到每个文件循环中,就在“下一个文件”之前。这样,在完成后关闭每个文件。在当前代码中,每个文件都保持打开状态 - 不确定VBA是否会自动为您关闭它们,或者这些文件是否会被孤立。
其次,是Do / While循环。你到底想要做什么?如果你只在文本文件的第一行寻找“theString”,那么摆脱循环,只需读取第一行,查找匹配,如果匹配则写入outpt,关闭文件,然后重复For Each循环。如果你在整个文件中寻找“theString”,那么我认为你需要“Do While Not filestuff.AtEndOfStream”而不是endofline。
附录:
好的,这是真正的问题:
您使用根路径调用getfiles。然后调用第一个子文件夹的getfiles,然后是第一个子文件夹等,直到你到达底部文件夹。没有其他子文件夹的文件夹。
对getfiles的调用会跳过子文件夹循环,因为没有子文件夹。然后它循环遍历文件循环,一切都很好。处理完所有文件后,循环退出。所有对象都设置为空。
然后会发生什么? LOOP语句结束,并检查返回路径&lt;&gt;“”。它没有(因为路径仍然相同)。所以循环重复,并再次尝试子文件夹检查。但现在,所有对象都设置为空。所以它失败了。
解决方案?摆脱路径&lt;&gt;“”的Do / Loop。你永远不需要在这里循环 - 你首先循环所有子文件夹,然后循环所有文件。一旦你这样做,你就完成了。将对象设置为空,并结束子。递归会让你回到下一个更高的级别,然后继续。