Excel VBA:将自动填充区域切割为一半或四分之一是否会减少大区域的计算时间?

Excel VBA:将自动填充区域切割为一半或四分之一是否会减少大区域的计算时间?,vba,excel,Vba,Excel,我试图用excel VBA编写一个效率程序,它基本上是在相邻的工作表中搜索三个匹配的条件,如果它们匹配,则从第四列中提取。这是通过使用CountIf函数完成的。每当三列的值匹配时,第四列中的值就会被添加。这是使用SumIf函数完成的。我正在100+行、5000+列区域中自动填充这个CountIf(SumIf())函数 到目前为止,代码只需45分钟就可以计算出来。我想知道如果我把面积分成4个单独的计算,或者重新编码我的方程式,我可以减少这个运行时间吗?正如您在代码末尾看到的,我完成了另一个计算,以

我试图用excel VBA编写一个效率程序,它基本上是在相邻的工作表中搜索三个匹配的条件,如果它们匹配,则从第四列中提取。这是通过使用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

所有。
选择
s

你可以尝试的一件简单的事情就是把它放在开头

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

我想这些建议中的一个或两个都可以节省一些时间

谢谢!我应用了屏幕更新代码并删除了很多。选择,但是,代码仍然需要大约40分钟才能运行。由于需要进行搜索,代码本身可能只需要运行一段时间,但我很惊讶没有任何方法可以将时间缩短几分钟。