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

时间:2015-10-04 01:54:37

标签: excel excel-formula

我有一张数千行的表,我想找到重复的行。我已经使用了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,因为我有足够的时间训练人们在网络驱动器上使用工具,而不会对不安全的脚本发出可怕的警告。

3 个答案:

答案 0 :(得分:1)

公式 - 查找重复项

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

我建议的解决方案包括使用以下两个工作领域:

一个。在E1输入KeyE2此公式中连接要验证的所有字段,然后将公式复制到最后一条记录

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

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

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

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

    F2
  2. 仅标记=IF( COUNTIF( $E$1:$E$1017, $E2 ) = 1, "", "Duplicated" ) 条记录,未标记第一条记录。

    Duplicated
  3. 仅标记=IF( COUNTIF( $E$1:$E2, $E2 ) = 1, "", "Duplicated" ) 条记录,标记为Duplicated的第一条记录。

    Original
  4. enter image description here

    如果愿意,请隐藏列=IF( COUNTIF( $E$1:$E$1017, $E2 ) = 1, "", IF( COUNTIF( $E$1:$E2, $E2 ) = 1, "Original", "Duplicated" ) )

答案 1 :(得分:0)

这对于SQL来说是微不足道的。您可以使用SQL查询Excel,但我不确定性能会是什么样的。看看here,看看SQL是否有用。

答案 2 :(得分:0)

我写了一个可怕的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个项目大于任何一天中添加的最大条目数。结果是,这需要不到一秒的时间来表明我是否输入了重复的行。

我将在评论

中尝试由pnuts提出的解决方案
  

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

这似乎是一个更优雅的解决方案,即使它没有指明哪条线是罪魁祸首,它确实给了我找到有问题的线所需的数据。