如何使用 VBA 在 Excel 中求和/合并相似的行?

Posted

技术标签:

【中文标题】如何使用 VBA 在 Excel 中求和/合并相似的行?【英文标题】:How to SUM / merge similar rows in Excel using VBA? 【发布时间】: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 工作表函数非常轻松地完成此操作。如果第一列的可能值提前知道,您可以使用数据透视表。 【参考方案1】:

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

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

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

【讨论】:

【参考方案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

【讨论】:

谢谢!这完美地解决了迭代问题。但我仍然愿意寻求更可靠的解决方案(如果有的话)。

以上是关于如何使用 VBA 在 Excel 中求和/合并相似的行?的主要内容,如果未能解决你的问题,请参考以下文章

excel里面我想 用VBA实现调用另一个工作簿中的数据怎么解决

[求助] excel VBA多条件求和代码优化

请教!excel单元格内的数值发生变化时如何保留它以前的值

在excel中如何将第一个工作表中的数据求和汇总到另一个表中

如何在Excel VBA中定义一个在窗体控件和模块中均能使用的变量?

Oracle如何将多次分组求和的数据合并到一张表上?