【问题标题】:Excel VBA - How to automate check and select duplicates in multiple lists in multiple sheets in one workbook?Excel VBA - 如何在一个工作簿的多个工作表中自动检查和选择多个列表中的重复项?
【发布时间】:2019-08-07 11:40:12
【问题描述】:

如何在同一工作簿中的多个工作表中的多个列表中自动检查重复项

通过为我需要的每个比较设置一个宏,我已设法使其半自动工作。这意味着一个用于查找以下重复值的宏:

Worksheets("All").Range("Annie") and Worksheets("Annie").Range("A:A")
Worksheets("All").Range("Benny") and Worksheets("Benny").Range("A:A")

等等。 等等。

Here is a screenshot that shows where I'm at, and hopefully visualizes what I am trying to do

(安妮去过瑞典和肯尼亚 - 因此这些国家被宏标记为红色) (本尼去过俄罗斯和西班牙) (等等)

只编写一个代码会更有效,它对所有具有Worksheets("All"). 值的列执行此操作我需要能够拥有至少 50 个名称的列(安妮、本尼、查理、丹尼、艾玛、法比安等……)

这可能吗?

到目前为止,这是我的代码(用于“Benny”):

Sub findDuplicatesBenny()

Dim rng1, rng2, cell1, cell2 As Range

Set rng1 = Worksheets("All").Range("Benny")

Set rng2 = Worksheets("Benny").Range("A:A")

For Each cell1 In rng1
If IsEmpty(cell1.Value) Then Exit For

For Each cell2 In rng2
If IsEmpty(cell2.Value) Then Exit For
If cell1.Value = cell2.Value Then

cell1.Interior.ColorIndex = 22
cell1.Interior.Pattern = xlSolid
End If

Next cell2
Next cell1

End Sub

任何帮助将不胜感激!

【问题讨论】:

  • 这可以通过条件格式来完成,完全避免使用 VBA。你对此持开放态度吗?
  • 嗨@BigBen - 感谢您的回复!当然也愿意学习。我对如何完成这项工作没有偏好。我会选择最优化的任何解决方案。

标签: excel vba duplicates


【解决方案1】:

要使用条件格式执行此操作,您可以使用INDIRECT 和第 1 行中的名称(Annie、Benny 等)来创建对每个名称各自工作表的引用。然后使用COUNTIF 可以计算重复次数。

  1. 条件格式下,单击使用公式确定要设置格式的单元格
  2. 输入以下公式:=COUNTIF(INDIRECT("'"&A$1&"'!A:A"),A1)

  1. 点击格式应用你想要的颜色。
  2. 规则管理器窗口中,根据需要更改“应用于”范围引用。


编辑:

只是为了更彻底地解释......这个公式的两个主要部分:

  1. COUNTIF:用于统计符合条件的单元格数量。暂时忽略INDIRECT,并以单元格A2为例,上面的公式等价于=COUNTIF(Annie!A:A,A2),它查看Annie工作表上的A列并计算Sweden的所有实例.那将返回1

如果您要向下拖动该公式,在 A3 中它将返回 1 用于 Kenya,在 A4 中,0 用于美国等等。

在另一列中,您可以创建一个类似的 COUNTIF 引用 Benny,得到类似的结果 - 0 代表瑞典,一直到 1 代表俄罗斯和西班牙。


  1. INDIRECT:返回由文本字符串指定的引用。上述公式使用INDIRECT 使工作表和范围引用(Annie!A:ABenny!A:A 等)动态化。

首先解释一下文本字符串:"'"&A$1&"'!A:A"。这导致'Annie'!A:A'Benny'!A:A 等等:

INDIRECT 中使用这些文本引用成为范围引用。通过将INDIRECT 包装在COUNTIF 中,公式实际上等效于上面的=COUNTIF(Annie!A:A,A2) - 我们刚刚使Annie!A:A 动态化。请注意,我在 'Annie'!A:A 之前和之后都包含了一个单引号 '。如果工作表名称中有空格,则需要这样做,例如如果名称是Annie Marie


至于条件格式 - 如果公式输入的计算结果为 TRUE,则应用格式。我使用了一个小技巧,即条件格式中的0 等同于FALSE,而1 个或更多是TRUE。因此,格式将应用于COUNTIF 返回 1 或更多的任何单元格。这就是标记/填充重复项的方式。

【讨论】:

  • 嗨@BigBen 非常感谢您提供这个更高效、更短的代码解决方案!效果很好!现在我只是想了解它是如何工作的。到目前为止,这是我从您的公式中理解(或认为,我理解)的内容:COUNTIF() 计数符合条件的单元格; INDIRECT() 从文本创建引用; COUNTIF(INDIRECT()) 计数符合从文本引用的条件的单元格; "'"&A$1&"'" 你介意解释一下这是什么意思吗?; !A:A 当前活动工作表中的 A 列。
  • 当然,我以单元格 A2 为例。假设您在旁边输入 =COUNTIF(Annie!A:A,A2) - 它返回 1,因此您知道瑞典是重复的。带有INDIRECT 的公式会重新创建此COUNTIF,但允许工作表名称Annie 变为动态。您希望INDIRECT 中的文本看起来像Annie!A:A。您可以从当前工作表的A$1 获取Annie 部分。然后,您需要在工作表名称之前和之后使用单引号 '(以处理工作表名称中包含空格的可能性,例如 Anne Marie),然后是感叹号,然后是 A:A
  • 如果您需要更多解释,请告诉我,我会添加到我的答案中:)
  • 嗨@BigBen 感谢您的详细说明!我还不完全理解,因为我对此很陌生,但你肯定为我提供了一些有价值的投入。明天早上,当我的大脑再次得到充分休息时,我会重新审视这个公式和你的阐述:-P 干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多