【发布时间】:2016-02-24 10:01:52
【问题描述】:
我构建了一个 Excel 宏,它从选定文件夹(包括任何子文件夹中的 XLS 文件)中的所有 XLS 文件中获取第一张工作表,并将工作表复制到新工作簿中的单个工作表上。该代码在大多数情况下似乎工作正常,我打算使用它将数千个 Excel 工作表合并到一个文件中。
但是问题是循环在某个时候停止工作,没有引发错误。有时是几百个文件,有时更多。但是这个过程似乎不可靠,我不知道为什么。
这是我的代码(我调用 Merge 宏,然后调用 DoFolder Sub):
Sub Merge()
Dim FileSystem As Object
Dim HostFolder As String
HostFolder = "C:\XLSfiles"
Set FileSystem = CreateObject("Scripting.FileSystemObject")
DoFolder FileSystem.GetFolder(HostFolder)
End Sub
Sub DoFolder(Folder)
Dim unusedRow As Long 'used for writing the file path info before each copied sheet
Dim path As String, ThisWB As String, lngFilecounter As Long
Dim wbDest As Workbook, shtDest As Worksheet, ws As Worksheet
Dim Filename As String, Wkb As Workbook
Dim CopyRng As Range, Dest As Range
Dim RowofCopySheet As Integer
RowofCopySheet = 2 ' Row to start on in the sheets you are copying from
ThisWB = ActiveWorkbook.Name
Set shtDest = ActiveWorkbook.Sheets(1)
Dim SubFolder
For Each SubFolder In Folder.SubFolders
DoFolder SubFolder
Next
Dim File
ActiveWindow.WindowState = xlMinimized
For Each File In Folder.Files
' Operate on each file
unusedRow = Cells.SpecialCells(xlCellTypeLastCell).Offset(1, 0).Row
If Not Filename = ThisWB Then
Set Wkb = Workbooks.Open(File)
Set CopyRng = Wkb.Sheets(1).Range(Cells(RowofCopySheet, 1),Cells(ActiveSheet.UsedRange.Rows.Count, ActiveSheet.UsedRange.Columns.Count))
Set Dest = shtDest.Range("A" & shtDest.UsedRange.SpecialCells(xlCellTypeLastCell).Row + 1)
CopyRng.Copy Dest
Wkb.Close False
End If
Cells(unusedRow, 1) = File
Application.StatusBar = File
Next
Range("A1").Select
End Sub
我错过了什么?
【问题讨论】:
-
根据您的描述,我认为您只是达到了工作表可以容纳的极限;此限制为 1,048,576 行 x 16,384 列。您希望实现的究竟是什么?对我来说,这听起来像是数据库而不是 Excel 工作表?
-
我不认为会是这样。每个 XLS 文件的数据行数不超过 50 行,列数不超过 30-40。所以它最多应该是 100K 行,永远不会超过 500K。
-
确切的目的是将几千个excel文件中的第一张表合并成一个excel文件。例如,如果我有 2000 个 Excel 文件,每个文件有 50 行数据,我的最终结果将是一个包含 2000 x 50 = 100K 行数据的 Excel 文件。
-
这就是您在帖子中描述的内容,但这不是确切的目的。 为什么你这样做?我想这是为了评估/整合各种数据。对吗?