加速Excel宏?

时间:2010-06-17 12:00:30

标签: excel vba excel-vba

现在我有一个宏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

但是我所拥有的宏太长了......还有其他办法吗?

4 个答案:

答案 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 = xlCalculationManualApplication.ScreenUpdating = True

之间进行代码或函数调用

This is from my previous Post

答案 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)

由于我更改了上述子版,因此{月}选择更改时I7J7保持不变。G7H7正在更新。

我找到了解决方法,但似乎应该有更好的方法..

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)

此致

阿伦