2014-07-14 175 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