如何使用 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中如何将第一个工作表中的数据求和汇总到另一个表中