Макрос Runtime неожиданно медленно - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть идентичный фрагмент кода, который был запущен почти мгновенно на предыдущей итерации, которая теперь занимает около 5 минут. Я редактировал другие части кода, но всякий раз, когда я нарушаю код в течение этого 5-минутного периода времени, он работает через этот подпункт.

Sub cleanup()

For i = 2 To 100000

'exits loop when it reaches a blank cell
If IsEmpty(Cells(i, 1)) = True Then Exit For

' formats for blanks
If Cells(i, 1) = Cells(i - 1, 1) Then
    For j = 4 To 15
        If IsEmpty(Cells(i - 1, j)) = True Then
        Cells(i - 1, j) = Cells(i, j)
        End If
    Next j
    Rows(i).Delete
    i = i - 1
End If

Next i

End Sub

Я пытался отключить события, обновление экрана и т. Д., Но не могу понять. Имейте в виду, что раньше это выполнялось буквально мгновенно, и с тех пор я изменил только другие функции в своем коде. Не уверен, что делать. Спасибо!

**

Другая часть, которая очень странная, это то, что когда я снова запускаю макрос (после удаления всех строк), это все равно занимает очень много времени. В приведенном выше макросе второй раз через него никогда не следует даже вводить первое условное, но это все еще занимает много времени.

**

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Возможно, я слишком упрощаю вашу задачу, но если вы используете встроенную функцию counta в Excel, я думаю, что было бы очень эффективно определить, содержит ли строка значения в ней:

If Excel.WorksheetFunction.CountA(rw.EntireRow) = 0 Then
  rw.Delete
End If

Конечно, это смотрит на всю строку, и вы, вероятно, хотите связать это со столбцами 4 - 15 (или с тем, что вы показали выше).

Кроме того, я думаю, что @ Marcucciboy2 высказал хорошую мысль, иЯ бы начал снизу вверх.

Если вы действительно хотите сделать этот гул, вы, вероятно, можете определить их в контексте диапазона (например, 1: 4,5: 7 и т. Д.) И удалить всю коллекцию строк.в одно время.

0 голосов
/ 11 сентября 2018

В Excel, если вы можете избежать циклов for, это очень медленно.Например: в моей работе я использую строки 7000x746x3, и он работает около 15 минут (i5 7300u, но не намного быстрее на настольном компьютере 7770. Может быть, здесь мало оптимизаций: https://www.ozgrid.com/VBA/SpeedingUpVBACode.htm или используйте foreach. А если вы используете, то можетеколичество строк / столбцов. Пример количества строк:

LastRow = Worksheets("Sheet").Cells(Worksheets("Sheet").Rows.Count, "A").End(xlUp).Row
0 голосов
/ 11 сентября 2018
Sub cleanup()

For i = Range("A" & Rows.Count).End(xlUp).Row + To 2 step -1

    If Cells(i, 1) = Cells(i - 1, 1) Then
        For j = 4 To 15
            If IsEmpty(Cells(i - 1, j)) Then Cells(i - 1, j) = Cells(i, j)
        Next j
        If CellArray Is Nothing Then
            Set CellArray = Rows(i)
        Else
            Set CellArray = Union(CellArray, Rows(i))
        End If
    End If
Next i

CellArray.Delete

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