在excel根据某个字段合并同类项是一个经常会碰到的问题。
如果合并同类项后,其余字段只是简单的累加或者计数或者计算平均值等,在excel中可以使用“合并计算”或者“数据透视表”功能来实现。
如果合并同类项后,其余字段还涉及字符的串联,则需要用vba来实现。
以下代码是一个通用的根据某个字段合并同类项,并且其余字段如果是文本的都串联起来,以回车换行符分隔:
Sub QQ1722187970()
'原始数据所在工作表对象
Dim oWKSource As Worksheet
Set oWKSource = Sheet2
'结果数据所在工作表对象
Dim oWKTarget As Worksheet
Set oWKTarget = Sheet3
Dim oDic As Object
Set oDic = CreateObject("Scripting.Dictionary")
'sID表示数据源中的唯一标识列字段
Dim sID As String
'sItem表示对应的唯一标识列字段的行号
Dim sItem As String
'字典的键值数组
Dim arrKey
With oWKSource
'先建立唯一标识列字段的行号索引
For i = 2 To .Range("a" & .Rows.Count).End(xlUp).Row
sID = .Cells(i, "a")
With oDic
If .exists(sID) Then
sItem = .Item(sID)
sItem = sItem & "!" & i
.Item(sID) = sItem
Else
.Add sID, i
End If
End With
Next i
'给目标工作表先添加列标题
With oWKTarget
.Cells.Clear
arrTitle = Array("ID", "结果A", "结果B")
iCol = UBound(arrTitle) + 1
.Range("a1").Resize(1, iCol) = arrTitle
End With
arrKey = oDic.keys
'合并同类项
For i = 0 To UBound(arrKey)
'唯一标识
sID = arrKey(i)
sItem = oDic.Item(sID)
arr = Split(sItem, "!")
'第一个要合并的同类项
s1 = ""
'第二个要合并的同类项
s2 = ""
For j = 0 To UBound(arr)
iRow = arr(j)
With oWKSource
If j = 0 Then
s1 = s1 & .Cells(iRow, "B")
s2 = s2 & .Cells(iRow, "C")
Else
s1 = s1 & vbCrLf & .Cells(iRow, "B")
s2 = s2 & vbCrLf & .Cells(iRow, "C")
End If
End With
Next j
'输出结果
With oWKTarget
.Cells(i + 2, "a") = sID
.Cells(i + 2, "b") = s1
.Cells(i + 2, "c") = s2
End With
Next i
End With
MsgBox "操作完毕!!!"
End Sub


发表评论