Excel函数在大表中查找重复行

Posted

技术标签:

【中文标题】Excel函数在大表中查找重复行【英文标题】:Excel function to find duplicate rows in large table 【发布时间】:2015-12-31 23:15:26 【问题描述】:

我有一个有数千行长的表,我想查找重复的行。我用过countifs(),它很实用,但它也非常耗费资源,我想找到一种成本更低的方法。

我要检查的数据示例如下

Date      Product Name     Quantity    Delivered to
10-1-15   Toilet Paper     1           Health Science
10-1-15   Paper Towel      1           Health Science
10-1-15   Can Liners       2           Health Science
10-2-15   Toilet Paper     2           Administration
10-2-15   Paper Towel      1           Health Science

我使用的公式是

=(countifs(A:A,A2,B:B,B2,C:C,C2,D:D,D2))

但这需要几分钟来评估我拥有的数据量。我想设置一个仅比较具有相同日期的行的公式,因此不必重新计算较早的行,而以后的行不必考虑较早的添加。

这样做的目的是确保此工作表的用户不会重复输入行。我每周都会手动检查重复项,因为这是一个从存储仓库中挖掘纸质签出日志的工具(我们知道这是一个过时的系统,但我们现在必须使用它),但如果工作表可以提醒我可能的重复(尤其是输入每一行不需要 3 到 5 分钟),那么检查我的数据会更容易。

此外,我更喜欢使用公式,而不是 VBA,因为我有足够的时间来训练人们在网络驱动器上使用工具,而不会发出关于不安全脚本的可怕警告。

【问题讨论】:

可能值得付出努力,因为一个好的 VBA 例程可以在几分之一秒内完成此操作... 在 Excel 中没有“简单”的好方法;还有一些手动的方法,在网上找到的。如果需要重复使用该过程,我会推荐 VBA 和相关的警告/风险。附加组件也可以做到这一点 - 但需要本地安装。 【参考方案1】:

这对于 SQL 来说是微不足道的。您可以使用 SQL 查询 Excel,但我不确定性能如何。看看here,看看 SQL 是否没有帮助。

【讨论】:

【参考方案2】:

我写了一个糟糕的 excel 公式来完成这项工作。它几乎不可读,但它不再基于整个表重新计算。我已将此公式输入到我的数据条目右侧的列中,并输入“!!”如果该行与前一行重复,则进入该字段。它还会检查我是否输入了完整的数据行,以防止它在我输入数据时进行评估。

=IF(
 COUNTA(A1017:D1017)=4,
 IF(
  COUNTIFS(
   INDIRECT(IF(ROW(<26,"A2:A"&ROW()+25,"A"&ROW()-25&":A"&ROW()+25)),$A1017,
   INDIRECT(IF(ROW(<26,"B2:B"&ROW()+25,"B"&ROW()-25&":B"&ROW()+25)),$B1017,
   INDIRECT(IF(ROW(<26,"C2:C"&ROW()+25,"C"&ROW()-25&":C"&ROW()+25)),$C1017,
   INDIRECT(IF(ROW(<26,"D2:D"&ROW()+25,"D"&ROW()-25&":D"&ROW()+25)),$D1017
  )
 >1,"!!","")
,"")

它的作用是检查上下 25 行是否有重复项,因为 25 项大于任何一天添加的最大条目数。结果是不到一秒钟就可以指示我是否输入了重复的行。

我将尝试 cmets 中 pnuts 提出的解决方案

如果您检查为新输入的日期过滤的数据透视表,而不是您的原始数据,您可能会获得更快的速度。

这似乎是一个更优雅的解决方案,尽管它没有指出哪条线是罪魁祸首,但它确实为我提供了找到有问题的线所需的数据。

【讨论】:

【参考方案3】:

公式 - 查找重复项

假设数据位于A1:D1017范围内(根据需要更改)

我提出的解决方案包括使用以下两个工作字段:

A.在E1 输入KeyE2 这个公式来连接所有要验证的字段,然后复制公式直到最后一条记录

=CONCATENATE( A2 , CHAR(133) , B2 , CHAR(133) , C2 , CHAR(133) , D2 ) 

CHAR(133) 字符用作分隔符,可根据需要省略或更改。

B.第二个字段,称为!Chk,用于标记Duplicated 记录。 但是,由于此解决方案包含三个选项,因此我们将为此目的在单元格 F1G1H1 中分别设置 3 个字段 Chk.1Chk.2Chk.3

    标记所有Duplicated 记录(包括原始) 在单元格F2 中输入此公式并复制到最后一条记录

    =IF( COUNTIF( $E$1:$E$1017, $E2 ) = 1, "", "Duplicated" )
    

    仅标记 Duplicated 记录,未标记找到的第一条记录。

    =IF( COUNTIF( $E$1:$E2, $E2 ) = 1, "", "Duplicated" )
    

    仅标记Duplicated 记录,将找到的第一条记录标记为Original

    =IF( COUNTIF( $E$1:$E$1017, $E2 ) = 1, "",
    IF( COUNTIF( $E$1:$E2, $E2 ) = 1, "Original", "Duplicated" ) )
    

隐藏列F(如果需要)

【讨论】:

以上是关于Excel函数在大表中查找重复行的主要内容,如果未能解决你的问题,请参考以下文章

EXCEL函数如何查找数值在工作表中的位置?

Excel中哪个函数可以统一去重复值后的唯一值的个数呢?

excel判断表数据是不是存在另一个表中

Excel用啥函数查找并返回数据在表中的位置,就像按Ctrl+F,Excel2003版本

如何根据多个ID值在Excel表中找出匹配的结果

EXCEL中在某列中查找指定文本,返回行对应另一列的数据用啥函数