2017-07-26 485 views
1

是否有更优雅(更简单)的方式将变量放入.formula中?我不想用.formulaR1C1VBA - .formula中的变量

我有这样的代码:

Range("C8").Select 
Selection.End(xlDown).Select 
PosR = ActiveCell.Row 
KonR = PosR - 2 
Range("N" & PosR).Select 
aAddress = Range("$N$9").Address & ":" & Range("$N$" & KonR).Address 
ActiveCell.Formula = "=SUM(" & aAddress & ")" 

很显然,我希望把=SUM($N$9:$N$101)(101是最后一个单元负2)转换成细胞和这个代码的工作。但我只想确保这是最简单的方法。

回答

1

您可以使用以下(代码不使用SelectActiveCell

PosR = Range("C8").End(xlDown).Row 
KonR = PosR - 2 

Range("N" & PosR).Formula = "=SUM(" & Range("$N$9").Address & ":" & Range("$N$" & KonR).Address & ")" 

或者,备受simplier版本:

Range("N" & PosR).Formula = "=SUM($N$9:$N$" & KonR & ")" 
3

最简单的方法就是跳过所有的选择和那些变量

PosR = Range("C8").End(xlDown).Row 
Range("N" & PosR).Formula = "=SUM($N$9:$N$" & PosR - 2 & ")" 

编辑:要更明确,在最简单的的方法是使用FormulaR1C1但你说你不想,所以...

+0

37打我吧秒:) :) –

+0

我们应该提到'Range(“C8”)。End(xlDown).Row'不会总是*找到最后一个使用的行,我认为他真的想要,因为他说“* 101是最后一个细胞减2 *“。因此'Range(“C”&Rows.Count).End(xlUp).Row'会更好。 –

+0

@Peh可能会也可能不会是真的,但我认为它只是分散了实际问题,所以我忽略了它。 :)另外,'End(xlUp)'有它自己的问题。 – Rory

1

那么你应该尝试avoid using Select in VBA。你已经有了一个变量在.Formula实际包含约一个简单的,因为它得到,但你的整个代码可以简化为:

PosR = Range("C8").End(xlDown).Row 
Range("N" & PosR).Formula = "=SUM($N$9:$N$" & PosR - 2 & ")" 

真的是你应该完全限定的范围太大,像这样

With ThisWorkbook.Sheets("Sheet1") 
    PosR = .Range("C8").End(xlDown).Row 
    .Range("N" & PosR).Formula = "=SUM($N$9:$N$" & PosR - 2 & ")" 
End With 

而且,如果您在C列中有空白单元格,那么您使用xlDown将无法​​找到最后一个单元格。你可能想看看ways of finding the last cell in VBA或者干脆使用

' Again, preferably fully qualified 
Range("C" & Rows.Count).End(xlUp).Row 
0

Range("$N$9").Address给出确切"$N$9"

Range("N9").Address也一样。因此,这有点过分。查看下面示例中的前两个debug.print。

因此,一旦你计算最后一排和值分配给它lngLast,就可以得到这样的公式: "=SUM(N9:N" & lngLast & ")"

Option Explicit 
Public Sub TestMe() 

    Dim strA  As String 
    Dim lngLast  As Long 

    strA = Range("$N$9").Address 
    Debug.Print strA = "$N$9" 

    strA = Range("N9").Address 
    Debug.Print strA = "$N$9" 

    lngLast = Range("N" & Rows.Count).End(xlUp).Row - 2 
    ActiveCell.Formula = "=SUM(N9:N" & lngLast & ")" 

End Sub 

Good morning, everyone :)