Предотвратить постепенное замедление цикла VBA While

Цикл копирует отформатированные участки кода и вставляет их 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 обычно считается устаревшим.

BigBen 13.06.2023 18:03
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
2
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Из комментариев:

Избегайте использования .Activate и .Select.

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

FunThomas 13.06.2023 18:49

Спасибо, это, безусловно, заставляет его работать быстрее, однако это не решает проблему постепенного замедления с течением времени. Каждая итерация занимает больше времени, чем предыдущая.

Connor Baush 13.06.2023 19:01

@BigBen У меня уже отключено обновление экрана и события ранее в коде. Я пытался вычислить вручную, но это фактически привело к сбою.

Connor Baush 13.06.2023 19:15

@ConnorBaush Каждый раз, когда кто-то пробивает стену между vba и рабочими листами, он немного замедляется. Эта медлительность начинает накапливаться внутри цикла. С тем, что вы пытаетесь сделать (копировать/вставить), мы не можем сделать больше, чтобы сделать это быстрее или преодолеть эту сложную медлительность. Вероятно, это связано с тем, что Excel должен перерисовывать xml в каждом цикле, и при сохранении этой информации в памяти требуется обрабатывать все больше и больше данных, а затем перерисовывать xml.

Scott Craner 13.06.2023 19:20

@ScottCraner Я думаю, что тогда это почти покрывает это. Я бы сказал, что это важно для полного ответа на мой вопрос, если вы хотите добавить его к фактическому ответу.

Connor Baush 13.06.2023 19:31

Другие вопросы по теме