使用VBA在Excel中合并重复的单元格值及其和
我正在尝试使用VBA在Excel中合并重复的单元格值。 以下是数据示例: Col1 Col2使用VBA在Excel中合并重复的单元格值及其和,vba,excel,merge,duplicates,Vba,Excel,Merge,Duplicates,我正在尝试使用VBA在Excel中合并重复的单元格值。 以下是数据示例: Col1 Col2 运行1 运行2 见9 转到5 见1 我需要合并此信息,以便数据如下所示: Col1 Col2 运行3次 见10 去5 也就是说,我需要合并第1列中的重复值,并在第2列中对其相应的值求和 我已经在这里咨询并尝试过类似的情况: 其中一项建议是以下宏: Sub Macro1() Dim ColumnsCount As Integer ColumnsCount = ActiveSheet.UsedRange.
运行1
运行2
见9
转到5
见1 我需要合并此信息,以便数据如下所示: Col1 Col2
运行3次
见10
去5 也就是说,我需要合并第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
Sub宏1()
Dim ColumnsCount为整数
ColumnsCount=ActiveSheet.UsedRange.Columns.Count
ActiveSheet.UsedRange.Activate
当ActiveCell.Row运行时,请执行以下操作(先排序,然后运行代码):
子合并()
Dim ColumnsCount为整数
作为整数的Dim i
范围(“A1”)。排序键1:=范围(“A1”)、顺序1:=xl升序、标题:=xlGuess、_
OrderCustom:=1,方向:=xlTopToBottom,数据选项1:=xlSortNormal
当ActiveCell.Row运行时,请执行以下操作(先排序,然后运行代码):
子合并()
Dim ColumnsCount为整数
作为整数的Dim i
范围(“A1”)。排序键1:=范围(“A1”)、顺序1:=xl升序、标题:=xlGuess、_
OrderCustom:=1,方向:=xlTopToBottom,数据选项1:=xlSortNormal
当ActiveCell.Row时执行以下操作:假设表从单元格A1开始,列C之后为空(如果不是空,则合并行上的数据将丢失)
子合并类别值()
长得一样长
使用ActiveSheet
lngRow=.Cells(.LastCell.Row,1).End(xlUp).Row
.Cells(1).CurrentRegion.Sort键1:=.Cells(1),header:=xlNo'如果您的表有头单元格,则将其更改为xlYes
做
如果.Cells(lngRow-1,1)=.Cells(lngRow,1),则
.Cells(lngRow-1,2)=.Cells(lngRow-1,2)+.Cells(lngRow,2)
.Rows(lngRow)。删除
如果结束
lngRow=lngRow-1
循环直到lngRow<2
以
端接头
以下假设表格从单元格A1开始,而C列之后的列为空(如果不是空的,则合并行中的数据将丢失)
子合并类别值()
长得一样长
使用ActiveSheet
lngRow=.Cells(.LastCell.Row,1).End(xlUp).Row
.Cells(1).CurrentRegion.Sort键1:=.Cells(1),header:=xlNo'如果您的表有头单元格,则将其更改为xlYes
做
如果.Cells(lngRow-1,1)=.Cells(lngRow,1),则
.Cells(lngRow-1,2)=.Cells(lngRow-1,2)+.Cells(lngRow,2)
.Rows(lngRow)。删除
如果结束
lngRow=lngRow-1
循环直到lngRow<2
以
端接头
如果是我,我必须使用VBA(而不是使用透视表或SUMIF
公式)来完成这项工作,那么我将按第1列对数据进行排序,然后从最后一行向上合并到第一行;它将为您提供更整洁的代码。如果您愿意,可以提供示例。编辑:抱歉,你刚刚意识到你可能想保持col 1值的原始外观顺序,这会使事情稍微复杂一些,但不会太复杂。举个例子将不胜感激。非常感谢。PS:Col1值的顺序不重要(可以在后面处理),重要的是在Col2中求和它们相应的值。我在下面给出了一个VBA答案,但我认为最好使用透视表,这似乎是组织此数据的最简单方法。您也可以使用Excels Data Menui中的小计功能进行此操作,如果是我,我必须使用VBA进行此操作(而不是使用透视表或SUMIF
公式)然后我将按第1列对数据进行排序,然后从最后一行向上合并到第一行;它将为您提供更整洁的代码。如果您愿意,可以提供示例。编辑:抱歉,你刚刚意识到你可能想保持col 1值的原始外观顺序,这会使事情稍微复杂一些,但不会太复杂。举个例子将不胜感激。非常感谢。PS:Col1值的顺序并不重要(可以在后面处理),重要的是将它们对应的值在Col2中求和。我在下面给出了一个VBA答案,但我认为最好使用透视表。透视表似乎是组织此数据的最简单方法。您也可以使用Excels数据菜单中的小计函数来完成此操作
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
Sub mergeCategoryValues()
Dim lngRow As Long
With ActiveSheet
lngRow = .Cells(.LastCell.Row, 1).End(xlUp).Row
.Cells(1).CurrentRegion.Sort key1:=.Cells(1), header:=xlNo 'change this to xlYes if your table has header cells
Do
If .Cells(lngRow - 1, 1) = .Cells(lngRow, 1) Then
.Cells(lngRow - 1, 2) = .Cells(lngRow - 1, 2) + .Cells(lngRow, 2)
.Rows(lngRow).Delete
End If
lngRow = lngRow - 1
Loop Until lngRow < 2
End With
End Sub