运行macros时公式的长时间计算的VBA解决scheme

我有一个大小为13 MB的文件。 当我运行我的macros时,它计算了3个不同的工作表中的第一行,并且我使用AutoFill技术来检查6000行旁边的内容,需要很长时间,这个时间在7-8分钟之间。 在我看来,大多数的公式很简单,不应该花很长时间。 有人解决我的问题? 也许一种方式,计算本身将发生在模块和工作簿中,我们将看到只是结果,值?

我的代码从一个用户userform开始,然后调用一个模块,这需要大部分时间运行macros。 正如我所说的,每张3张纸包括6000行。 我希望最后在工作表中能看到正确的values

 Sub Formulas() Call Columns LR = VacationWS.Cells(Rows.Count, "A").End(xlUp).Row With VacationWS 'Column D MyCol = .Range("D2").Column ColumnSpace = MonthCol - MyCol .Range("D2").FormulaR1C1 = _ "=SUMIFS(Visual!C[" & ColumnSpace & "],Visual!C[-3],VacationWS!RC[-3],Visual!C[5],Lists!R3C3,Visual!C[4],Lists!R2C5)" 'Column E MyCol = .Range("E2").Column ColumnSpace = MonthBefore - MyCol .Range("E2").FormulaR1C1 = _ "=SUMIFS(Visual!C[" & ColumnSpace & "],Visual!C[-4],VacationWS!RC[-4],Visual!C[4],Lists!R4C3,Visual!C[3],Lists!R5C5)" 'Column F MyCol = .Range("F2").Column ColumnSpace = MonthCol - MyCol .Range("F2").FormulaR1C1 = _ "=SUMIFS(Visual!C[" & ColumnSpace & "],Visual!C[-5],VacationWS!RC[-5],Visual!C[3],Lists!R2C3,Visual!C[2],Lists!R2C5)" 'Column G .Range("G2").FormulaR1C1 = "=RC[-3]+RC[-2]-RC[-1]" 'Column H MyCol = .Range("H2").Column ColumnSpace = MonthCol - MyCol .Range("H2").FormulaR1C1 = _ "=SUMIFS(Visual!C[" & ColumnSpace & "],Visual!C[-7],VacationWS!RC[-7],Visual!C[1],Lists!R4C3,Visual!C,Lists!R5C5)" 'Column I .Range("I2").FormulaR1C1 = "=RC[-1]-RC[-2]" 'Delete unnecessary rows .Range("D2:I2").AutoFill Destination:=VacationWS.Range("D2:I" & LR), Type:=xlFillDefault .Range("A1:I1").AutoFilter .Range("$A$1:$I$" & LR).AutoFilter Field:=9, Criteria1:="0" On Error Resume Next .Range("A2:I" & LR).SpecialCells(xlCellTypeVisible).EntireRow.Delete .ShowAllData End With With IllnessWS 'Column D MyCol = .Range("D2").Column ColumnSpace = MonthCol - MyCol .Range("D2").FormulaR1C1 = _ "=SUMIFS(Visual!C[" & ColumnSpace & "],Visual!C[-3],IllnessWS!RC[-3],Visual!C[5],Lists!R3C3,Visual!C[4],Lists!R3C5)" 'Column E MyCol = .Range("E2").Column ColumnSpace = MonthBefore - MyCol .Range("E2").FormulaR1C1 = _ "=SUMIFS(Visual!C[" & ColumnSpace & "],Visual!C[-4],IllnessWS!RC[-4],Visual!C[4],Lists!R4C3,Visual!C[3],Lists!R6C5)" 'Column F MyCol = .Range("F2").Column ColumnSpace = MonthCol - MyCol .Range("F2").FormulaR1C1 = _ "=SUMIFS(Visual!C[" & ColumnSpace & "],Visual!C[-5],IllnessWS!RC[-5],Visual!C[3],Lists!R2C3,Visual!C[2],Lists!R3C5)" 'Column G .Range("G2").FormulaR1C1 = "=RC[-3]+RC[-2]-RC[-1]" 'Column H MyCol = .Range("H2").Column ColumnSpace = MonthCol - MyCol .Range("H2").FormulaR1C1 = _ "=SUMIFS(Visual!C[" & ColumnSpace & "],Visual!C[-7],IllnessWS!RC[-7],Visual!C[1],Lists!R4C3,Visual!C,Lists!R6C5)" 'Column I .Range("I2").FormulaR1C1 = "=RC[-1]-RC[-2]" 'Delete unnecessary rows .Range("D2:I2").AutoFill Destination:=IllnessWS.Range("D2", "I" & LR), Type:=xlFillDefault .Range("A1:I1").AutoFilter .Range("$A$1:$I$" & LR).AutoFilter Field:=9, Criteria1:="0" On Error Resume Next .Range("A2:I" & LR).SpecialCells(xlCellTypeVisible).EntireRow.Delete .ShowAllData 'Delete what is equal to 90 or more in column H .Range("$A$1:$I$" & LR).AutoFilter Field:=8, Criteria1:=">=90", Operator:=xlAnd .Range("A2:I" & LR).SpecialCells(xlCellTypeVisible).EntireRow.Delete .ShowAllData End With With HealingWS 'Column D MyCol = .Range("D2").Column ColumnSpace = MonthCol - MyCol .Range("D2").FormulaR1C1 = _ "=SUMIFS(Visual!C[" & ColumnSpace & "],Visual!C[-3],HealingWS!RC[-3],Visual!C[5],Lists!R3C3,Visual!C[4],Lists!R4C5)" 'Column E MyCol = .Range("E2").Column ColumnSpace = MonthBefore - MyCol .Range("E2").FormulaR1C1 = _ "=SUMIFS(Visual!C[" & ColumnSpace & "],Visual!C[-4],HealingWS!RC[-4],Visual!C[4],Lists!R4C3,Visual!C[3],Lists!R7C5)" 'Column F .Range("F2").FormulaR1C1 = "=RC[-1]+RC[-2]" 'Column G MyCol = .Range("G2").Column ColumnSpace = MonthCol - MyCol .Range("G2").FormulaR1C1 = _ "=SUMIFS(Visual!C[" & ColumnSpace & "],Visual!C[-6],HealingWS!RC[-6],Visual!C[2],Lists!R4C3,Visual!C[1],Lists!R7C5)" 'Column H .Range("H2").FormulaR1C1 = "=RC[-1]-RC[-2]" 'Delete unnecessary rows .Range("D2:H2").AutoFill Destination:=HealingWS.Range("D2:H" & LR), Type:=xlFillDefault .Range("A1:H1").AutoFilter .Range("$A$1:$H$" & LR).AutoFilter Field:=8, Criteria1:="0" On Error Resume Next .Range("A2:H" & LR).SpecialCells(xlCellTypeVisible).EntireRow.Delete .ShowAllData 'Specific for June in HealingWS (Goes to Null) With Lists If MonthName = .Range("A7").Value Then HealingWS.Range("E2").Value = 0 HealingWS.Range("E2").AutoFill Destination:=HealingWS.Range("E2:E" & LR), Type:=xlFillDefault End If End With End With 'January formulas change If MonthName = Lists.Range("A2").Value Then With VacationWS .Range("E2").FormulaR1C1 = _ "=SUMIFS(December!C[7],December!C[-4],VacationWS!RC[-4],December!C[4],Lists!R4C3,December!C[3],Lists!R5C5)" .Range("E2").AutoFill Destination:=VacationWS.Range("E2:E" & LR), Type:=xlFillDefault End With With IllnessWS .Range("E2").FormulaR1C1 = _ "=SUMIFS(December!C[7],December!C[-4],îçìä!RC[-4],December!C[4],Lists!R4C3,December!C[3],Lists!R6C5)" .Range("E2").AutoFill Destination:=IllnessWS.Range("E2:E" & LR), Type:=xlFillDefault End With With HealingWS .Range("E2").FormulaR1C1 = _ "=SUMIFS(December!C[7],December!C[-4],HealingWS!RC[-4],December!C[4],Lists!R4C3,December!C[3],Lists!R7C5)" .Range("E2").AutoFill Destination:=HealingWS.Range("E2:E" & LR), Type:=xlFillDefault End With End If End Sub 

SUMIFS在计算上是昂贵的,应该谨慎使用。 你把它们放到14列然后复制下来。 如果他们都下降6000行,那么这是一个惊人的8.4万SUMIFS。 有可能指向相当大的范围。 培养。 破坏。

摆脱他们。 改为使用数据透视表。 而且你会发现事情只需要几秒钟,而不是几分钟。

我曾经在https://chandoo.org/wp/2014/01/17/big-trouble-in-little-spreadsheet/上写了一篇关于这方面的文章,这可能是有趣的。

你可能也会对我在这里的回答有兴趣,在那里我比较了一大堆不同的方法来总结多个条件: 优化Excel公式 – SUMPRODUCT vs SUMIFS / COUNTIFS

其中之一是所谓的范围切片,这将是如果你决定使用公式,最快的方式做事情。 但是,尽pipe闪电很快,build立起来很难,而且很难让其他人头脑清醒。 这又把我们带回到数据透视表。 数据透视表是专为您正在做的事情的types而devise的。 他们在这里是一个更好的解决scheme。