我正在编写一个循环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
答案 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