【问题标题】:Excel VBA: Merge Rows and Sum ValuesExcel VBA:合并行和求和值
【发布时间】:2015-04-03 16:57:57
【问题描述】:

我已经阅读了关于合并行和合并数据的所有其他问题。我确实遇到了一个我认为对我有用的解决方案,但是当我运行宏时,它实际上并没有对正确的列求和。作为 VBA 的新手,我无法弄清楚宏中需要更改哪些内容才能在我的工作表中工作。

背景: 我想使用宏,因为我每天都会收到一份报告,我必须对其进行操作,以便它可以处理到我们的系统中。我创建了一个 VBA 宏来为我进行操作,但我意识到该报告现在有具有不同值的重复行。下面是最后一组数字需要相加的示例。 (我的实际报告中的 J 栏)

第 1 行:C3=1234,名称,C5=ABC,C5Name,C4=DEF,C4Name,21361

第 2 行:C3=1234,名称,C5=ABC,C5Name,C4=DEF,C4Name,132165

这是我找到的解决方案,但我需要知道要更改哪些内容以与我实际需要总结的列相对应。

Sub Merge()

Dim ColumnsCount As Integer
Dim i As Integer

Range("A1").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=1, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

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

非常感谢任何和所有帮助。如果我需要提供更多信息,请告诉我。

~安德烈亚

【问题讨论】:

  • j 列将合并到哪些相同的列值?是否需要检查多个列?
  • A-I 和 K-L 列包含重复信息。
  • 这些列之一是作为索引还是作为一个整体?重复行是否连续?因为您的代码对它首先合并的列进行排序,然后如果它们相同,则合并连续的行。你想要你的代码顺序吗?
  • 所以,第一部分应该对所有数据进行排序。我实际上将其修改为包含 3 列,因此所有重复项都被分组。
  • 好的。然后,首先对数据进行排序,以便连续重复。然后在一个循环中,比较哪些列足以确保行彼此重复。然后将第二列 j 值与第一列相加;最后删除第二行;删除一行后从计数器中减去一个。 (这个减法很重要)顺便说一句,您的代码在单个列上工作,并在通过求和合并它们时删除该列中的重复项。在一个列中合并足够数量的(可能是所有)列以进行排序和比较可能是一个好主意。那是哪一栏?

标签: excel merge consolidation vba


【解决方案1】:

看看你的桌子会更好。你还没有解释清楚。这个答案与user1016274 的答案没有太大区别。上面的代码首先按BDH 列排序,然后通过比较相同的列,在将它们的J 列值相加时检查并删除重复项。

Sub Merge()

    Range("A1").Sort Key1:=Range("B1"), Order1:=xlAscending, Key2:=Range("D1"), Order2:=xlAscending, _
    Key3:=Range("H1"), Order3:=xlAscending, Header:=xlYes
    'I assume there are column headers. If not, use "Header:=xlNo" instead of "Header:=xlYes"

    Range("A2").Select 'I assume there are column headers. If not, use "Range("A1").Select" instead of "Range("A2").Select"

    Do While ActiveCell.Row <= ActiveSheet.UsedRange.Rows.Count
        If ActiveCell.Offset(0, 1).Value = ActiveCell.Offset(1, 1).Value And ActiveCell.Offset(0, 3).Value = ActiveCell.Offset(1, 3).Value And ActiveCell.Offset(0, 7).Value = ActiveCell.Offset(1, 7).Value Then
            ActiveCell.Offset(0, 9).Value = ActiveCell.Offset(0, 9).Value + ActiveCell.Offset(1, 9).Value
            ActiveCell.Offset(1, 0).EntireRow.Delete shift:=xlShiftUp
        Else
            ActiveCell.Offset(1, 0).Select
        End If
    Loop

End Sub

【讨论】:

  • 你是个天才!非常感谢!
【解决方案2】:

您不必为了添加列 J 的值而遍历所有列:

    If ActiveCell.Value = ActiveCell.Offset(1, 0).Value Then
        ActiveCell.Offset(0, 10).Value = ActiveCell.Offset(0, 10).Value +     ActiveCell.Offset(1, 10).Value
        ActiveCell.Offset(1, 0).EntireRow.Delete shift:=xlShiftUp
    Else
        ActiveCell.Offset(1, 0).Select
    End If

顺便说一句,您确定要仅在该行不重复的情况下才增加活动单元格的行吗?可能是因为 DeleteRow 操作而起作用,但我只是想问一下。
编辑:已删除孤立的 Next 声明,抱歉。

【讨论】:

  • 我相信是的。我不想删除没有重复的行。我真的需要合并列 J 并删除重复项,所以我只剩下 1 行求和值。我不确定最好的方法。
  • 我作为答案发布的代码确实可以按预期工作。如果不删除重复行,则只需要增加活动单元格的行。 else 语句是正确的。方法也OK。我可以建议您声明Dim i as Long 以避免(真的)巨大的工作表中出现问题吗?
  • 如果比较 ActiveCell 所属的列足以确定重复,则此代码可能有效。这段代码假定用于比较的列是A 列,然后在循环之前使用Range("A1").activate 也可能是一个好主意。但是有一个Next
  • Kitap Mitap,感谢您最后的评论。我的 A 列只是一个日期,所以如果我使用它作为比较,它将删除除 1 行之外的所有行。我正在根据 B、D 和 H 列进行排序,这是我需要用来删除重复项的。我一直在摆弄代码,但我无法弄清楚。我的范围是 A:L。我需要合并重复数据,但需要对列 J 中的值求和,而且我对编码的理解还不够,无法将其调整为我需要的值。
猜你喜欢
  • 2018-09-26
  • 2012-11-02
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 2011-09-18
相关资源
最近更新 更多