簡體   English   中英

為什么小型Excel VBA宏運行速度極慢

[英]Why is a small Excel VBA Macro is running extremely slow

我正在編寫一個簡短的宏來隱藏當前沒有當前銷售額的所有客戶。 年初至今銷售額在K欄(特別是K10-250)。 這些單元格使用vlookup從我們轉儲數據的另一個選項卡中提取數據。 我的問題是為什么這個宏需要10-15分鍾才能運行? 我在另一個電子表格上有一個類似的宏,超過1,500行只需2-3分鍾。 我已經關閉了屏幕更新。 我想不出任何會加速它的事情。

   Sub HideNoSlackers()
'
' HideNoSlackers Macro
'

'
Application.ScreenUpdating = False
'
 Sheets("CONSOLIDATED DATA").Select
 Dim cell As Range
 For Each cell In Range("K10:K250")
   If cell.Value = 0 Then
     cell.EntireRow.Hidden = True
   Else
     cell.EntireRow.Hidden = False
   End If
 Next
End Sub

您可能希望在隱藏行之前將計算設置為手動? 你也可以在你的情況下擺脫If語句。 嘗試這個:

Sub HideNoSlackers()
    Dim cell As Range, lCalcState As Long

    Application.ScreenUpdating = False
    ' Record the original Calculation state and set it to Manual
    lCalcState = Application.Calculation
    Application.Calculation = xlCalculationManual
    For Each cell In ThisWorkbook.Worksheets("CONSOLIDATED DATA").Range("K10:K250")
        cell.EntireRow.Hidden = (cell.Value = 0)
    Next
    ' Restore the original Calculation state
    Application.Calculation = lCalcState
    Application.ScreenUpdating = True ' Don't forget set ScreenUpdating back to True!
End Sub
Sub HideNoSlackers()
 Dim cell As Range, rng As Range, rngHide As Range

    Set rng = Sheets("CONSOLIDATED DATA").Range("K10:K250")
    rng.EntireRow.Hidden = False

    For Each cell In rng.Cells
        If cell.Value = 0 Then
            If Not rngHide Is Nothing Then
                Set rngHide = Application.Union(rngHide, cell)
            Else
                Set rngHide = cell
            End If
        End If
    Next

    If Not rngHide Is Nothing Then rngHide.EntireRow.Hidden = True
End Sub

你為什么用宏做這個?

如果您在數據上創建表格,則可以在銷售列上設置過濾器,該過濾器僅顯示銷售額<> 0的過濾器。

宏在Excel中非常有用,但人們轉向宏的大多數操作都可以在excel中本地完成。

一定有別的東西是錯的。 嘗試沒有。選擇表格,但這不是一個巨大的進步

注意行默認是可見的,因此Else語句應該是可選的。

Sub HideNoSlackers()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

    Sheets("CONSOLIDATED DATA").Cells.EntireRow.Hidden = False
    Dim cell As Range
    For Each cell In Sheets("CONSOLIDATED DATA").Range("K10:K250")
        If cell.Value = 0 Then cell.EntireRow.Hidden = True
    Next

Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub

以最不同的方式實現相同目標的最短代碼:

Sub column_K_not_NULL
    Sheets("CONSOLIDATED DATA").Select
    If ActiveSheet.FilterMode Then Selection.AutoFilter 'if an autofilter already exists this is removed
    ActiveSheet.Range("$K$10:$K$250").AutoFilter Field:=1, Criteria1:="<>0"
End Sub

當然你可以加入標准的最小值

application.calculation = Manual 
Application.ScreenUpdating = False

最后的其他方式。 馬克斯

嘗試禁用分頁符。 我有一個類似的問題,在有人從工作表打印后會發生。 這打開了分頁符,后續運行的腳本將永遠。

ActiveSheet.DisplayPageBreaks = False

我們發現,版本4.1.0.1533中的程序Syncplicity減慢了宏速度的15倍,因為事件會觸發syncplicity。

Application.EnableEvents = False

在這里做你的工作

Application.EnableEvents = True

速度回來了。

暫無
暫無

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

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