Цикл копирует отформатированные участки кода и вставляет их x раз. Делать это менее 10 раз быстро, но оно быстро начинает замедляться до точки, где около 60 или около того требуется около секунды для каждой вставки, и оттуда продолжает замедляться. Что может быть причиной того, что он становится все медленнее?
While x < num
Debug.Print ("Running: " & x)
With Sheets(inoc)
.Activate
.Rows("12:15").Select
Selection.Copy
Selection.Insert Shift:=xlDown
End With
With Sheets(count)
.Activate
.Rows("17:28").Select
Selection.Copy
Selection.Insert Shift:=xlDown
.Range("C29").Value = "='Inoculation and Incubation'!B17"
End With
x = x + 1
Application.CutCopyMode = False
Wend
Кстати, While...Wend обычно считается устаревшим.


Из комментариев:
While...Wendобычно считается устаревшим.
Dim i As Long
For i = x to num
Debug.Print "Running: " & i
With Sheets(inoc).Rows("12:15")
.Copy
.Insert Shift:=xlDown
End With
With Sheets(count).Rows("17:28").
.Copy
.Insert Shift:=xlDown
End With
Sheets(count).Range("C29").Value = "='Inoculation and Incubation'!B17"
Application.CutCopyMode = False
Next i
Что касается того, почему он становится медленнее:
Каждый раз, когда кто-то пробивает стену между vba и рабочими листами, он немного замедляется. Эта медлительность начинает накапливаться внутри цикла. С тем, что вы пытаетесь сделать (копировать/вставить), мы не можем сделать больше, чтобы сделать это быстрее или преодолеть эту сложную медлительность. Вероятно, это связано с тем, что Excel должен перерисовывать xml в каждом цикле, и при сохранении этой информации в памяти требуется обрабатывать все больше и больше данных, а затем перерисовывать xml.
Использование обязательных настроек (ScreenUpdate, EnableEvents, Calculation) может помочь и в этом случае. См. например stackoverflow.com/a/47092175/7599798
Спасибо, это, безусловно, заставляет его работать быстрее, однако это не решает проблему постепенного замедления с течением времени. Каждая итерация занимает больше времени, чем предыдущая.
@BigBen У меня уже отключено обновление экрана и события ранее в коде. Я пытался вычислить вручную, но это фактически привело к сбою.
@ConnorBaush Каждый раз, когда кто-то пробивает стену между vba и рабочими листами, он немного замедляется. Эта медлительность начинает накапливаться внутри цикла. С тем, что вы пытаетесь сделать (копировать/вставить), мы не можем сделать больше, чтобы сделать это быстрее или преодолеть эту сложную медлительность. Вероятно, это связано с тем, что Excel должен перерисовывать xml в каждом цикле, и при сохранении этой информации в памяти требуется обрабатывать все больше и больше данных, а затем перерисовывать xml.
@ScottCraner Я думаю, что тогда это почти покрывает это. Я бы сказал, что это важно для полного ответа на мой вопрос, если вы хотите добавить его к фактическому ответу.