【问题标题】:Rolling Sum in VBAVBA中的滚动求和
【发布时间】:2017-08-25 14:12:17
【问题描述】:

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

【问题讨论】:

  • 可能不是这里的问题,但是在使用范围时您应该始终指定工作表...
  • 不工作,不是对问题的良好描述。你得到什么错误或者它不应该做什么?
  • 我只发布了我为完成滚动总和而添加的代码的 sn-p。此代码在一个循环中,循环通过工作表并执行多个任务。其余代码工作正常,但是当我添加我发布的代码时,它并没有做任何不同的事情。我本来希望第 15 行中的一组单元格有总和,但我什么也没得到。
  • 执行这部分代码时的ActiveSheet是什么?这就是为什么您应该始终指定工作表的原因。
  • On Error Resume Next 应该很少使用。并且应该在不久之后跟进On Error Goto 0 以重置错误处理,否则您会错过代码失败的原因。

标签: excel vba sum


【解决方案1】:

可以以更简洁的方式完成,但这可行

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 Sheet 中显示为 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

【讨论】:

  • 好的,谢谢,问题是我的数据是从 SQL 数据库生成的,所以我想在数据过来后自动运行我的分析,它并不总是在同一个位置,否则我只会使用一个简单的公式
  • 那你修改后的代码能完成这项工作吗?你也可以用公式而不是值来填充单元格
【解决方案2】:

首先,我建议您不要为此使用 VBA。相反,使用内置的 OFFSET 函数,像这样。

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

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

【讨论】:

  • 如果有一个空单元格,xlToRight 可能会错过 OPs 范围中的最后一列。因此使用xlToLeft
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-05
  • 2012-07-27
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
相关资源
最近更新 更多