我正在尝试在excel VBA中对效率程序进行编码,该程序基本上在adjecent工作表中搜索三个匹配条件,如果匹配则从第四列中提取。这是通过使用CountIf函数完成的。对于三列匹配的每次,添加第四列中的值。这是使用SumIf函数完成的。我在100多行,5000+列区域内自动填充此CountIf(SumIf())函数。
到目前为止,代码需要大约45分钟来计算。我想知道我是否将该区域划分为4个独立的计算或重新编码我的方程式,我可以减少这个运行时间?正如您在我的代码末尾所看到的那样,我完成了另一个计算,以显示每列的平均值,这会增加更多时间。
这是我的代码:
Sheets("8MO Raw Data").Select
Range("A1048576").End(xlUp).Select
EightMOLastRow = ActiveCell.Row
Sheets("Shop Average Calc").Select
Range("A1048576").End(xlUp).Select
ShopAverageLastRow = ActiveCell.Row
Range("B3") = "=IF(COUNTIFS('8MO Raw Data'!$D$2:$D$" & EightMOLastRow & ",B$1,'8MO Raw Data'!$F$2:$F$" & EightMOLastRow & ",B$2,'8MO Raw Data'!$B$2:$B$" & EightMOLastRow & ",$A3)=0,0,((SUMIFS('8MO Raw Data'!$Q$2:$Q$" & EightMOLastRow & ",'8MO Raw Data'!$D$2:$D$" & EightMOLastRow & ",B$1,'8MO Raw Data'!$F$2:$F$" & EightMOLastRow & ",B$2,'8MO Raw Data'!$B$2:$B$" & EightMOLastRow & ",$A3))))"
Range("B2").End(xlToRight).Select
ShopAverageLastColumn = ActiveCell.Column
Range("B3").Select
Selection.AutoFill Destination:=Range(Cells(3, 2), Cells(3, ShopAverageLastColumn)), Type:=xlFillDefault
Range(Cells(3, 2), Cells(3, ShopAverageLastColumn)).Select
Selection.AutoFill Destination:=Range(Cells(3, 2), Cells(ShopAverageLastRow, ShopAverageLastColumn)), Type:=xlFillDefault
Cells(ShopAverageLastRow + 1, 1) = "Sum of Hrs/pc"
Cells(ShopAverageLastRow + 2, 1) = "#OP Completed"
Cells(ShopAverageLastRow + 3, 1) = "Average Hrs/Pc"
Range("B" & ShopAverageLastRow + 1) = "=SUM(B3:B" & ShopAverageLastRow & ")"
Range("B" & ShopAverageLastRow + 2) = "=COUNTIFS('8MO Raw Data'!$D$2:$D$" & EightMOLastRow & ",B1,'8MO Raw Data'!$F$2:$F$" & EightMOLastRow & ",B2)"
Range("B" & ShopAverageLastRow + 3) = "=B" & ShopAverageLastRow + 1 & "/B" & ShopAverageLastRow + 2 & ""
Range(Cells(ShopAverageLastRow + 1, 2), Cells(ShopAverageLastRow + 3, 2)).Select
Selection.AutoFill Destination:=Range(Cells(ShopAverageLastRow + 1, 2), Cells(ShopAverageLastRow + 3, ShopAverageLastColumn)), Type:=xlFillDefault
答案 0 :(得分:1)
所有。select
......
你可以尝试的一件容易的事就是把它放在开头
Application.ScreenUpdating = False
当功能完成时反过来
Application.ScreenUpdating = True
这将阻止Excel向您显示它在屏幕上所做的所有更改,这可能会花费很多时间。
但是
你不应该真的需要这样做,因为你可以删除很多(如果不是全部)select语句。
Range(Cells(3, 2), Cells(3, ShopAverageLastColumn)).Select
Selection.AutoFill Destination:=Range(Cells(3, 2), Cells(ShopAverageLastRow, ShopAverageLastColumn)), Type:=xlFillDefault
可以简化为以下功能并且功能相同。
Range(Cells(3, 2), Cells(3, ShopAverageLastColumn)).AutoFill Destination:=Range(Cells(3, 2), Cells(ShopAverageLastRow, ShopAverageLastColumn)), Type:=xlFillDefault
我想有些时候可以用其中一个或两个建议保存。