【问题标题】:VBA - How to add an absolute sum row at the end of the range in excelVBA - 如何在excel范围的末尾添加一个绝对总和行
【发布时间】:2016-05-08 23:12:14
【问题描述】:

我有一个 Excel 电子表格,我想在一个范围的末尾添加一个绝对总和行,如图所示。

我正在尝试通过编写宏来实现这一点。我附上了我尝试在范围末尾添加绝对总和行的代码。

MAX = 1502
Src = 0
N = 0
Freq = 0.05
Freqmax = 1

Op = ActiveSheet.Range("K2")

For Freq = 0.05 To Freqmax Step 0.01

K = 0.5 * R * Sin(WorksheetFunction.Pi * Freq)

C1 = 0.5 * (1 - K) / (1 + K)
C2 = (0.5 + C1) * Cos(WorksheetFunction.Pi * Freq)
C3 = (0.5 + C1 - C2) * 0.25

ma0 = 2 * C3
ma1 = 2 * 2 * C3
ma2 = 2 * C3
mb1 = 2 * (-C2)
mb2 = 2 * C1

For Src = 0 To MAX Step 1

    Inp = ActiveSheet.Range("K" & 2 + Src)

    Op = ma0 * Inp + ma1 * mx1 + ma2 * mx2 - mb1 * my1 - mb2 * my2
    mx2 = mx1
    mx1 = Inp
    my2 = my1
    my1 = Op

    ActiveSheet.Range("L" & 2 + Src) = Op
    ActiveSheet.Range("M" & 2 + Src) = ActiveSheet.Range("L" & 2 + Src) - ActiveSheet.Range("K" & 2 + Src)

Next

LastRow = ActiveSheet.Range("M" & 2 + Src).End(xlDown).Row
Cells(LastRow + 2, "M").Formula = "=SUMPRODUCT(ABS(M2:M" & LastRow & ")"

ActiveSheet.Columns("L:M").Insert Shift:=xlToRight

Next

我的代码的工作方式是在循环结束时增加频率并将计算向右移动,以便我可以插入下一个频率值的值。

所以我要做的是计算一个范围的绝对和。

但我在这行代码中遇到错误“应用程序定义或对象定义错误”。

Cells(LastRow + 2, "M").Formula = "=SUMPRODUCT(ABS(M2:M" & LastRow & ")"

谁能告诉我这样做的正确方法是什么?

【问题讨论】:

  • 用列号替换你的“m”?
  • Cells(LastRow + 2, "2").Formula = "=SUMPRODUCT(ABS(M2:2" & LastRow & ")" 这边?
  • 这样...ActiveSheet.Cells(LastRow + 2, 13).Formula = "=SUMPRODUCT(ABS(M2:2" & LastRow & ")",但请注意这是一个问题...试试看它是否有效。
  • 感谢您的回复。但仍然遇到同样的错误。
  • 我看到你说 NEXT,但你真的需要说 NEXT SRC 和 NEXT Freq 吗?我也没有看到 MAX 被定义为不应该有所作为。而不是说活动表,您可能想定义哪个表,那么您可能不只是深思熟虑。我也不相信你需要说STEP 1,我相信它默认一步一步,如果你做不同的事情你只需要一步。

标签: vba excel excel-formula


【解决方案1】:

当您尝试确定此代码行中的 lastRow 时,M2 下方没有任何内容。

lastRow = .Range("M" & 2 + src).End(xlDown).Row

这意味着 lastRow 将是 1048576(工作表上的行数)。当您尝试在下一行代码(在 2 个位置)中将 2 添加到该数字时,

.Cells(lastRow + 2, "M").Formula = "=SUMPRODUCT(ABS(M2:M" & lastRow & ")"

...您正在尝试 a) 使用位于工作表底部下方两行的单元格和 b) 尝试在公式中引用位于工作表外两行的单元格。

您可以通过自下而上的方式解决此问题。

lastRow = .Range("M" & rows.count).End(xlUp).Row

但是,我质疑这是否是列小计所在的位置。通过将这两行代码移到内部循环之外并且在插入新列之前可以引用更好的位置。

    Next src

    lastRow = .Range("M" & rows.count).End(xlUp).Row
    .Cells(lastRow + 2, "M").Formula = "=SUMPRODUCT(ABS(M2:M" & lastRow & "))"
    .Columns("L:M").Insert Shift:=xlToRight
Next freq

附录:SUMPRODUCT function 缺少右括号。

【讨论】:

  • 该死的那些缺少的括号!
  • 非常感谢@Jeeped 的帮助。它按预期工作。完美的! :)
猜你喜欢
  • 2012-05-31
  • 2014-11-21
  • 2013-10-14
  • 2013-07-25
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
相关资源
最近更新 更多