我正在尝试在VBA for 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圣经。
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分:0)
'如果你必须运行两次宏,idk放一个
1:
on top of your macro and on the bottom put
goto 1
'那将为你运行两次
'或者你可以在另一个宏中调用它两次。由你决定
答案 3 :(得分:0)