在文件夹中循环导致堆栈空间不足



我正在把几百本工作簿合并成一本书。

我不需要从每一本工作簿中得到太多,但我必须深入研究每一本。

每个工作簿都在一个文件夹中,该文件夹以生成报告的年份命名。这些年份文件夹位于"主"文件夹中。

我需要循环浏览年份文件夹,然后跳到该文件夹中的每个工作簿中。我会获取我需要的信息,并将其放在"主工作簿"中。

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

使用VBA 循环浏览所有子文件夹

我得到了一个无效的外部程序,所以我修改了我的代码,使所有代码都在子中

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

这是我目前掌握的代码。

Sub DoFolder(Folder)
Dim FileSystem As Object
Dim HostFolder As String
Application.EnableEvents = False
HostFolder = "C:Users27659Desktoptemp 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 namepublicOrganizational Developmentmy nameOpen ProjectsProject 1 Milling ImprovementsPast DataPast 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

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

然而,试图修复最初无效的外部过程错误的方法只是在定义HostFolder之后立即重复调用DoFolder函数(并且没有办法不递归地调用自己或完成当前迭代——这就是导致Out of Stack Space错误的原因(。

在我下面包含的代码中,您可以看到如何有一个函数/sub用于定义初始文件夹并执行初始函数调用,而DoFolder函数/sub则具有实际的递归和所需的文件夹操作。

此外,如果在从文件夹中提取数据后需要执行代码(即每个代码运行一次,而不是每个文件夹一次(,请确保不要将其包含在DoFoldersub中。相反,可以在调用RunDoFoldersub后使用它,也可以在DoFolder调用后在RunDoFolder中使用它。(或者在使用任何代码调用DoFoldersub之后(

Sub RunDoFolder()
Dim FileSystem As Object
Dim HostFolder As String
Application.EnableEvents = False
HostFolder = "C:Users27659Desktoptemp 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 namepublicOrganizational Developmentmy nameOpen ProjectsProject 1 Milling ImprovementsPast DataPast 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

最新更新