【问题标题】:Adding a sum next to each line that says sub total在每行旁边添加一个总和,表示小计
【发布时间】:2017-02-10 01:17:12
【问题描述】:

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

我想添加一个代码,以便将上面的所有行添加到显示“小计”的前一行之前,将数据汇总到显示“小计”的行中

例如

清洁 8000
横扫2000
垫料 5000
SUB TOTAL 15000 Chipseal 6000
沥青 3000
铣削 5000
SUB TOTAL 14000 TOTAL 29000

帮助!

【问题讨论】:

  • 在不知道您的代码/公式的哪一部分给您带来问题的情况下,我们真的无法提供帮助。 (除非,也许,你的“帮助!”被解释为“有人请为我做这件事,这样我就可以高枕无忧了。”)
  • 您在推断“帮助”方面是部分正确的。我还没有写出正确的代码。我设置了一个 long 来查找包含“小计”的行,但是我不知道如何编码范围,该范围将拾取“小计”的两行之间的值,然后移动到下一行里面有“小计”。
  • IMO 最好设置一个变量作为小计,另一个变量作为总计。循环遍历每一行,或者(1)如果它不是“SUB TOTAL”或“TOTAL”,则将该行中的值添加到两个变量中,或者(2)如果它是“SUB TOTAL”,则将其写入该行小计变量,然后将小计变量设置为零或 (3) 如果它是“总计”,则将总变量写入行。

标签: excel sum excel-2013 vba


【解决方案1】:

尝试发布的代码。我假设您的项目描述在“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

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

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

【讨论】:

  • 我在最后一行 "cells(thisrow+1,2)..." 上出现错误,即使我修改它以匹配我的工作表。它运行错误 1004,但不幸的是,我不知道在哪里进行编辑,因为我之前没有使用过正则表达式或集合......不过我会坚持下去,谢谢。
  • 我已将 .value 添加到该行并更新了上面的代码 - 看看是否可行。
  • 仍然没有。 :(
  • 通过在定义 totStr = " =SUM(" 的字段中添加一个空格来停止错误。但是,现在它只在一个单元格中返回该文本,而不是其他任何内容。哦,我会坚持下去:)
  • 确保您启用了正则表达式(请参阅post - 即旁边有 454 的那个 - 按照那里列出的说明进行操作)。然后再试一次。同时让我知道您正在运行哪个版本的 excel(您可以按照说明进行操作 here
【解决方案2】:

别担心,伙计们,我找到了一个更简单的代码,它遍历每一行寻找“TOTAL”并在该行中添加一个求和公式。然后起始行变为小计行下方的行,该过程再次开始。

本例中ws定义为工作表,firstRow和x是整数,lastrow是long

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

【讨论】:

    猜你喜欢
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多