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
输入Key
和E2
这个公式来连接所有要验证的字段,然后复制公式直到最后一条记录
=CONCATENATE( A2 , CHAR(133) , B2 , CHAR(133) , C2 , CHAR(133) , D2 )
CHAR(133)
字符用作分隔符,可根据需要省略或更改。
B.第二个字段,称为!Chk
,用于标记Duplicated
记录。 但是,由于此解决方案包含三个选项,因此我们将为此目的在单元格 F1
、G1
和 H1
中分别设置 3 个字段 Chk.1
、Chk.2
和 Chk.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函数在大表中查找重复行的主要内容,如果未能解决你的问题,请参考以下文章