代码之家  ›  专栏  ›  技术社区  ›  N. Lucas

加快Excel宏的速度?

  •  3
  • N. Lucas  · 技术社区  · 14 年前

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

    但我的宏太长了。还有别的办法吗?

    4 回复  |  直到 9 年前
        1
  •  4
  •   Community trashgod    7 年前

    您可以尝试将计算设置为手动并禁用屏幕更新的常用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

    This is from my previous Post

        2
  •  1
  •   Michael    14 年前

    作为后续操作,您还可以将application.enableEvents设置为false(然后将其返回true),以根据您的过程所做的操作节省时间。

        3
  •  0
  •   N. Lucas    14 年前

    我不知道这是不是我在更新我的 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
    
        4
  •  0
  •   Alen    13 年前

    我能推荐一个公式吗? SUMIF将根据一个标准求和

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

    第99行中的单元格(可以是 隐藏的 )条件基于 月值 和列,产生“0”(尚未求和)、“1”(求和到G列)或“2”(求和到H列):

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

    当做

    阿伦

    推荐文章