运行宏时长时间计算公式的VBA解决方案
我有一个13MB大小的文件。当我运行宏时,它会计算3个不同工作表中的第一行,然后我使用运行宏时长时间计算公式的VBA解决方案,vba,excel,Vba,Excel,我有一个13MB大小的文件。当我运行宏时,它会计算3个不同工作表中的第一行,然后我使用AutoFill技术计算6000行,这需要很长时间,大约7-8分钟。在我看来,大多数公式都很简单,不需要很长时间。 有人能解决我的问题吗?也许计算本身会在模块和工作簿中发生,我们只会看到结果,值 我的代码从一个userform开始,然后调用一个模块,这占用了宏运行的大部分时间。正如我所说的,这3张纸中的每一张都有6000行。我希望在工作表的最后,我只看到值 Sub Formulas() Call Column
AutoFill
技术计算6000行,这需要很长时间,大约7-8分钟。在我看来,大多数公式都很简单,不需要很长时间。
有人能解决我的问题吗?也许计算本身会在模块和工作簿中发生,我们只会看到结果,值
我的代码从一个userform
开始,然后调用一个模块,这占用了宏运行的大部分时间。正如我所说的,这3张纸中的每一张都有6000行。我希望在工作表的最后,我只看到值
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
SUMIF在计算上很昂贵,应该节约使用。你把它们分成14列,然后复制下来。如果他们都排在6000行,那么这是一个惊人的84000 SUMIFS。可能指向相当大的范围。火车。沉船 摆脱他们。改用数据透视表。你会发现事情只需要几秒钟,而不是几分钟 我写了一篇关于这方面的文章,可能会引起人们的兴趣 你可能也对我的答案感兴趣,我比较了很多不同的方法,在多种条件下求和:
其中之一就是所谓的范围切片,如果你决定使用公式,这将是最快的方法。但是,虽然闪电般地快,但设置起来很棘手,其他人也很难动脑。这又让我们回到了数据透视表。数据透视表就是为您正在做的事情而设计的。在这里,它们是更好的解决方案。尝试在开头添加
Application.Calculation=xlCalculationManual
,在结尾添加Application.Calculation=xlCalculationAutomatic
。另外,在开头添加:Application.screenUpdate=false
,在结尾添加Application.screenUpdate=true
。现在的结果是什么?@KazimierzJawor关于计算手册,它使宏变慢了,我已经试过了。屏幕更新-我在我的宏中有它,正如我所说的——这里的部分在代码的中间-代码以用户窗体开始。以防万一:确保你的计算有正确的方向(从上到下,从左到右)。例如,如果在A1=B1+C1
(从右到左)中计算,则比在C1=A1+B1
(从左到右)中计算要慢。这已经让我在大而复杂的工作表中慢了很多。尝试这样的代码VacationWS.Range(“G2:G5000”)。FormulaR1C1=“=RC[-3]+RC[-2]-RC[-1]”
因为你的代码似乎在工作(尽管速度很慢),你可能想在感谢你的回答上发布你的问题,我现在将阅读你给我的链接,谁知道也许你会是那个打开我心扉的人,这是一个新的模型,所以我愿意改变。你也应该阅读PowerPivot和PowerQuery。最近,在Excel的庇护下,有一场悄无声息的革命正在进行。它现在是一个令人难以置信的数据库/转换工具。YouTube上有很多很棒的视频,还有来自Ken Puls、Rob Collie、Jon Acampora、Mike Girvin和Chandoo等网站的精彩内容。谷歌他们,并准备好惊讶。