Я хотел был бы скопировать около 30k строк (точнее, только некоторые элементы строк) из листа A в лист B, начиная назначение из строки № 36155. Иногда , мы копируем строку более одного раза, в зависимости от числа в столбце G. Это макрос, который я написал:Копирование большого количества данных в VBA excel
Sub copy()
ActiveSheet.DisplayPageBreaks = False
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculate
Dim k As Long, k1 As Long, i As Integer
k = 36155
k1 = 30000
For i = 1 To k1
For j = 1 To Sheets("A").Range("G" & i + 2).Value
Sheets("B").Range("A" & k).Value = Sheets("A").Range("A" & i + 2).Value
Sheets("B").Range("B" & k).Value = Sheets("A").Range("B" & i + 2).Value
Sheets("B").Range("C" & k).Value = j
Sheets("B").Range("D" & k).Value = Sheets("A").Range("C" & i + 2).Value
Sheets("B").Range("E" & k).Value = Sheets("A").Range("D" & i + 2).Value
Sheets("B").Range("F" & k).Value = Sheets("A").Range("E" & i + 2).Value
Sheets("B").Range("G" & k).Value = Sheets("A").Range("F" & i + 2).Value
Sheets("B").Range("H" & k).Value = Sheets("A").Range("I" & i + 2).Value + (j - 1) * Sheets("A").Range("H" & i + 2).Value
Sheets("B").Range("I" & k).Value = Sheets("A").Range("J" & i + 2).Value
k = k + 1
Next j
Next i
Application.EnableEvents = True
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub
К сожалению, для этого макроса требуется много времени (около 10 минут). У меня такое чувство, что может быть лучший способ сделать это. У вас есть идеи, как мы можем зачаровать макрос?
Первое, что вы могли бы попробовать - выключить автоматический калькулятор перед циклом и установить, если он включен после него. Это может сэкономить вам много времени. – FDavidov
Кстати, сколько раз (в среднем) вы копируете одну и ту же запись (т. Е. Среднее число раз, когда внутренний цикл работает для каждого цикла внешнего цикла)? – FDavidov
Используйте технику «Variant Array». Существует много примеров на SO –