Добавление / удаление строк без обычного метода копирования и вставки - PullRequest
0 голосов
/ 30 мая 2020

У меня в модели Excel 60 блоков вычислений. На основании определенных критериев модель сгенерирует 2 числа. Один определяет количество строк, которые нужно добавить, а другой определяет количество строк, которые нужно удалить.

На основании этих двух чисел я должен ЛИБО добавить ИЛИ удалить строки в каждый из 60 блоков вычислений. Таким образом, для каждого блока будут добавлены или удалены строки, но не то и другое вместе. Я создал имена диапазонов для каждого блока в форме «Проверить» и «а», где «а» идет от 1 до 60. Эти диапазоны содержат либо добавление, либо номер удаления. Мы также создали еще один набор из 60 имен диапазонов с именем «PStart» & 'a', чтобы получить начальную ячейку каждого блока расчета.

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

Есть ли другой способ сделать это, чтобы ускорить процесс? Спасибо за помощь!

        Dim Rows, a As Long
        Dim rng, prng, sheetnm_rng As String

        For a = 1 To 60
        rng = "Check" & a
        prng = "PStart" & a
        sheetnm_rng = Range(rng).Parent.Name
        Rows = Range(rng).Value

        If Rows > 0 Then
            Sheets(sheetnm_rng).Range(prng).End(xlDown).EntireRow.Copy
            Sheets(sheetnm_rng).Range(prng).End(xlDown).EntireRow.Offset(1, 0).Resize(Rows).Insert shift:=xlDown
        ElseIf Rows < 0 Then
            Sheets(sheetnm_rng).Range(prng).End(xlDown).Offset(Rows + 1).Resize(-Rows).EntireRow.Delete
        End If
        Next a

1 Ответ

0 голосов
/ 31 мая 2020

Я нашел вот это, что может вам пригодиться:

https://www.quora.com/What-steps-can-I-take-to-speed-up-for-loops-in-Excel-VBA

пункты 3 и 4 кажутся важными для вашего случая.

3.- Если вы используете старую версию Excel, отключите обновление экрана в начале кода и не пытайтесь снова включить его. Excel сделает это за вас автоматически, когда код завершит выполнение.

4.- Если вы копируете и вставляете значения, но вам не нужно вставлять форматы - не делайте этого. Быстрее установить свойство .Value одного диапазона на свойство .Value другого диапазона.

Также вы можете попробовать измерить время работы Sub с различными опциями, которые вы пробуете, чтобы попытаться сохранить лучшее , даже если это не так быстро, как хотелось бы. Найдите пример кода:

Sub CalculateRunTime_Seconds()
'PURPOSE: Determine how many seconds it took for code to completely run
'SOURCE: www.TheSpreadsheetGuru.com/the-code-vault

Dim StartTime As Double
Dim SecondsElapsed As Double

'Remember time when macro starts
  StartTime = Timer

'*****************************
'Insert Your Code Here...
'*****************************

'Determine how many seconds code took to run
  SecondsElapsed = Round(Timer - StartTime, 2)

'Notify user in seconds
  MsgBox "This code ran successfully in " & SecondsElapsed & " seconds", vbInformation

End Sub

Надеюсь, что это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...