更快地过滤大于X的日期,然后清除过滤后的单元格?

时间:2017-07-03 06:48:57

标签: performance excel-vba date autofilter vba

我有一个数据集,我需要找到大于" X"的所有日期。在范围内。然后我需要清除符合该标准的任何单元格的内容。我当前的代码循环遍历每一列,AutoFilters基于UserForm提供的变量" gDate,"然后清除任何可见的细胞。数据集可以大到54列和1,000多行。

我还是VBA的新手,我知道创建循环可能不是最佳的。话虽如此,是否有更快,更有效的方式来完成我的任务?

Sub FilterDates()
Dim ws2 As Worksheet
Dim rng As Range
Dim gDate As Date
Dim LastRow2 As Long, LastCol2 As Long
Set ws2 = Sheets("Sheet2")
LastRow2 = ws2.Cells(Rows.count, 1).End(xlUp).row
LastCol2 = ws2.Cells(1, Columns.count).End(xlToLeft).Column
gDate = Sheets("UFinput").Cells(2, 1)
Set rng = ws2.Range(Cells(1, 1), Cells(LastRow2, LastCol2))

'Loops through columns filtering dates > gDate then clears
With rng
On Error Resume Next
    Dim iLoop As Long
    For iLoop = 5 To LastCol2

    .AutoFilter Field:=iLoop, Criteria1:=">" & gDate
    ws2.Range(Cells(2, iLoop), Cells(LastRow2, iLoop)).SpecialCells(xlCellTypeVisible).ClearContents
    .AutoFilter Field:=iLoop

    Next iLoop
End With

ws2.AutoFilterMode = False
End Sub

1 个答案:

答案 0 :(得分:0)

  1. 避免使用挥发性配方
  2. 因为某种原因而被称为挥发性公式。每次工作簿发生变化时,NOW,TODAY,INDIRECT,RAND,OFFSET等函数都会重新计算。

    例如,如果您在单元格中使用NOW函数,则每次工作表中都有更改时,将重新计算公式并更新单元格值。

    这需要额外的处理速度,最终会得到一个缓慢的Excel工作簿。

    根据经验,避免使用不稳定的公式。如果你不能,尽量减少它的使用。 2.使用辅助列

    Helper列是Excel中评价最低的设计构造之一。我见过很多人回避创建帮助列。

    不要那样做。

    使用'Helper Columns'的最大好处是它可以帮助您避免使用数组公式。

    现在不要误会我的意思。我不反对数组公式。相反,我相信在某些情况下这些可能会很棒。但是,当您尝试使用一个长公式来完成所有操作时,它确实会影响Excel工作簿的性能。这里和那里的几个数组公式不应该受到伤害,但是如果你需要在很多地方使用它,请考虑使用辅助列。

    以下是一些使用辅助列的示例:

    Automatically Sort Data in Alphabetical Order using Formula.
    Dynamic Excel Filter – Extract Data as you Type.
    Creating Multiple Drop-down Lists in Excel without Repetition.
    
    1. 避免使用数组公式
    2. 数组公式有其自身的优点 - 但速度不是其中之一。

      如上所述,数组公式可以占用大量数据(单元格引用),对其进行分析,并为您提供结果。但这样做需要时间。

      如果有办法避免数组公式(例如使用辅助列),请始终采取这种方式。 4.谨慎使用条件格式

      我非常喜欢条件格式化。它让平淡的数据看起来如此美丽。现在你可以简单地查看单元格的颜色或图标,而不是自己进行比较,而是知道它与其他人的比较。

      但是......这就是问题所在。

      没有多少Excel用户知道Excel条件格式是易失性的。虽然您可能没有注意到小数据集的差异,但如果应用于大型数据集或多次应用,可能会导致excel电子表格变慢。

      建议 - 谨慎使用。 5.使用Excel表格和命名范围

      Excel表格和命名范围是两个令人惊叹的功能,可以保存您的数据并使参考变得非常容易。它可能需要一段时间才能适应它,但是当你开始使用它时,生活变得轻松而快速。

      在创建数据驱动的仪表板时,将数据转换为Excel表几乎总是一个好主意。

      它还具有使您的公式更易于理解的附加优势。

      例如,什么更容易理解?

      =销售价格 - 成本价格OR = SUM(A1:A10)-SUM(G1:G10) 6.将未使用的公式转换为静态值

      这是一个明智的做法。当你不需要它时,不要保留它。

      许多公式会导致Excel工作簿速度变慢。如果你有甚至没有被使用的公式 - 你知道应该责怪谁。根据经验,如果您不需要公式,最好将它们转换为静态值(通过粘贴为值)。

      阅读更多:如何快速将公式转换为值。

      1. 将所有参考数据保存在一张表中
      2. 这可能并非总是可行,但如果你能做到这一点,我保证你的Excel表格会变得更快。

        逻辑很简单 - 工作表中的公式不必在同一张表中的数据旁边获取数据。 8.避免使用整行/列作为参考(A:A)

        我在列表中有这个的唯一原因是我看到很多人在公式中使用整个行/列引用。这是一种不好的做法,应该避免。

        虽然您可能认为行/列只有几个包含数据的单元格,但Excel并不这么认为。当您引用整个行/列时,Excel将其视为一个好的服务员并检查它。这需要更多的时间进行计算。 9.使用手动计算模式

        我只是重复在各种论坛和博客中已经说过的百万人。使用手动计算可以让您灵活地告诉excel何时计算,而不是Excel自己做出决定。这不会加速您的Excel工作簿,但如果您的Excel电子表格速度较慢,则无需一次又一次地重新计算Excel,从而节省了时间。

        To switch to manual mode, go to Formula Tab –> Calculation Options –> Manual (press F9 key to recalculate)
        

        慢速Excel电子表格 - 手动计算 10.使用更快的公式技术

        Excel为您提供了许多公式和公式组合来做同样的事情。最好识别和使用最快的。

        以下是几个例子:

        Use IFERROR instead of IF and ISERROR combo (unless you are using Excel 2003 or earlier, which does not have IFERROR).
        Use MAX(A1,0) instead do IF(A1>0,A1,0) – This is a cool tip that I learned from Mr. Excel aka Bill Jelen. His research shows that MAX option is 40% faster than IF option (and I am ready to take this stat on his face value).
        Use the INDEX/MATCH combo, instead of VLOOKUP – This may raise a lot of eyebrows, but the truth is, there is no way VLOOKUP can be faster if you have 100’s of columns of data. The world is moving towards INDEX/MATCH, and you should make the shift too.
        [If you are still confused about what to use, here is a head-on-head comparison of VLOOKUP Vs. INDEX/MATCH].
        Use — (double negatives) to convert TRUE’s and FALSE’s to 1’s and 0’s (instead of multiplying it by 1 or adding 0 to it). The speed improvement is noticeable in large data sets.
        

        这是一份详尽的清单吗?绝对不。这些是一些我认为值得分享的优秀作为起点。