Excel函数查找大表中的重复行
我有一个长达数千行的表,我想查找重复的行。 我已经使用countifs(),它是function性的,但它也是非常资源密集型的,我想find一个方法来以更便宜的方式做到这一点。
我想检查的数据的一个例子如下
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))
但是这需要几分钟的时间来评估我所拥有的数据量。 我想设置一个公式,只比较相同date的行,所以以前的行不必重新计算,以后的行不必考虑以前的增加。
这背后的目的是确保此表的用户不会双击input行。 我每周都会手工检查重复数据,因为这是一个数据挖掘工具,用于从存储仓库中读取我们的纸张注销日志(我们知道这是一个过时的系统,但这是我们现在需要处理的),但是如果表单可以提醒我可能发生重复(特别是不需要3到5分钟input每行),则会更容易检查我的数据。
另外,我宁愿使用一个公式,而不是VBA,因为我有足够的时间来训练人们在networking驱动器上使用工具,而没有关于不安全脚本的可怕警告。
公式 – 查找重复项
假设数据位于A1:D1017
范围内(根据需要更改)
我提出的解决scheme包括使用两个工作领域如下:
A.在E1
inputKey
并在E2
这个公式中拼接所有要validation的字段,然后复制公式直到最后一条logging
=CONCATENATE( A2 , CHAR(133) , B2 , CHAR(133) , C2 , CHAR(133) , D2 )
CHAR(133)
字符用作分隔符,省略或根据需要进行更改。
B.第二个字段叫做!Chk
,用来标记Duplicated
logging。 然而,由于这个解决scheme包含三个选项,我们在这个目的下Chk.3
在单元格F1
, G1
和H1
有3个字段Chk.1
, Chk.2
和Chk.3
。
-
标记所有
Duplicated
logging(包括原始)在单元格F2
input此公式并复制到最后一个logging=IF( COUNTIF( $E$1:$E$1017, $E2 ) = 1, "", "Duplicated" )
-
只标记
Duplicated
logging,留下找不到的第一条logging。=IF( COUNTIF( $E$1:$E2, $E2 ) = 1, "", "Duplicated" )
-
只标记
Duplicated
logging,标记find的第一个logging为Original
。=IF( COUNTIF( $E$1:$E$1017, $E2 ) = 1, "", IF( COUNTIF( $E$1:$E2, $E2 ) = 1, "Original", "Duplicated" ) )
如果可取的话,隐藏F
列
这对于SQL来说是微不足道的。 您可以使用SQL查询Excel,但是我不确定性能会是什么样的。 看看这里 ,看看SQL不会帮助。
我写了一个可怕的公式,可以做这个工作。 这几乎是不可读的,但它不再基于整个表重新计算。 我已经把这个公式input到我的数据input的右边一栏中,并把“!!” 如果该行复制了前一个行 它也检查我input了一整行数据,以防止在input数据时进行评估。
=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项大于任何一天添加的最大项目数。 结果是,这需要不到一秒钟,以表明我是否input了重复的行。
我将在评论中尝试pnuts提出的解决scheme
如果您检查针对新inputdate筛选的数据透视表,而不是针对原始数据,则可能会获得更多速度。
这似乎是一个更优雅的解决scheme,即使它没有指出哪一行是罪魁祸首,它确实给了我find违规行的必要数据。