gpt4 book ai didi

excel - 带有用户输入变量的递归循环

转载 作者:行者123 更新时间:2023-12-04 21:03:32 25 4
gpt4 key购买 nike

我在对多个文件夹中的多个文件中的某些文本进行递归搜索时遇到问题。下面的代码是我到目前为止所拥有的。这两种情况是为了帮助限制搜索。当我试图从用户那里获取要搜索的文本时,问题就来了。我无法将变量传递给另一个子。按照下面的设置方式,当我递归调用 getfiles 子时,编辑器给了我一个错误(我假设是因为我无法通过读取错误的方式使用“调用”)。

如果我取出第二个变量“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

最佳答案

我认为有一些问题可能会导致错误。

首先,您需要将 filestuff.close 行移动到 for each file 循环中,就在“下一个文件”之前。这样,您在完成后关闭每个文件。在当前代码中,每个文件都保持打开状态——不确定 VBA 是否会自动为您关闭它们,或者这些文件是否会成为孤立文件。

其次,是 Do/While 循环。你到底想在那里做什么?如果您仅在文本文件的第一行中查找“theString”,则摆脱循环,只需读取第一行,查找匹配项,如果匹配则写入输出,关闭文件,然后重复For Each 循环。如果您在整个文件中寻找“theString”,那么我认为您需要“Do While Not filestuff.AtEndOfStream”而不是 endofline。

附录:

好的,这是真正的问题:

您使用根路径调用 getfiles 。然后为第一个子文件夹调用 getfiles,然后调用第一个子文件夹等,直到到达底部文件夹。没有其他子文件夹的文件夹。

对 getfiles 的调用会跳过子文件夹循环,因为没有子文件夹。然后它循环文件循环,一切都很好。处理完所有文件后,循环退出。您的所有对象都设置为空。

然后会发生什么? LOOP 语句结束,并检查是否 path<>""。它没有(因为路径仍然相同)。所以循环重复,并再次尝试子文件夹检查。但是现在,您的所有对象都设置为空。所以它失败了。

解决方案?摆脱路径<>“”的Do/Loop。你永远不需要在这里循环——你首先循环所有的子文件夹,然后循环所有的文件。一旦你这样做了,你就完成了。将对象设置为空,然后结束子。递归将使您回到下一个更高级别,然后继续。

关于excel - 带有用户输入变量的递归循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30878209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com