现在我有一个宏PopulateYearlyValues
但在我看来它已经花了太长时间
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
需要填充范围SUM
的{{1}}但是......它只是每隔一列:
AA7:AX44
但是我所拥有的宏太长了......还有其他办法吗?
答案 0 :(得分:4)
您可以尝试通常的vba优化方法,将计算设置为手动并禁用ScreenUpdating。
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
答案 1 :(得分:1)
作为后续操作,您还可以将Application.EnableEvents设置为false(并随后将其返回true),以便根据您的过程执行操作来节省时间。
答案 2 :(得分:0)
当我更新PopulateYearlyValues
或者现在我遇到另一个问题时,我无法判断这是否是我改变的内容。
G7 = Actual | H7 = Plan | I7 = (G7 - H7) | J7 =IF(OR(G7 = 0, I7 = 0), 0, I7 / G7)
由于我更改了上述子版,因此{月}选择更改时I7
和J7
保持不变。G7
和H7
正在更新。
我找到了解决方法,但似乎应该有更好的方法..
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
答案 3 :(得分:0)
我可以建议一个公式: 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)
此致
阿伦