VBA循环和变量 - 查找空行并将行号放在变量中

时间:2012-11-15 12:05:01

标签: vba excel-vba excel

enter image description here我正在编写一个循环Excel数据的宏,它按列A排序,如果coulmn的值与上面的值不同,则插入一个空行。这将按组A分组我的数据。

然后,我想要对分隔组的列d的值求和。我的大部分代码都在下面工作,但是我遇到麻烦的是startCell变量。我知道我想做什么,但不能正确理解,有人可以帮助总结那些个人群体。

非常感谢

Sub PutARowInWithFormula()
  Range("A3").Select

  Dim startCell As Integer
  Dim endCell As Integer

  startCell = 3
  endCell = 0

  Do Until ActiveCell.Value = ""
    If ActiveCell.Value = ActiveCell.Offset(-1, 0).Value Then
      ActiveCell.Offset(1, 0).Select
    Else
      ' I need the bottom code to execute only once in the loop
      ' startCell = ActiveCell.Row
      ActiveCell.EntireRow.Insert

      ' move to column d
      ActiveCell.Offset(0, 3).Select

      endCell = ActiveCell.Row - 1
      ActiveCell.Formula = "=Sum(d" & startCell & ":d" & endCell & ")"

      ' move back to column a
      ActiveCell.Offset(0, -3).Select

      'move 2 rows down
      ActiveCell.Offset(3, 0).Select
    End If
  Loop
End Sub

1 个答案:

答案 0 :(得分:3)

我太想知道为什么你不使用数据透视表或只是使用工作表函数创建它,这也是可能的。此外,我不喜欢这种选择尝试,但它是你的方式,我尊重这一点。它甚至似乎是一个非常好的例子,当它可能是想法时使用它们。因为现在,我想到的任何其他方式,在VBA中这样做,似乎更复杂。

所以这是修补你的代码:

Sub PutARowInWithFormula()
  Range("A2").Select

  Do Until ActiveCell.Value = ""
    If ActiveCell.Value = ActiveCell.Offset(-1, 0).Value Then
      ActiveCell.Offset(1, 0).Select
    Else
      ActiveCell.EntireRow.Insert

      'you can use the offset directly
      'by using an improved formula, you do not need to know start and end row.
      ActiveCell.Offset(0, 3).Formula = _
        "=SUMIF(A:A,OFFSET(INDIRECT(""A""&ROW()),-1,0),D:D)"

      ' move back to column a and move 2 rows down
      ActiveCell.Offset(2, 0).Select
    End If
  Loop
End Sub

修改

好的,找到了一种更简单的方式来做几乎同样的事情:

Public Sub demo()
  UsedRange.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=4
End Sub

此功能也可通过功能区菜单 - >获得。数据 - > sumsum

要避免出现错误消息,您只需要为数据设置标题行,例如:

日期| NAME | COUNTER | VALUE