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

时间:2015-06-16 21:06:57

标签: excel-vba recursion vba excel

我在运行递归搜索多个文件夹中多个文件中的某些文本时遇到问题。下面的代码是我到目前为止的代码。这两个案例是为了帮助限制搜索。当我试图从用户那里搜索文本时,问题就来了。我无法将变量传递给另一个子。在下面设置它的方式,当我以递归方式调用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

1 个答案:

答案 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。你永远不需要在这里循环 - 你首先循环所有子文件夹,然后循环所有文件。一旦你这样做,你就完成了。将对象设置为空,并结束子。递归会让你回到下一个更高的级别,然后继续。