我有两列我需要删除重复的行。对于这个例子:
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。
我怎么能实现这个目标?
答案 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列中的第一个单元格)。编写一次后,您应该可以在数据的长度上复制粘贴或拖动公式,它将相应地更新行引用。