加快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 = xlCalculationManual
和Application.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改变时, I7
和J7
保持不变G7
和H7
虽然正在更新。
我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)
问候
阿伦