【问题标题】:Hide rows sub is taking forever隐藏行子需要永远
【发布时间】:2021-03-15 13:33:46
【问题描述】:

我有一个电子表格需要切换显示/隐藏取决于 G 列值的行。

我有两个按钮:

  1. [Show All] - 这将执行一个 sub 来显示所有行。
  2. [Hide FALSE] - 这将执行一个 sub 来隐藏其在 G 列中的值 = FALSE 的任何行

问题是 Sub 只需要跑完 250 行,但完成 sub 大约需要 5 分钟。我向你保证,这与我的 PC 规格无关。

Excel VBA 代码:

'This sub takes about 5 minutes to complete  (WHY?)
Private Sub btnHideFalse_Click()
  Application.ScreenUpdating = False
  Dim i As Integer
  Dim wsSelect As Worksheet
  Set wsSelect = ThisWorkbook.ActiveSheet


  For i = 2 To 250
      'Cells(i,7) point to the current row's column G value
      wsSelect.Rows(i).EntireRow.Hidden = (wsSelect.Cells(i, 7).Value = False)        
  Next i

  Set wsSelect = Nothing

  Application.ScreenUpdating = True

    
End Sub

'This sub works great
Private Sub btnShowAll_Click()
    ThisWorkbook.ActiveSheet.Rows("1:250").EntireRow.Hidden = False
End Sub

【问题讨论】:

  • 值是“假”吗? wsSelect.Cells(i, 7).Value = "False"
  • @Nathan_Sav 哈哈……你是对的。它现在有效......我不敢相信这是问题
  • 不用担心 :) HTH

标签: excel vba show-hide


【解决方案1】:

更新 UI(隐藏行)可能是 Excel 中最慢的操作。正如您提到的那样,一次性完成要快得多,因此将要隐藏的行构建到一个范围内。此外,读取单元格非常慢,因此将它们一次全部读取到数组中。这是一个例子:

Dim r as range
Dim arr() as variant
    
Set r = ws.Range("A11") ' need an arbitrary row to start the union join below
        
arr = ws.Range("A1:B10").value
    
For x = 1 To 10
   If arr(x, 2) = "MyHideCondition" Then
     Set r = Application.Union(r, ws.Cells(x, 1))
   End If
Next x
        
r.EntireRow.Hidden = True

【讨论】:

  • 你的解释很好。你的代码,不多。尤其是Set r = ws.Range("A11")(例如,参见this answer 中的辅助函数)。 “需要任意行来启动下面的联合连接”是完全错误的。代码不应该对任意行做任何事情。
  • 我投了赞成票,因为这看起来很有趣。
  • @BigBen 我删除了速记代码。请解释您链接到的辅助函数。
  • 如果您合并了该确切的辅助函数,您的答案会更好。
  • @Absinthe 我认为您不了解该辅助函数在做什么。 If source Is Nothing Then。无需像当前使用 Set r = ws.Range("A11") 的方法那样选择随机行。这是一个“黑客”,不应该被提议。链接的答案显示了如何避免这种黑客攻击。
猜你喜欢
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
相关资源
最近更新 更多