所以我有一组每月更新的数据。在电子表格中,数据按行块分组,每个块后面有一个小计的行,底部的行总计所有小计。
我想添加一个代码,以便将数据汇总到“sub-total”所在的行中,方法是添加上面的所有行,直到上一行显示“sub-total”
E.g。
清洁8000
清扫2000年
垃圾5000
SUB TOTAL 15000< ---以上三者的总和
Chipseal 6000
沥青3000
铣削5000
SUB TOTAL 14000< ---芯片密封,沥青和铣削的总和
总计29000< ---小计总数
HELP!
答案 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)
在这种情况下,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