遍历文件夹导致堆栈空间不足

时间:2018-10-29 17:44:58

标签: excel vba

我正在将几百本工作簿合并为一本书。

每本工作簿都不需要很多,但我必须仔细阅读每一本。

每个工作簿都位于一个文件夹中,该文件夹名为报告的年份。这些年份文件夹位于“主”文件夹中。

我需要遍历Year文件夹并跳入该文件夹中的每个工作簿。我将获取所需的信息,并将其放入“主工作簿”中。

在这个问题中有人建议我使用此递归函数。

Loop Through All Subfolders Using VBA

我的外部程序无效,因此我修改了代码,使所有代码都在子程序内。

我现在拥有的代码是一个测试代码,它在我在包含5个文件夹的桌面上创建的测试文件夹中查找。 5个中的每一个都包含2个工作簿。它给了我一个栈外空间错误,并突出显示了行DoFolder FileSystem.GetFolder(HostFolder)

这是我到目前为止的代码。

Sub DoFolder(Folder)
    Dim FileSystem As Object
    Dim HostFolder As String

    Application.EnableEvents = False

    HostFolder = "C:\Users\27659\Desktop\temp test folder"

    Set FileSystem = CreateObject("Scripting.FileSystemObject")

    DoFolder FileSystem.GetFolder(HostFolder)

    Dim i As Long
    Dim wb As Workbook
    Dim ws As Worksheet

    Set wb = Application.Workbooks("\\drive name\public\Organizational Development\my name\Open Projects\Project 1 Milling Improvements\Past Data\Past Data Collection and Summary Book Start 10_29_2018.xlsm")
    Set ws = wb("Sheet1")

    i = 9

    Dim SubFolder
    For Each SubFolder In Folder.SubFolders
        DoFolder SubFolder
    Next
    Dim File
    For Each File In Folder.Files
        Folder.Files.Open
        wb.ws.Cells(i, 2).Value = ActiveWorkbook.Worksheets(1).Cells(1, 1).Value
        i = i + 1
    Next

    Application.EnableEvents = True

End Sub

1 个答案:

答案 0 :(得分:1)

问题行(DoFolder FileSystem.GetFolder(HostFolder))是调用以运行子DoFolder。在链接到的答案示例中,有一些示例代码说明如何调用该函数,其后是函数本身。当然,用于调用该函数的示例代码未包装在单独的子函数中,因此不会按编写的方式运行。

但是,试图解决原始无效外部过程错误的方法只是在定义了DoFolder之后立即重复调用HostFolder函数(而且无法递归调用自身或完成操作)当前迭代-导致Out of Stack Space错误的原因。

在下面提供的代码中,您可以看到如何使用一个函数/子来定义初始文件夹并进行初始函数调用,以及DoFolder函数/子中是否包含实际的递归和文件夹操作必需。

此外,如果您要从文件夹中提取数据后想要执行代码(即每个代码运行一次,而不是每个文件夹一次),请确保您不要 DoFolder子。而是在调用RunDoFolder子之后或在RunDoFolder调用之后的DoFolder 之后使用它。 (或者在您用来调用DoFolder子代码的任何代码之后)

Sub RunDoFolder()
    Dim FileSystem As Object
    Dim HostFolder As String

    Application.EnableEvents = False

    HostFolder = "C:\Users\27659\Desktop\temp test folder"

    Set FileSystem = CreateObject("Scripting.FileSystemObject")

    DoFolder FileSystem.GetFolder(HostFolder)
End Sub


Sub DoFolder(Folder)

    Dim i As Long
    Dim wb As Workbook
    Dim ws As Worksheet

    Set wb = Application.Workbooks("\\drive name\public\Organizational Development\my name\Open Projects\Project 1 Milling Improvements\Past Data\Past Data Collection and Summary Book Start 10_29_2018.xlsm")
    Set ws = wb("Sheet1")

    i = 9

    Dim SubFolder
    For Each SubFolder In Folder.SubFolders
        DoFolder SubFolder
    Next
    Dim File
    For Each File In Folder.Files
        Folder.Files.Open
        wb.ws.Cells(i, 2).Value = ActiveWorkbook.Worksheets(1).Cells(1, 1).Value
        i = i + 1
    Next

    Application.EnableEvents = True

End Sub