【问题标题】:How to SUM / merge similar rows in Excel using VBA?如何使用 VBA 在 Excel 中求和/合并相似的行?
【发布时间】:2011-09-18 13:54:32
【问题描述】:

我正在尝试在 VBA 中为 Excel 构建一个简单的宏,它将 SUM [合并] 所有具有相同名称的行(第一列中的值)。 比如

ExampleRowA 1 0 1 1 3 4
ExampleRowA 2 1 2 2 1 0
ExampleRowC 9 7 7 7 2 5

结果应该是这样的

ExampleRowA 3 1 3 3 4 4
ExampleRowC 9 7 7 7 2 5

我们可以假设需要合并的行不散乱,只能一个接一个出现。

我做了这样的事情,它几乎可以工作,除了我必须运行它两次。

LastRow = ActiveSheet.UsedRange.Rows.Count
Set r = ActiveSheet.UsedRange.Resize(1)
With Application.WorksheetFunction


     For iRow = 2 To LastRow
        If Cells(iRow, 1) = Cells(iRow + 1, 1) Then
            LastCol = r(r.Count).Column
            SumCol = LastCol + 1
                For iCol = 2 To SumCol
                Cells(iRow, iCol) = .Sum(Range(Cells(iRow, iCol), Cells(iRow + 1, iCol)))
                Next iCol
            Rows(iRow + 1).Delete
        End If
     Next iRow

End With

我用其他脚本语言做过一些编程,但对 VB/VBA 很陌生,不知道它的可能性/限制。

在其他语言中,我可能会使用数组,但我不明白它们在这里的工作方式。我不能否认,由于时间限制,我更喜欢通过分析示例来学习,而不是阅读 500 多页的 VBA 圣经。

【问题讨论】:

  • 解决方案需要是宏吗?您是否考虑过使用 Excel 的内置电子表格功能?例如,如果提前知道第一列的可能值,则可以使用 SUMIF 工作表函数非常轻松地完成此操作。如果第一列的可能值提前知道,您可以使用数据透视表。

标签: vba excel merge rows


【解决方案1】:

对于您的问题,您不需要宏或任何 VBA 代码。

您可以首先打开包含重复值的表的工作表。 遵循步骤:

  1. 将 Excel 光标放置在您想要合并数据的位置。然后,转到数据选项卡 > 合并。
  2. 将出现合并对话框。
  3. 在此处输入包含重复值的表,然后单击添加以添加这些值。
  4. 然后,选择具有重复值的行/列。在此它的左列。
  5. 只需单击“确定”即可完成。

【讨论】:

    【解决方案2】:

    '如果你必须运行宏两次,idk put a 1: on top of your macro and on the bottom put goto 1 '这将为你运行两次 '或者你可以在不同的宏中调用它两次。由你决定

    【讨论】:

    • 不会产生无限循环吗?
    【解决方案3】:

    这段代码更容易阅读并且可以完成工作:

    Sub Macro1()
        Dim ColumnsCount As Integer
    
        ColumnsCount = ActiveSheet.UsedRange.Columns.Count
    
        ActiveSheet.UsedRange.Activate
    
    
        Do While ActiveCell.Row <= ActiveSheet.UsedRange.Rows.Count
            If ActiveCell.Value = ActiveCell.Offset(1, 0).Value Then
                For i = 1 To ColumnsCount - 1
                    ActiveCell.Offset(0, i).Value = ActiveCell.Offset(0, i).Value + ActiveCell.Offset(1, i).Value
                Next
                ActiveCell.Offset(1, 0).EntireRow.Delete shift:=xlShiftUp
            Else
                ActiveCell.Offset(1, 0).Select
            End If
        Loop
    
    
    End Sub
    

    【讨论】:

    • 如果要合并的行不相邻,有什么办法吗?
    【解决方案4】:

    试试这样的:

    LastRow = ActiveSheet.UsedRange.Rows.Count
    Set r = ActiveSheet.UsedRange.Resize(1)
    With Application.WorksheetFunction
    
        For iRow = LastRow-1 to 2 step -1
            do while Cells(iRow, 1) = Cells(iRow + 1, 1) 
                LastCol = r(r.Count).Column
                SumCol = LastCol + 1
                   For iCol = 2 To SumCol
                   Cells(iRow, iCol) = .Sum(Range(Cells(iRow, iCol), Cells(iRow + 1, iCol)))
                   Next iCol
                Rows(iRow + 1).Delete
            loop
        Next iRow
    
    End With
    

    【讨论】:

    • 谢谢!这完美地解决了迭代问题。但我仍然愿意寻求更可靠的解决方案(如果有的话)。
    猜你喜欢
    • 2018-09-26
    • 2017-11-16
    • 2017-03-10
    • 2012-05-31
    • 2012-04-18
    • 1970-01-01
    • 2012-05-15
    • 2016-06-14
    • 2021-07-26
    相关资源
    最近更新 更多