Я подготовил очень быстрый метод перемещения данных (используя массивы и работая в памяти), избегая копирования и вставки.
Скопируйте эти новые объявления в область ваших объявлений:
Dim sh As Worksheet, arrCopy As Variant, lastR As Long
Скопируйте эту строку кода перед l oop (For i = 1 To ...
):
Set sh = mainWorkbook.Sheets(mainWorkbook.Worksheets.count) 'You can use here your sheet where the data will be collected. I used the last sheet for easy testing reason
Заменить (в l oop For Each ...
) существующий код (tempWorkSheet.Copy after:=mainWorkbook.Sheets(mainWorkbook.Worksheets.Count)
) на следующий:
lastR = sh.Range("A" & sh.Rows.count).End(xlUp).row
arrCopy = tempWorkSheet.Range(tempWorkSheet.Range("A" & IIf(lastR = 1, 1, 2)), _
tempWorkSheet.Range("A1").SpecialCells(xlLastCell)).Value
sh.Range("A" & lastR + IIf(lastR = 1, 0, 1)).Resize(UBound(arrCopy, 1), _
UBound(arrCopy, 2)).Value = arrCopy
Мое решение скопирует все содержимое листа (включая заголовки) в случае пустого листа для сбора данных и после этого диапазона данных, начиная со второй строки.
Ваш полный код как и должно быть для работы (не проверено):
Sub mergeFiles()
'Define variables:
Dim numberOfFilesChosen, i As Integer
Dim tempFileDialog As FileDialog
Dim mainWorkbook, sourceWorkbook As Workbook
Dim sh As Worksheet, arrCopy As Variant, lastR As Long
Dim tempWorkSheet As Worksheet, lastRtemp As Long
Set mainWorkbook = Application.ActiveWorkbook
Set tempFileDialog = Application.FileDialog(msoFileDialogFilePicker)
'Allow the user to select multiple workbooks
tempFileDialog.AllowMultiSelect = True
numberOfFilesChosen = tempFileDialog.Show
'You can use here your sheet where the data will be collected. I used the last sheet for easy testing reason
Set sh = mainWorkbook.Sheets(mainWorkbook.Worksheets.count)
'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
Set tempWorkSheet = sourceWorkbook.Worksheets(1)
lastR = sh.Range("A" & sh.Rows.count).End(xlUp).row
lastRtemp = tempWorkSheet.Range("A" & tempWorkSheet.Rows.count).End(xlUp).row
If lastRtemp < 2 Then
MsgBox "The workbook " & tempWorkSheet.Name & " contains less the two rows..."
Else
arrCopy = tempWorkSheet.Range(tempWorkSheet.Range("A" & IIf(lastR = 1, 1, 2)), _
tempWorkSheet.Range("A1").SpecialCells(xlLastCell)).Value
sh.Range("A" & lastR + IIf(lastR = 1, 0, 1)).Resize(UBound(arrCopy, 1), _
UBound(arrCopy, 2)).Value = arrCopy
End If
'Close the source workbook
sourceWorkbook.Close
Next i
End Sub