我创建了一个宏来更改原始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 & ")"
然后我将无法动态选择我的列。
答案 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()
混乱你的公式。