Excel - 从不同ID组

时间:2017-12-05 17:22:16

标签: excel

我正在尝试找到一种方法来删除“有和没有”列之间的值列表中的重复项,并包括原始列表中的所有内容。我需要为每组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分别运行它。任何有关如何处理此事的帮助或指示都将非常感激!

2 个答案:

答案 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集创建一个动态范围。无法保证这完全有效,而且我认为对于大型数据集而言,所有查找都可能非常慢。

我不会认为这很有用,因为我做了很多假设:

  • 数据按UniqueID
  • 排序
  • 列之间没有重复项
  • 电子表格的设置与此完全相同

    setup

首先输入以下公式:

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)它应该如下所示:

formulas1

formulas2

formulas3

结果应如下所示(G&amp; H列):

results