在VBA中滚动的总和

问题描述:

我想在vb中使用excel创建滚动的12个月总和。数据的最后一列是动态的,所以我创建了一个变量来存储每次列号。然后我尝试创建一个循环,输出前12个单元格的总和,并移动到下一个单元格,直到它达到12个计算单元格。但是这不起作用...有什么显而易见的,我做错了?谢谢!在VBA中滚动的总和

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 
+1

写可能不是这里的问题,但是当使用范围时,您应该始终指定工作表... –

+0

不工作,不是对问题的很好描述。你会得到什么错误?或者它做了什么? –

+0

我只发布了我添加的代码片段来完成滚动总和。此代码位于循环中,循环通过工作表并执行多个任务。其余的代码工作正常,但是当我添加我发布的代码时,它不会做任何不同的事情。我本来期望第15行的一组单元格有总和,但我什么都没有。 – johankent30

能在一个更合适的方法进行,但这个工程

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。我'd建议使用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 
+0

好的,谢谢,问题是我的数据从SQL数据库生成,所以我想在数据结束后自动运行我的分析,它不总是在相同的位置,否则我只会使用一个简单的公式 – johankent30

+0

您的修改后的代码是否可以完成这项工作?你也可以编程来填充公式而不是数值 – Tom

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

您的代码相当复杂,但也许您应该使用xlToRight而不是xlToLeft来查找最后一列。

如果您想使用VBA,可以尝试使用WorkSheetFunction.offset,将其放入范围变量中,然后对该范围进行求和。

+0

如果存在空单元格,'xlToRight'可能会错过OPs范围中的最后一列。因此,使用'xlToLeft' – Tom