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

Performance 过滤大于X的日期,然后清除过滤单元格的更快方法?,performance,excel,date,autofilter,vba,Performance,Excel,Date,Autofilter,Vba,我有一个数据集,需要在其中查找范围内大于“X”的所有日期。然后我需要清除任何符合该条件的单元格的内容。我当前的代码循环遍历每一列,根据UserForm提供的变量“gDate”自动筛选,然后清除任何可见的单元格。数据集可以大到54列和1000多行 我还是VBA新手,我知道创建循环可能不是最优的。也就是说,有没有更快、更有效的方法来完成我的任务 Sub FilterDates() Dim ws2 As Worksheet Dim rng As Range Dim gDate As Date Dim

我有一个数据集,需要在其中查找范围内大于“X”的所有日期。然后我需要清除任何符合该条件的单元格的内容。我当前的代码循环遍历每一列,根据UserForm提供的变量“gDate”自动筛选,然后清除任何可见的单元格。数据集可以大到54列和1000多行

我还是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
  • 避免使用不稳定的公式
  • Volatile公式之所以被称为Volatile公式是有原因的。“现在”、“今天”、“间接”、“兰德”、“偏移量”等函数在工作簿每次发生更改时都会重新计算

    例如,如果在单元格中使用NOW函数,则每当工作表中发生更改时,将重新计算公式并更新单元格值

    这需要额外的处理速度,最终导致excel工作簿的速度变慢

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

    辅助列是Excel中评级最低的设计结构之一。我看到很多人不敢创建帮助器列

    不要那样做

    使用“辅助列”的最大好处是,它可以帮助您避免使用数组公式

    现在别误会我。我不反对数组公式。相反,我相信在某些情况下,这些可能是可怕的。但是,当您尝试使用一个长公式完成所有工作时,它确实会影响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.
    
  • 避免使用数组公式
  • 数组公式有其自身的优点,但速度不是其中之一

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

    如果有办法避免使用数组公式(例如使用辅助列),请始终使用该方法。 4.小心使用条件格式

    我绝对喜欢条件格式。它让平淡的数据看起来如此美丽。现在你不用自己做比较,只需看一个单元格的颜色或图标,就可以知道它与其他单元格的比较情况

    但是。。问题就在这里

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

    忠告——谨慎使用。 5.使用Excel表格和命名范围

    Excel表格和命名范围是两个惊人的功能,它们可以保存数据并使引用变得非常简单。可能需要一段时间来适应它,但当你开始使用它时,生活就会变得轻松而快速

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

    它还有一个额外的优点,就是让你的公式更容易理解

    例如,什么更容易理解

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

    这是一个不需要动脑筋的问题。当你不需要它时,不要保留它

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

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

  • 将所有参考数据保存在一张表中
  • 这可能并不总是可能的,但如果你能做到这一点,我保证你的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.
    

    这是一份详尽的清单吗?绝对不是。这些都是我认为值得分享的好东西,作为一个起点。

    另外值得注意的是:屏幕更新、EnableEvents等都已关闭。您是否希望在此日期筛选多个列?如果不是,您根本不需要这个循环。只需根据正确的列自动筛选工作表即可。是的,有多个列(列(5)到“LastCol2”),每一列都独立于其他列。需要清除整个范围内的任何日期>“gDate”(例如E2:BB1000)。