VBA中的滚动总和

时间:2017-08-25 14:12:18

标签: excel vba sum

我正在尝试使用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

2 个答案:

答案 0 :(得分:0)

首先,我建议你不要使用VBA。相反,使用内置的OFFSET函数,就像这样。 I have used width argument in the offset but one canuse height for a diff direction

您的代码非常复杂,但也许您应该使用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)并拖动其余部分你的范围

,并提供:

Results

公式: Formulas

以下代码将在一行中为第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