2010-06-17 103 views
3

現在我有一個宏PopulateYearlyValues但在我看來,它採取的方式太長加快Excel宏?

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 

我有需要用的範圍AA7:AX44SUM,但被填充的範圍G7:H44 ..它只是每隔一列:

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 

但是我的宏已經太長了..有沒有其他方法可以做到這一點?

+1

你有關閉Application.ScreenUpdate這個功能呢? – Tommy 2010-06-17 12:02:05

回答

4

您可以嘗試將計算設置爲手動並禁用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之間

This is from my previous Post

+0

非常感謝。該鏈接還通過刪除另一個子文件中的另一個循環來幫助我。 (.Cells(7,2),.Cells(44,3))。Value = .Range(.Cells(7,m),.Cells(44,(m + 1) )。值 我是一名PHP開發人員,被要求在Excel中製作一些宏。以前從未這樣做過。 – 2010-06-17 12:27:21

+0

另一種加速是儘可能使用數組而不是範圍,特別是如果這些公式中的值不是不會改變宏的過程,將數組設置爲等於範圍,循環訪問數組,然後將範圍設置爲等於數組。 – Dunn 2015-09-14 12:11:13

1

作爲後續行動,您還可以設置Application.EnableEvents爲假(並隨後將其返回到真正的)潛在根據你的程序做些什麼來節省時間。

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

問候

阿倫