您不需要 VBA。尽管我是一名软件开发人员,但我尽量少使用 VBA。
假设所有 31 张纸的值都在 A1-A10 的每张纸上。然后在每张纸上执行以下操作:
首先使用工作表的唯一值创建一列。为此,您需要一个“矩阵公式”。跳过 C1 并在单元格 C2 中键入以下公式,然后按 CTRL-SHIFT-ENTER(不仅仅是 ENTER!)关闭:
=IFERROR(INDEX($A$1:$A$10, MATCH(0, IF(ISBLANK($A$1:$A$10),1,COUNTIF($C$1:C1, $A$1:$A$10)), 0)),"")
现在你得到一个矩阵公式。如您所见,公式周围现在有括号 {}。
现在将公式向下填充到 C11,您只会得到 A1-A10 的唯一值。完成 31 次后,将所有 31 列 C 引用到概览表中。
您可以在带有条件格式的概览表中看到重复项。这是解释here。使用此解决方案,可以很容易地查明重复项。
但是,如果您想使用值而不是格式,请创建第二张概览表并将此公式放入 A1:
=IF(ISNUMBER(OverviewSheet!A1),IF(OverviewSheet!A1<>0,COUNTIF(OverviewSheet!$A$1:$AE$10,OverviewSheet!A1)>1))
并将此公式填充到单元格 AE10。您将获得整个范围的 TRUE/FALSE。此公式还考虑了空单元格和零。
现在把这个公式放在第二个概览表的某个地方:
=COUNTIF(A1:AE10,TRUE())>0
如果您的 31 张纸上有重复项,那么现在您有一个单元格仅包含 TRUE 或 FALSE。
如果您希望在按钮下获得此结果,我相信您将能够为此创建一个宏。
也许有更短的结果,但这是我想出的。
成功了!
编辑:
好吧,也许我对 VBA 过于乐观了。假设最后一个公式在 AF1 中,那么这是你的宏:
Sub Check()
If ThisWorkbook.Sheets("OverviewSheet2").Range("AF1").Value = True Then
MsgBox "We have duplicates!"
Else
MsgBox "We have no duplicates."
End If
End Sub
现在这个宏最简单的选项是放在快捷键下(查看 -> 宏 -> 查看宏 -> 选择“检查”宏 -> 选项... -> 快捷键),例如CTRL-SHIFT-D。那么你就不需要每张纸上都有 31 个按钮了。