加快Excelmacros?

现在我有一个macrosPopulateYearlyValues但在我看来,它是太长了

 Sub PopulateYearlyValues(ByVal Month As Range) Dim c As Double Dim s As Double c = Application.WorksheetFunction.Match(UCase(Month.Value), ActiveSheet.Range("AA5:AX5"), 0) s = (ActiveSheet.Range("AA5").Column - 1) With ActiveSheet Dim i As Integer Dim j As Integer For i = 7 To 44 .Range("G" & i).Value = 0 .Range("H" & i).Value = 0 For j = 1 To c .Range("G" & i).Value = (.Range("G" & i).Value + .Cells(i, s).Offset(0, j)) .Range("H" & i).Value = (.Range("H" & i).Value + .Cells(i, s).Offset(0, (j + 1))) j = j + 1 Next j Next i End With End Sub 

我有一个范围G7:H44 ,需要填充范围AA7:AX44但是..它只是AA7:AX44其他列:

 If Month.Value = "January" G7 = SUM(AA7) H7 = SUM(AB7) ... G44 = SUM(AA44) H44 = SUM(AB44) End If If Month.Value = "April" G7 = SUM(AA7, AC7, AE7, AG7) H7 = SUM(AB7, AD7, AF7, AH7) ... G44 = SUM(AA44, AC44, AE44, AG44) H44 = SUM(AB44, AD44, AF44, AH44) End If 

但是我所拥有的macros已经太长了..有没有其他办法可以做到这一点?

您可以尝试将计算设置为手动并禁用ScreenUpdating的常规vba优化方法。

 Dim calc As XlCalculation calc = Application.Calculation Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.ScreenUpdating = True Application.Calculation = calc 

把你的代码或函数调用Application.Calculation = xlCalculationManualApplication.ScreenUpdating = True

这是我以前的post

作为后续,您还可以将Application.EnableEvents设置为false(并随后将其返回为true),以根据您的过程所做的工作而潜在地节省时间。

我不知道这是我更改了我的PopulateYearlyValues或什么,但现在我遇到了另一个问题,

G7 = Actual | H7 = Plan | I7 = (G7 - H7) | J7 =IF(OR(G7 = 0, I7 = 0), 0, I7 / G7)

由于我改变了上面的子,当月份select改变时, I7J7保持不变G7H7虽然正在更新。

我find了一个修复,但似乎应该有一个更好的办法..

 For i = 7 To 44 For j = 1 To Application.WorksheetFunction.Match(UCase(Target.Value), .Range("AA5:AX5"), 0) .Range("I" & i).Value = "=G" & i & "-H" & i &")" .Range("J" & i).Value = "=IF(OR(G" & i & "=0, H" & i & "=0), 0, I" & i & " / G" & i & ")" Next j Next i 

我可以build议一个公式:SUMIF将基于一个标准进行总结

 SUMIF($AA$99:$AX$99;"=1";$AA7:$AX7) ' for G column SUMIF($AA$99:$AX$99;"=2";$AA7:$AX7) ' for H column 

行99中的单元格(可隐藏 )具有基于Month.Value和列的条件,产生“0”(不合计总和),“1”(合计到G列)或“2”(合计为H栏):

 =IF(Month.Value>=ROUNDDOWN((COLUMN(AA3)-25)/2;0);2-MOD(COLUMN(AA3);2);0) 

问候

阿伦