2012-11-15 47 views
1

enter image description here我正在寫一個宏,它循環顯示Excel數據,該數據按列A排序,並在coulmn的值不同時插入空行從上面的一個。這將我的數據分組在A列。VBA循環和變量 - 找到空行並將行號放入變量中

然後我想總結分隔組的列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

你能否在你的問題下面複製一些示例數據(通過更新它 - 而不是通過評論)?我的意思是屏幕顯示您需要排序/分組以及您期望的答案。 – bonCodigo

+1

你爲什麼不使用一個數據透視表,它可以按天總結你的總數? – brettdj

回答

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