Здесь есть несколько вещей, которые могут отбросить ваш макрос.
Во-первых, вы объявляете i
, j
и k
как тип данных «целочисленный»; проблема заключается в том, что наибольшее возможное значение, которое может иметь целое число, составляет 32 767. Если вы перейдете к этому, вы получите переполнение буфера.
Во-вторых, вы объявляете переменные, которые вы не используете, а не объявляете переменные, которые вы используете. Насколько я вижу, j
не используется нигде в коде, но используются finalrow
и finalrow2
, но не объявлены нигде.
Я бы посоветовал вам заменить ваши типы данных integer
, которые могут быть очень высокими с long
типами данных (длинное целое число). Вы также можете использовать более описательные имена для целых чисел, чтобы сделать код более удобным для чтения:
Dim iCycler as integer
Dim kStart as long
Dim FinalRow as Long
Dim FinalRow2 as Long
Запуск через это и посмотреть, что получится.
отредактирован ADD:
Вот полный процесс, который должен удовлетворить вас:
Sub Duplicator()
'Define the source file, sheet, and range
Dim wbkSource As Workbook
Dim shtSource As Worksheet
Dim rngSource As Range
'Define the target file, sheet and range
Dim wbkTarget As Workbook
Dim shtTarget As Worksheet
Dim rngTarget As Range
'Define the sheet with the list of countries
Dim shtControl As Worksheet
'Prepare control integers
Dim iLoop As Integer
Dim lLastRow As Long
'Define the target file as the active workbook
Set wbkTarget = ActiveWorkbook
Set shtTarget = wbkSource.Sheets("Output")
Set rngTarget = shtTarget.Range("A2")
Set shtControl = wbkTarget.Sheets("Names")
'Loop through the list
For iLoop = 1 To 50
'Open the source file and assign it to a variable.
Set wbkSource = Workbooks.Open("C:\path\" & shtControl.Cells(iLoop, 1).Value)
'Assign the source sheet
Set shtSource = wbkSource.Sheets("Main")
'Find the last row of data
lLastRow = shtSource.Range("A" & Rows.Count).End(xlUp).Row
'Use the last row to build a source range variable
Set rngSource = shtSource.Range("A1", "BL" & lLastRow)
'Check that there is space for the copy. If there is not, create a new sheet for the new data
If rngTarget.Row + lLastRow > shtTarget.Rows.Count Then
Set shtTarget = wbkTarget.Sheets.Add
shtTarget.Name = "Output 2"
Set rngTarget = shtTarget.Range("A2")
End If
'Use the size of rngSource to define the size of the target range
Set rngTarget = rngTarget.Resize(rngSource.Rows.Count, rngSource.Columns.Count)
'Duplicate the values over
rngTarget.Value = rngSource.Value
'Prepare the target range for the next loop
Set rngTarget = shtTarget.Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
'Close the source file
wbkSource.Close False
Next iLoop
End Sub
Объявив и использования переменных по всему, код должен быть проще и писать и читать. Он также должен работать быстрее, поскольку он использует структуру range1.value = range2.value
, которая обходит довольно медленный буфер обмена. Он также содержит проверку, чтобы убедиться, что вы не превзошли 1 048 576 строк данных, что может привести к сбою.
Попробуйте использовать что-то вдоль этих строк вместо копии pastespecial 'application.Workbooks (2) .ActiveSheet.range ("a1: c5"). Value = application.Workbooks (1) .ActiveSheet.range ("a1: c5"). Value' –
Мне жаль, что я не могу обернуть голову вокруг вашего предложения , Извинения –
вы также объявили переменные как целые числа, я не уверен, сколько строк вы собираетесь в консолидации, но если они превышают предел целых чисел 32767 в excel, он вернет ошибку переполнения, попробуйте объявить их как 'long' –