4

我正在编写一个简短的宏来隐藏当年没有当前销售额的所有客户。年初至今的销售额在 K 列中(特别是 K10-250)。这些单元格使用 vlookup 从我们转储数据的另一个选项卡中提取数据。我的问题是为什么这个宏需要 10-15 分钟才能运行?我在另一个电子表格上有一个类似的宏,它只需要 2-3 分钟就可以处理超过 1,500 行。我已经关闭了屏幕更新。我想不出还有什么可以加快速度的。

   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
4

7 回答 7

4

您可能希望在隐藏行之前将计算设置为手动?你也可以摆脱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
于 2013-09-19T23:25:18.583 回答
3
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
于 2013-09-19T23:13:03.390 回答
2

你为什么用宏做这个?

如果您在数据上创建一个表,您可以在 sales 列上设置一个过滤器,该过滤器将仅显示 sales<> 0 的那些。

宏在 excel 中很有用,但人们转向宏的大多数操作都可以在 excel 中本地完成。

于 2013-09-19T22:36:59.590 回答
1

以非常不同的方式实现相同目标的最短代码:

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

最后以其他方式进行。最大限度

于 2013-09-20T14:29:22.950 回答
1

一定还有其他问题。尝试不使用 .Selecting 工作表,但这并不是一个巨大的改进

注意行默认是可见的,所以 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
于 2013-09-19T22:13:43.230 回答
1

尝试禁用分页符。我有一个类似的问题,在有人从工作表上打印后会发生。这打开了分页符,脚本的后续运行将永远持续下去。

ActiveSheet.DisplayPageBreaks = False
于 2014-01-09T19:22:04.707 回答
0

我们发现,版本 4.1.0.1533 中的程序 Syncplicity 将宏减慢了 15 倍,因为事件触发了 Syncplicity。

Application.EnableEvents = False

;在这里做你的工作

Application.EnableEvents = True

速度又回来了。

于 2017-01-10T10:33:00.920 回答