我正在尝试使用vb在excel中创建一个滚动的十二个月的总和。带数据的最后一列是动态的,所以我每次创建一个变量来存储该列号。然后我尝试创建一个循环,输出前12个单元格的总和并移动到下一个单元格,直到它达到12个计算单元格。但这不起作用......有什么明显的东西我做错了吗?谢谢!
Sub OSR_ReportComplete()
Dim lCol As Long
Dim p As Integer
lCol = Cells(7, Columns.Count).End(xlToLeft).Column
For p = 0 To 12
Range(Cells(15, lCol - p)).Value = Application.Sum(Range(Cells(7, lCol -
p), Cells(7, lCol - p - 12)))
Next p
End Sub
答案 0 :(得分:0)
首先,我建议你不要使用VBA。相反,使用内置的OFFSET函数,就像这样。
您的代码非常复杂,但也许您应该使用xlToRight而不是xlToLeft来查找最后一列。
如果要使用VBA,可以尝试使用WorkSheetFunction.offset,将其放入范围变量中,然后对该范围求和。
答案 1 :(得分:0)
可以用更简洁的方式完成,但这可行
Sub OSR_ReportComplete()
Dim lCol As Long
Dim p As Integer
lCol = Cells(7, Columns.Count).End(xlToLeft).Column
For p = 0 To 12
Cells(15, lCol - p) = Application.Sum(Range(Cells(7, lCol - p), Cells(7, lCol - p - 12)))
Next p
End Sub
此外,如果您的lCol评估值小于25,则会因为尝试引用小于1的列而导致其丢失。我建议使用Offset
而不是
但是,在excel公式中也可以很容易地完成滚动总计。假设您的第一个值在列A
中,并且您的日期在行1
中,在行2
中输入列A
=SUM($A$1:A1)
并拖动其余部分你的范围
,并提供:
以下代码将在一行中为第1行生成上面的公式,而不是执行循环。这是一个示例,因为我不了解代码中的工作表布局
Sub OSR_ReportComplete2()
With Range(Cells(1, 1), Cells(1, Columns.Count).End(xlToLeft))
.Offset(1, 0).Formula = "=SUM(" & .Cells(1).Address & ":" & Split(.Cells.Address(RowAbsolute:=False, ColumnAbsolute:=False), ":")(0) & ")"
End With
End Sub
这更容易用R1C1表示法编写(但是会在Excel表格的A1中显示)
Sub OSR_ReportComplete2()
With Range(Cells(1, 1), Cells(1, Columns.Count).End(xlToLeft))
.Offset(1, 0).FormulaR1C1 = "=SUM(" & .Cells(1).Address(ReferenceStyle:=False) & ":R[-1]C)"
End With
End Sub