隐藏/显示行代码速度

时间:2008-11-13 19:59:31

标签: excel vba

目标:根据行中的数据有效地显示/隐藏行。

  1. 创建一个帮助列,确定是否 应该隐藏一行。
  2. 在助手中有公式 列返回错误或数字。
  3. 隐藏帮助列并写入 用于执行隐藏/显示的代码。
  4. 问题:您希望以下哪种方法更快? B列是辅助列,并且始终是连续的。

     Sub SetRowVisibility1()
    
      Dim rowsToCheck As Range
      With ActiveSheet
        Set rowsToCheck = .Range(Range("B7"), Range("B7").End(xlDown))
      End With
    
      Dim needToShow As Range, needToShow_Showing As Range
      Dim needToHide As Range, needToHide_Showing As Range
    
      Set needToShow = rowsToCheck.SpecialCells(xlCellTypeFormulas, xlNumbers)
      Set needToHide = rowsToCheck.SpecialCells(xlCellTypeFormulas, xlErrors)
    
      On Error Resume Next
      Set needToShow_Showing = needToShow.Offset(0, 1).SpecialCells(xlCellTypeVisible)
      Set needToHide_Showing = needToHide.Offset(0, 1).SpecialCells(xlCellTypeVisible)
      On Error GoTo 0
    
      If Not needToHide_Showing Is Nothing Then
        needToHide_Showing.EntireRow.Hidden = True
      End If
      If Not needToShow Is Nothing Then
        If needToShow.Count <> needToShow_Showing.Count Then
          needToShow.EntireRow.Hidden = False
        End If
      End If
    
    End Sub
    
    
    Sub SetRowVisibility2()
    
      Dim rowsToCheck As Range
      With ActiveSheet
        Set rowsToCheck = .Range(Range("B7"), Range("B7").End(xlDown))
      End With
    
      Dim needToShow As Range, needToHide As Range
      Dim cell As Range
      For Each cell In rowsToCheck
    
        If IsError(cell.Value) And (cell.EntireRow.Hidden = False) Then
          If needToHide Is Nothing Then
            Set needToHide = cell
          Else
            Set needToHide = Union(needToHide, cell)
          End If
        End If
    
        If Not IsError(cell.Value) And (cell.EntireRow.Hidden = True) Then
          If needToShow Is Nothing Then
            Set needToShow = cell
          Else
            Set needToShow = Union(needToShow, cell)
          End If
        End If
    
      Next cell
    
    
      If Not needToHide Is Nothing Then needToHide.EntireRow.Hidden = True
      If Not needToShow Is Nothing Then needToShow.EntireRow.Hidden = False
    
    End Sub
    

2 个答案:

答案 0 :(得分:1)

有一种不同的方式,即使用自动过滤功能 - 在所有VBA中都有A之后 - 尽可能使用应用程序的功能 所以这段代码非常短而且很好 - 假设数据是a和b列中的连续块,并假设没有其他错误处理。恢复下一行允许过滤器已经打开。

Sub showHideRange()
Dim testrange
    testrange = Range("A1").CurrentRegion.Address
    On Error Resume Next
    testrange.AutoFilter
    ActiveSheet.Range(testrange).AutoFilter Field:=2, Criteria1:="show"
End Sub

答案 1 :(得分:0)

如果您不希望向用户显示正在发生的事情,那么在VBA本身而不是在隐藏列中执行计算会不会更好?当然,这似乎会把你锁定到选项2,我怀疑这是一个较慢的选项...我的大多数VBA体验都是在旧版本的Excel中,所以我没有乐趣使用一些较新的功能,我所做的涉及处理数据行的任务是逐行完成的。

我猜第一个子问题的一个可能问题是,如果工作表存在问题或者您用来确定隐藏/显示的值,则该过程将失败。如果你逐行检查并且有一行导致问题,你可以跳过该行并正确处理其他行。