我正在尝试找到一种方法来删除“有和没有”列之间的值列表中的重复项,并包括原始列表中的所有内容。我需要为每组ID重复此操作。
此列表为:A1,B1,C1,D1,E1。
原始数据的一个例子是:
UniqueID | Have | Not Have
---------------------------
Z12345 | A1 | B1
Z12345 | A1 | C1
Z12345 | A1 | D1
Z12345 | A1 | E1
Y12345 | A1 | D1
Y12345 | B1 | E1
Y12345 | C1 | D1
我想要的输出是:
UniqueID | Have | Not Have
---------------------------
Z12345 | A1 | B1
Z12345 | | C1
Z12345 | | D1
Z12345 | | E1
Y12345 | A1 | D1
Y12345 | B1 | E1
Y12345 | C1 |
我无法想办法解决这个问题。我想可能运行If语句来检查ID是否匹配,然后运行if语句来删除重复项,但我无法弄清楚如何为每组ID分别运行它。任何有关如何处理此事的帮助或指示都将非常感激!
答案 0 :(得分:0)
我会编写一个VBA例程来解决这个问题。它可以用公式(我将发布)完成,但我相信它对VBA来说更直接。
假设列表按UniqueID排序,您可以尝试以下代码并根据需要进行修改。要使用它,首先在运行宏之前选择UniqueID的范围。它将输出原始集合旁边的重复数据删除值。
Sub dedupe()
Dim strList As String
Dim strCurId As String
Dim rng As Range
curId = Selection(1, 1)
For Each rng In Selection
If curId <> rng Then
strList = ""
curId = rng
End If
rng.Offset(0, 4) = rng
If InStr(1, strList, rng.Offset(0, 1)) = 0 Then
rng.Offset(0, 5) = rng.Offset(0, 1)
strList = strList & "|" & rng.Offset(0, 1)
End If
If InStr(1, strList, rng.Offset(0, 2)) = 0 Then
rng.Offset(0, 6) = rng.Offset(0, 2)
strList = strList & "|" & rng.Offset(0, 2)
End If
Next
End Sub
答案 1 :(得分:0)
这是我尝试使用公式。我认为这只是激发想法或改进的起点。基本上我使用offset函数为每个UniqueID集创建一个动态范围。无法保证这完全有效,而且我认为对于大型数据集而言,所有查找都可能非常慢。
我不会认为这很有用,因为我做了很多假设:
首先输入以下公式:
D2: IF(A2<>A1,IFERROR(VALUE(D1),0)+COUNTA(A:A),D1)
E2: MATCH(B2,OFFSET($A$1,MATCH(A2,A:A,0)-1,1,COUNTIF(A:A,A2),1),0)+D2
F2: MATCH(C2,OFFSET($A$1,MATCH(A2,A:A,0)-1,2,COUNTIF(A:A,A2),1),0)+D2
G2: IF(E2>IFERROR(VALUE(E1),0),B2,"")
H2: IF(F2>IFERROR(VALUE(F1),0),C2,"")
然后将这些公式复制到其余行。切换公式(使用ctrl + tilde)它应该如下所示:
结果应如下所示(G&amp; H列):