簡體   English   中英

宏運行時突然變慢

[英]Macro Runtime Suddenly Slow

我有一個完全相同的代碼,在先前的迭代中幾乎立即運行,現在大約需要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

我嘗試禁用事件和屏幕更新等,但無法解決。 請記住,這曾經是即時運行的,並且由於這些更改,我只更改了代碼中的其他功能。 不知道該怎么辦。 謝謝!

**

另一個很奇怪的部分是當我再次運行宏(刪除所有行之后)時,它仍然需要很長時間。 在上面的宏中,通過它的第二次輸入永遠不會進入第一個條件,但仍然需要很長時間。

**

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

我可能會簡化您的任務,但是如果您在Excel中使用內置的counta函數,我認為確定行中是否包含值將非常有效:

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

當然,這將查看整個行,您可能希望將其綁定到第4至15列(或上面顯示的任何內容)。

另外,我認為@ Marcucciboy2很好,我將從頭開始。

如果您確實想發出嗡嗡聲,則可以在范圍上下文中定義它們(即1:4,5:7等),然后一次刪除整個行集合。

在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM