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

标签 excel recursion vba

我在对多个文件夹中的多个文件中的某些文本进行递归搜索时遇到问题。下面的代码是我到目前为止所拥有的。这两种情况是为了帮助限制搜索。当我试图从用户那里获取要搜索的文本时,问题就来了。我无法将变量传递给另一个子。按照下面的设置方式,当我递归调用 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/

相关文章:

image - Excel VBA自定义函数从URL故障插入图像

haskell - 如何在 haskell 中正确输入可选参数

javascript - JavaScript 中的直接递归和相互递归

excel - 包含 Lastrow 的 SUMIF 公式

javascript - 在 CSV/Excel 文件的单元格上运行 javascript 函数

vba - 循环浏览文件夹中的文件并复制/粘贴到主文件

excel - 将多个 csv 文件合并到一张 Excel 工作表中

excel - 如何在maatwebsite中获取excel数组

Python 递归列表( pop 与 [ ] )

excel - 如何绕过在外循环的每次迭代中分配内循环中的每个变量