【发布时间】:2020-06-03 07:58:51
【问题描述】:
我正在尝试将 250 个数据库 Excel 工作簿合并到一个连续的工作表中。
所有工作簿都具有相同类型的数据,具有相同的标题。
我已尝试使用此 VBA 代码:
Sub mergeFiles()
'Merges all files in a folder to a main file.
'Define variables:
Dim numberOfFilesChosen, i As Integer
Dim tempFileDialog As fileDialog
Dim mainWorkbook, sourceWorkbook As Workbook
Dim tempWorkSheet As Worksheet
Set mainWorkbook = Application.ActiveWorkbook
Set tempFileDialog = Application.fileDialog(msoFileDialogFilePicker)
'Allow the user to select multiple workbooks
tempFileDialog.AllowMultiSelect = True
numberOfFilesChosen = tempFileDialog.Show
'Loop through all selected workbooks
For i = 1 To tempFileDialog.SelectedItems.Count
'Open each workbook
Workbooks.Open tempFileDialog.SelectedItems(i)
Set sourceWorkbook = ActiveWorkbook
'Copy each worksheet to the end of the main workbook
For Each tempWorkSheet In sourceWorkbook.Worksheets
tempWorkSheet.Copy after:=mainWorkbook.Sheets(mainWorkbook.Worksheets.Count)
Next tempWorkSheet
'Close the source workbook
sourceWorkbook.Close
Next i
End Sub
代码工作正常,但它为每个工作簿创建一个新工作表,而不是将数据复制到 1 个工作表的底行。
【问题讨论】:
-
它的行为与代码设计的完全一样:
tempWorkSheet.Copy after:=mainWorkbook.Sheets(mainWorkbook.Worksheets.Count)... 您需要获取页面内容并将其删除。每次,在最后一行数据之后。我避免了“复制”,因为它不是最好的方法……那么,您是否希望将工作表内容从第二行复制到包含数据的最后一行?它的所有列都填充到同一行?如果不是,哪些被视为参考(最长)? -
要记住的一点是 Excel 对每张工作表的行数限制。如果超过了,就会报错。
-
工作簿的行数不同。所以我有工作簿:'Fleet A' 列 A 到 G 充满了汽车信息,如 VIN 型号等。工作簿车队 A 可能包含 50 辆汽车(行),工作簿车队 B 可能包含 5000 辆汽车。我想将所有工作簿合并成一个连续的汽车文件(行)
-
@AndreasKamper:我的问题不同......让我换个说法:在'Fleet A'中,所有列都填充了同一行的数据?我的意思是,如果我计算 A:A 列的最后一个空行,那是否正确?除此之外,如果您的工作表中将移动数据的主工作簿中的工作表为空(可能是第一次),则标题也将被复制。从第二个文件开始,要移动的范围将从第二行(标题除外)开始到保存数据的最后一行(即使这个文件与另一个文件不同)。 我的理解正确吗?
-
没错