【发布时间】:2015-08-05 21:52:24
【问题描述】:
我有类似的问题 [合并具有重复值的行][1] Excel VBA - Combine rows with duplicate values in one cell and merge values in other cell
我有这种格式的数据(行已排序)
Pub ID CH Ref
no 15 1 t2
no 15 1 t88
yes 15 2 t3
yes 15 2 t3
yes 15 2 t6
比较相邻行(比如第 4 行和第 5 行),如果 col 2 和 3 匹配,则如果 col 4 不同,则合并 col4,删除行。如果 col 2,3,4 匹配则删除行,不要合并 col 4
期望的输出
key ID CH Text
no 15 1 t2 t88
yes 15 2 t3 t6
第一个代码部分不能正常工作
Sub mergeCategoryValues()
Dim lngRow As Long
With ActiveSheet
Dim columnToMatch1 As Integer: columnToMatch1 = 2
Dim columnToMatch2 As Integer: columnToMatch2 = 3
Dim columnToConcatenate As Integer: columnToConcatenate = 4
lngRow = .Cells(65536, columnToMatch1).End(xlUp).row
.Cells(columnToMatch1).CurrentRegion.Sort key1:=.Cells(columnToMatch1), Header:=xlYes
.Cells(columnToMatch2).CurrentRegion.Sort key1:=.Cells(columnToMatch2), Header:=xlYes
Do
If .Cells(lngRow, columnToMatch1) = .Cells(lngRow - 1, columnToMatch1) Then 'check col 2 row lngRow, lngRow-1
If .Cells(lngRow, columnToMatch2) = .Cells(lngRow - 1, columnToMatch2) Then 'check col 3 row lngRow, lngRow-1
If .Cells(lngRow - 1, columnToConcatenate) = .Cells(lngRow, columnToConcatenate) Then
Else
.Cells(lngRow - 1, columnToConcatenate) = .Cells(lngRow - 1, columnToConcatenate) & "; " & .Cells(lngRow, columnToConcatenate)
End If
.Rows(lngRow).Delete
End If
End If
lngRow = lngRow - 1
Loop Until lngRow = 1
End With
实际输出不正确,因为当单元格合并时 t3 将不匹配 t3;t6,我对 col 4 的比较仅适用于非常简单的情况。
实际输出
key ID CH Text
no 15 1 t2; t88
yes 15 2 t3; t3; t6
因此,我不得不添加这两个部分来拆分 Concatenate 单元格,然后删除重复项
'split cell in Col d to col e+ delimited by ;
With Range("D2:D6", Range("D" & Rows.Count).End(xlUp))
.Replace ";", " ", xlPart
.TextToColumns other:=True
End With
'remove duplicates in each row
Dim x, y(), i&, j&, k&, s$
With ActiveSheet.UsedRange
x = .Value: ReDim y(1 To UBound(x, 1), 1 To UBound(x, 2))
For i = 1 To UBound(x)
For j = 1 To UBound(x, 2)
If Len(x(i, j)) Then
If InStr(s & "|", "|" & x(i, j) & "|") = 0 Then _
s = s & "|" & x(i, j): k = k + 1: y(i, k) = x(i, j)
End If
Next j: s = vbNullString: k = 0
Next i
.Value = y()
End With
End Sub
附加代码输出是
Pub ID CH Ref
no 15 1 t2 t88
yes 15 2 t3 t6
问题:一定有比使用三种不同方法更容易做到这一点的方法吗?如果第 4 列项目不匹配,如何插入新列 5+?
注意:删除重复代码是从 excelforum 的用户 nilem 那里找到的。
编辑:如果 Col 2 和 3 匹配,则 Col 1 将始终相同。如果解决方案更简单,我们可以假设 Col 1 为空白并忽略数据。
我已经打印了书籍查找表,需要转换为一种简单的格式,该格式将用于使用 1960 年代语言的设备中,该语言的命令非常有限。我正在尝试预先格式化此数据,因此我只需要搜索包含所有信息的一行。
Col D 最终输出可以是带有分隔符的 col D 或 col D-K(最多只有 8 个 Ref),因为我将解析以在其他机器上使用。无论哪种方法都更容易。
【问题讨论】:
-
我不太明白你的规则,或者为什么你必须对数据进行排序,但是,一般来说,我会使用用户定义的类和集合对象来处理每一行数据,并且然后结合结果得到输出。可能是Destacking Columns的修改
-
您的文字表明您要比较第 2 列和第 3 列,合并重复项;但是您的示例表明您还想合并第 1 列的重复项。也许您可以更清楚地说明您的规则,并提供更全面的示例。
-
我在帖子底部澄清了。
-
谢谢。我发布了一个解决方案作为答案。