我正在将几百本工作簿合并为一本书。
每本工作簿都不需要很多,但我必须仔细阅读每一本。
每个工作簿都位于一个文件夹中,该文件夹名为报告的年份。这些年份文件夹位于“主”文件夹中。
我需要遍历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
答案 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