从两列中配对的值中删除每对重复项(行)中的一个

时间:2014-02-07 09:15:20

标签: excel excel-vba excel-formula pivot-table duplicate-removal vba

我有两列我需要删除重复的行。对于这个例子:

A                b
sport 1          pippo
sport 1          pippo
sport 1          pluto
sport 2          paperino
sport 2          paperino   
sport 3          gastone

我要求的输出是:

A                b
sport 1          pippo
sport 1          pluto
sport 2          paperino  
sport 3          gastone

我是Excel的新手,所以不知道要使用哪种公式或VBA。

我怎么能实现这个目标?

3 个答案:

答案 0 :(得分:4)

有几种方法可以达到你想要的效果,其中最简单的就是@chris neilsen所提到的:

删除重复项

只需选择两列,然后选择数据>数据工具 - 删除重复项接受默认值(可能),然后单击“确定”。但是,如评论中所示,并非所有版本的Excel都具有此类功能。

注意删除 - 一旦Undo堆栈被覆盖,它们就会消失。

请注意删除重复项并不完全可靠(请参阅下面的高级过滤器中的链接)。

高级过滤器

我倾向于将此视为Remove Duplicates may have a defect(尽管很少出现!):

必须(或至少强烈建议)确保为此标记列。再次选择两列,然后选择数据>排序&过滤 - 高级,选择复制到另一个位置,选择复制到范围(一个单元格就足够了),显然只检查唯一记录。

这里复制到是一个事实,即您可以保留整个原始列表(重复和所有),有时可能需要,而无需先创建副本。

COUNTIF

如果要删除重复项以表示两者,则公式解决方案可能更合适

类似的东西:

=COUNTIF(B:B,B1)  
B1中的

(假设您的标签位于第1行)并向下复制到适合将识别对或其他倍数。达到计数后,过滤删除所选的选择。

COUNTIF通常适用于所有Excel版本(我不记得是否在最早的版本中!)

<强> COUNTIFS

功能仅在更新版本的Excel中可用,但允许更复杂的“复制”定义 - 在您的示例中不适用。

<强>数据透视表

PT的聚合行标签值理所当然,因此请给出删除重复项的外观。 PT非常有用,无论如何都可能因其他原因而被通缉,因此不需要额外的麻烦来删除重复项。

以表格形式显示表格布局可能是最方便的(此处行标签中A以上b)。这应该显示每个A / b对的一个实例 - 除非A值不是第一个例子。换句话说,ColumnA值的显示不会重复ColumnA值 - 只是空白意味着“与上面相同”,直到A发生变化。我认为Excel的最新版本具有在每一行上显示A值的功能,但在早期版本中很容易“允许”。

问题是,由于PT的内容不能以下面提出的方式改变,因此需要在PT中显示的数据副本(不仅仅是PT的另一个版本!)

仅在每个“部分”的开始中选择包含值的列,主页&gt;编辑&gt;找到&amp;选择 - 转到特殊...,空白。单击其中一个选定单元格,输入=,向上箭头和 CTRL + 输入

<强> VBA

这是几乎所有“Excel”的解决方案,并且可用于删除重复项,但对于您问题中大小的完整数据样本可能不会“具有成本效益” - 除非经常需要该过程。

我可能错过了其他一些选择 - 但毫无疑问,在我开始使用这种熨平板之前,其他人已经提到了这些选择。

答案 1 :(得分:1)

您可以从“数据”标签中手动使用Remove Duplicates(您应该这样做以了解其工作原理)

或者,如果你真的想自动化它,试试这个

Sub Demo()
    Dim ws As Worksheet
    Dim rng As Range

    ' Get a reference to the sheet your data is on
    Set ws = ActiveSheet  '<-- change to suit

    With ws
        ' Get a reference to your data
        Set rng = Range(.Cells(1, 2), .Cells(.Rows.Count, 1).End(xlUp))

        ' Apply Remove Duplicates
        rng.RemoveDuplicates Columns:=2, Header:=xlNo
    End With
End Sub

答案 2 :(得分:0)

编辑:就像chris neilsen所建议的那样,“数据”标签中的Remove Duplicates会自动处理“成对”的重复项;我认为它只是从每个列中进行简单删除,但它确实会先分组然后删除。 但是,如果您想要一种过多的手动方式,请继续阅读;)


可能是一项繁重的操作,但这将是获得所需内容的一种非常简单的方法,尤其是在只有几百行的情况下:

A         B         C                D
sport 1   pippo     =CONCAT(A1,B1)   =COUNTIF(C$1:C1,C1)
sport 1   pippo     =CONCAT(A2,B2)   =COUNTIF(C$1:C2,C2)
sport 1   pluto     =CONCAT(A3,B3)   =COUNTIF(C$1:C3,C3)
sport 2   paperino  =CONCAT(A4,B4)   =COUNTIF(C$1:C4,C4)
sport 2   paperino  =CONCAT(A5,B5)   =COUNTIF(C$1:C5,C5)
sport 3   gastone   =CONCAT(A6,B6)   =COUNTIF(C$1:C6,C6)

结果是:

A         B         C                D
sport 1   pippo     sport 1pippo     1
sport 1   pippo     sport 1pippo     2
sport 1   pluto     sport 1pluto     1
sport 2   paperino  sport 2paperino  1
sport 2   paperino  sport 2paperino  2
sport 3   gastone   sport 3gastone   1

D列中的任何大于1的数字都是重复的。然后,您可以突出显示/选择所有4列,并对D列“最小到最大”进行排序:

A         B         C                D
sport 1   pippo     sport 1pippo     1
sport 1   pluto     sport 1pluto     1
sport 2   paperino  sport 2paperino  1
sport 3   gastone   sport 3gastone   1
sport 1   pippo     sport 1pippo     2
sport 2   paperino  sport 2paperino  2

然后删除重复的行,C列和D列,您就得到了输出(也可以在其他选项卡上执行这些计算,并且仅将值加载到D = 1的位置):< / p>

A         B        
sport 1   pippo     
sport 1   pluto     
sport 2   paperino  
sport 3   gastone  

它的工作方式是c列将前两列作为单个字符串连接在一起,因此C列中的所有“重复项”都表示A和B的重复对。然后D列只是说:“多少次到目前为止,左边的字符串有没有出现?”

C $ 1项只是锁定excel,使其无法更新行索引(我们一直希望范围的顶部成为C列中的第一个单元格)。编写一次后,您应该可以在数据的长度上复制粘贴或拖动公式,它将相应地更新行引用。