使用.formula对动态范围中的值求和

时间:2013-11-15 15:16:54

标签: excel vba excel-vba

我创建了一个宏来更改原始excel文件的布局,并向用户显示一些有用的信息。但我现在被困住了。

我想显示列中某些单元格的总和,但是总和所在的单元格和列本身是动态设置的。

我的布局如下:

        Year1         Year2         Year3 
Sum1     100            
Sum2     50             48     
Sum3                    72            81   
Sum4                                  26
------------------------------------------
Total

我想在每年的总计行中显示(sum1,sum2,sum3,sum4)的总和。 问题是我的年份是根据参数的值动态设置的(即我可以有2年,3年或5年)。

我知道我可以使用Range.WorksheetFunction.Sum来做,但问题是我的值在使用宏后会受到一些更改,如果我使用此函数,则值不会随后更改。

这就是为什么我想使用Range.Formula函数来显示这些值,因为我可以输入总和,就像我对表单中已有的值一样。

但与这些值(即易于选择的唯一列中的值的总和)不同,我无法动态选择列。

如果您不清楚,我试图让您了解我想要做的事情:

For i=0 to Duration-1
Sheet2.Range("D" & RNumber + 7 + Duration).Offset(0,1+2*i).Formula="=SUM(Sheet2!" & Range("D" & RNumber + 6).Offset(0,1+2*i) & ":Sheet2!" & Range("D" & RNumber + 6 + Duration).Offset(0,1+2*i) & ")"
Next i

但它不起作用,因为总和无法识别范围。我知道我应该有像

这样的东西
"=SUM(Sheet2!E" & Firstrow & ":Sheet2!E" & Lastrow & ")"

然后我将无法动态选择我的列。

1 个答案:

答案 0 :(得分:1)

看起来您的问题源于这样一个事实:对于列,您不能像"Sheet2!" & D+3+1那样为行执行"Sheet2!D" & 5+6+2。我的观点是,这是疯狂的A1参考风格造成的众多缺陷之一,从根本上解决这个问题的最好方法是在宏的开头简单地切换到R1C1。

With Application
    If .ReferenceStyle = xlA1 Then
        .ReferenceStyle = xlR1C1
    End If
End With

有一天,我计划开始一项非营利性的努力,以彻底摆脱世界上错误的$A4:B$3疯狂。但是有太多人习惯了A1。如果你向你的老板或同事发送一个包含数字列表的电子表格,她可能会感到不安或困惑。

所以另一个解决方案是在SUM中引入一些ADDRESS()元素。 ADDRESS函数仅使用数字(以及表格参考的字符串),并且将以您想要的任何样式返回单元格引用。

For i=0 to Duration-1
    Sheet2.Cells(RNumber+7+Duration, 5+2*i).Formula = _
    "=SUM(INDIRECT(ADDRESS(" & RNumber + 6 & "," & 5+(2*i) & ",1,TRUE,""Sheet2""),1):" _
    & "INDIRECT(ADDRESS(" & RNumber + 6 + Duration & "," 5+(2*i) & _ 
    ",1,TRUE,""Sheet2""),1))"
Next i

或者你可以使用Application.WorksheetFunction.Address()并避免让INDIRECT()混乱你的公式。