2011-06-20 117 views
2

我想在Excel的VBA中构建一个简单的宏,它将SUM [合并]具有相同名称(第一列中的值)的所有行。 因此,例如如何使用VBA在Excel中合并/合并相似的行?

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圣经。

+0

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

回答

3

尝试财产以后这样的:

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 
+0

谢谢!这完美地解决了迭代问题。 但我仍然打开更坚实的解决方案(如果有的话)。 – gime

2

这段代码更容易阅读和做这项工作:

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 
+0

如果要合并的行不相邻,是否有任何方法可以执行此操作? – Brian

0

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

+1

不会产生无限循环吗? –

0

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

您可以从包含重复值的表格打开表格开始。 按照步骤:

  1. 将Excel的光标,您希望合并后的Data.Then,进入数据选项卡>合并。 enter image description here
  2. 合并对话框将出现。
  3. 这里输入具有重复值的表格并单击添加以添加这些值。
  4. 然后,选择具有重复值的行/列。在这里它的左栏。 enter image description here
  5. 只需点击确定即可完成。 enter image description here