Excel VBA隐藏/显示行代码速度

不知道有多lessExcel VBA大师,除了我自己; – D,围绕着计算器,但这里有一个有趣的问题。

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

  1. 创build一个帮助列,确定是否应该隐藏行。
  2. 帮助列中的公式返回一个错误或一个数字。
  3. 隐藏助手列并编写代码来执行隐藏/显示。

问题:您希望以下哪种方法更快? 列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 

有一个不同的方法,那就是使用自动filterfunction – 毕竟VBA里面有一个A – 尽可能使用应用程序的function,所以这段代码非常简短和甜美 – 假设数据是连续的在列a和b中阻塞,并假定没有其他error handling在玩。 继续下一行允许filter已被打开。

  Sub showHideRange()
昏暗的testing范围
     testrange = Range(“A1”)。CurrentRegion.Address
    在错误恢复下一步
     testrange.AutoFilter
     ActiveSheet.Range(testrange).AutoFilter Field:= 2,Criteria1:=“show”
结束小组

如果您不希望向用户展示发生了什么情况,那么使用VBA本身而不是隐藏的列来执行计算会更好吗? 当然,这似乎locking你select2,我怀疑是更慢的选项…我的VBA经验大部分是在旧版本的Excel中,所以我没有很高兴与一些新function,而我所做的涉及处理数据行的任务是逐行完成的。

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