首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用VBA在Excel中对相似行进行求和/合并?

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

Stack Overflow用户
提问于 2011-06-20 18:18:19
回答 4查看 18.5K关注 0票数 2

我正在尝试在VBA中为Excel构建一个简单的宏,它将对具有相同名称(第一列中的值)的所有行进行求和合并。举个例子

代码语言:javascript
复制
ExampleRowA 1 0 1 1 3 4
ExampleRowA 2 1 2 2 1 0
ExampleRowC 9 7 7 7 2 5

结果应该如下所示

代码语言:javascript
复制
ExampleRowA 3 1 3 3 4 4
ExampleRowC 9 7 7 7 2 5

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

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

代码语言:javascript
复制
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圣经。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-06-20 18:23:18

试着这样做:

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2011-06-20 19:36:03

下面的代码更容易阅读,并且可以完成以下工作:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-07-10 04:27:57

‘如果你必须运行宏两次,idk放一个1: on top of your macro and on the bottom put goto 1’,它将为你运行两次,或者你可以在一个不同的宏中调用它两次。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6409738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档