在每行显示小计后添加一个总和

时间:2017-02-10 01:17:13

标签: excel-vba sum excel-2013 vba excel

所以我有一组每月更新的数据。在电子表格中,数据按行块分组,每个块后面有一个小计的行,底部的行总计所有小计。

我想添加一个代码,以便将数据汇总到“sub-total”所在的行中,方法是添加上面的所有行,直到上一行显示“sub-total”

E.g。

清洁8000
清扫2000年 垃圾5000
SUB TOTAL 15000< ---以上三者的总和
Chipseal 6000
沥青3000
铣削5000
SUB TOTAL 14000< ---芯片密封,沥青和铣削的总和
总计29000< ---小计总数

HELP!

2 个答案:

答案 0 :(得分:0)

尝试发布的代码。我假设您的商品说明位于“A”栏中,而您的费用位于“B”栏中。它的作用是在它找到的每个“SUB TOTAL”字符串旁边的“B”列中放置一个间接和(以忽略大小写的方式键入)。我还假设值从第1行开始,你可能不希望它这样做。我累积一个求和字符串并将其放在我找到的最后一个小计行之后的行中。每个小计单元格将被赋予青色背景和顶部边框。大概你可以从这一点开始继续修改它以满足你的需要。

Function findSubTotalRows(lastRow As Integer) As Collection
  Dim regEx As New RegExp
  Dim subTotCols As Collection

  regEx.Global = True
  regEx.IgnoreCase = True
  regEx.Pattern = "^SUB TOTAL$"

  Dim row As Integer
  Dim val As String
  Set subTotCols = New Collection
  For row = 1 To lastRow:
    val = Trim(Cells(row, 1).Value)
    Set mat = regEx.Execute(val)
    If mat.Count = 1 Then
      subTotCols.Add row
    End If
  Next

  Set findSubTotalRows = subTotCols
End Function


Sub sum_up_subtotals()
 Dim lastRow As Integer
 Dim cols As Collection

 ' Find last row in column and all sub total rows
 lastRow = Range("A1000").End(xlUp).row
 Set cols = findSubTotalRows(lastRow)

 Dim prevRow As Integer: prevRow = 0
 Dim numRng As Integer
 Dim totStr As String: totStr = "=SUM("
 For row = 1 To cols.Count:
   thisRow = cols(row)
   numRng = thisRow - prevRow - 1
   With Cells(thisRow, 2)
     .Formula = "=SUM(INDIRECT(ADDRESS(ROW()-" & CStr(numRng) & ",COLUMN())&"":""&ADDRESS(ROW()-1,COLUMN())))"
     .Interior.Color = vbCyan
     .NumberFormat = "$#,##0.00"
     .Borders(xlEdgeTop).LineStyle = xlContinuous
   End With
   prevRow = thisRow
   totStr = totStr & "B" & thisRow & ","
 Next

 totStr = Mid(totStr, 1, Len(totStr) - 1) & ")"
 Cells(thisRow + 1, 2).value = totStr

End Sub

这样做的好处是你可以在每个小计段中插入额外的行或添加新的小计段,运行宏,它应该显示正确的新总和。

它适用于我,但我只是尝试了你提供的数据。请注意,您必须启用正则表达式才能使其正常工作。

答案 1 :(得分:0)

不要担心别人,我找到了一个更简单的代码,它遍历每一行寻找" TOTAL"并在该行中添加总和公式。然后,起始行成为子总行下面的行,然后该过程再次开始。

在这种情况下,ws被定义为工作表,firstRow和x是整数,lastrow是长的

firstRow = 4
For x = 4 To lastRow
    If ws.Range("C" & x) Like "*TOTAL*" Then
        ws.Range("E" & x).Formula = "=sum(E" & firstRow & ":E" & x - 1 & ")"
        firstRow = x + 1
    End If
Next x