2014-07-14 126 views
1

我不是很熟悉編碼,所以這可能不是正確的術語,但我試圖做一個非常簡單的事情,總和範圍。我的意思是我想:在VBA中總結範圍

Sub Test() 
Range("E2:E9") = Range("D2:D9") + Range("G2:G9") 
End Sub 

這工作得很好,如果我只用:

Sub Test() 
Range("E2") = Range("D2") + Range("G2") 
End Sub 

從這一切我希望發生的就是在電池E2-E9一切都等於其相對添加D_和G_。因此E4將等於D4 + G4。

這只是一個100 +行更大的項目的測試,這就是爲什麼我不想手動完成所有項目。

也許我需要使用某種數組添加或什麼?我不確定。

回答

1

使用Range Object Formula屬性是這樣的:

EDIT1:避免循環裁判的什麼馬克Balhoff指出

With Range("E2:E9") 
    .Offset(0, 2).Value = .Offset(0, 2).Value '~~> avoid circular ref 
    .Formula = "=D2+G2" 
    .Value = .Value 
    .Offset(0, -1).ClearContents 
    .Offset(0, 2).Formula = "=E2" '~~> if you still want to have it reflected in G 
End With 

也可以添加到dË直接不使用輔助柱G.

With Range("E2:E9") 
    .Offset(0, -1).Copy '~~> copy what's in D 
    .PasteSpecial xlPasteValues, xlPasteSpecialOperationAdd '~~> add in E 
    .Offset(0, -1).ClearContents '~~> clear whatever's in D 
End With 
+0

這並沒有完全奏效。我也忘記了我希望它繼續計數的事實。對不起,請儘快輸入。 我還需要的是,如果刪除D2中的內容,E2中的值不會改變。所以,我需要總結當前的數字,並使它們始終保持在E2中,所以當新的數字輸入到D2時,E2會增加那個數字 – David

+0

@David我很困惑:)你是否想增加數值E作爲D改變或不改變。你的評論似乎矛盾的方式。如果您不希望它改變,只需在運行宏時更改它,請參閱我的編輯。 – L42

+0

讓我100%重新開始,因爲我可能從一開始就把這一切都弄錯了。 我希望能夠跟蹤零件的重建。所以說,A部分今天得到了重建,我希望能夠在一個單元格中放置1,並且總共有多少次我放置了一個1進行跟蹤。因此,稍後我將製作一個宏按鈕,在每個「1」之後清除該輸入單元格。因此,每一次修理零件時,我們將總共進行多少次而不必手動計算數學。 這是否更有意義? 我原來的方式工作,但只有一行一行,這是不好的代碼。 – David

4

這裏是你會怎麼做它作爲一個陣列功能:

Range("E2:E9").FormulaArray = "=D2:D9+G2:G9" 

但陣列功能,可笨重,所以你可能只想做它作爲單細胞公式:

Range("E2:E9").Formula = "=D:D+G:G" 

的Excel做一個神奇的一點,使該公式工作。如果你想要明確:

Range("E2:E9").FormulaR1C1 = "=RC[-1]+RC[2]" 
+0

+1。我對Range(「E2:E9」),Formula =「= D:D + G:G」是如何工作感興趣。 – Horaciux

+0

IDK但我認爲這並沒有解決@MarkBalHoff指出的循環引用。對upvoters和rdhs沒有冒犯,但我仍然會讚揚Mark。如果他要發表評論作爲答案,我很樂意刪除我的:) – L42

0

你可以做一個自定義公式來做到這一點。

例如,要總結A1:A10B1:B10,需要在C1的結果:C10(做筆記,你會在這裏需要相同的行數,兩者垂直)

Sub AddRanges(Rng1 As Range, Rng2 As Range, ResultRng As Range) 
    Dim i As Long, N As Long 
    N = Rng1.Rows.Count 

    For i = 1 To N 
     ResultRng(i, 1).Value = Rng1(i, 1).Value + Rng2(i, 1).Value 
    Next i 
End Sub 

該公式調用上述子程序

Sub TestMyFormula() 
    Dim RngA As Range, RngB As Range, RngC As Range 
    Set RngA = ActiveSheet.Range("A1:A10") 
    Set RngB = ActiveSheet.Range("B1:B10") 
    Set RngC = ActiveSheet.Range("C1:C10") 

    Call AddRanges(RngA, RngB, RngC) 

End Sub