【问题标题】:Conditionally formatting cells if their value equals any value of another column如果单元格的值等于另一列的任何值,则条件格式化单元格
【发布时间】:2015-02-05 08:44:01
【问题描述】:

我在AB 列中有数据。 B 列的数据大多是 A 的数据的副本,但并非总是如此。例如:

A
Budapest
Prague
Paris
Bukarest
Moscow
Rome
New York

B
Budapest
Prague
Los Angeles
Bukarest

我需要在A 列中搜索B 中的值。如果一行匹配,我需要将A中的行背景颜色更改为红色或其他东西。

【问题讨论】:

  • 你只关心它匹配同一行吗?例如,如果 A5 匹配 B5,则设置红色背景格式。或者如果 A5 匹配说 B10?

标签: excel vba excel-formula conditional-formatting


【解决方案1】:

这是公式

根据公式以条件格式创建新规则。使用以下公式并将其应用于 $A:$A

=NOT(ISERROR(MATCH(A1,$B$1:$B$1000,0)))




这里是the example sheet to download if you encounter problems


更新
这是 @pnuts 的建议,它也很完美:

=MATCH(A1,B:B,0)>0


【讨论】:

  • 这太棒了!如果我想将整行突出显示为红色怎么办? A1:B1 而不仅仅是 A1
【解决方案2】:

不需要公式。这适用于您需要的尽可能多的列,但只会比较同一工作表中的列:

注意:首先从各个列中删除所有重复项!

  1. 选择要比较的列
  2. 点击条件格式
  3. 单击突出显示单元格规则
  4. 点击 Duplicate Values(默认应该没问题)
  5. 重复项现在以红色突出显示

    • 额外提示,您可以按颜色过滤每一行,以在列中保留唯一值,或仅保留重复值。

【讨论】:

  • 这可能只是最简单的解决方案,对此我表示赞赏。但是,如果您需要对多个工作表或工作簿执行此操作,它将不起作用......涉及使用条件格式的其他建议也不会(至少在 Excel 2007 中不是)。这是设置工作表时要记住的事情。如果您正在使用多个工作表,您可能需要权衡将所有工作表全部放在一个(可能不会太难)或按照 peege 建议的那样将脚趾浸入 VBA 编码池的好处/成本。
【解决方案3】:

另一个更简单的解决方案是在条件格式中使用这个公式(适用于 A 列):

=COUNTIF(B:B,A1)

问候!

【讨论】:

    【解决方案4】:

    您需要做的只是一个简单的循环。
    这不处理小写,大写不匹配的测试。 如果这不是您要查找的内容,请发表评论,我可以修改。

    如果您打算学习 VBA。这是一个很好的开始。

    已测试:

    Sub MatchAndColor()
    
    Dim lastRow As Long
    Dim sheetName As String
    
        sheetName = "Sheet1"            'Insert your sheet name here
        lastRow = Sheets(sheetName).Range("A" & Rows.Count).End(xlUp).Row
    
        For lRow = 2 To lastRow         'Loop through all rows
    
            If Sheets(sheetName).Cells(lRow, "A") = Sheets(sheetName).Cells(lRow, "B") Then
                Sheets(sheetName).Cells(lRow, "A").Interior.ColorIndex = 3  'Set Color to RED
            End If
    
        Next lRow
    
    End Sub
    

    【讨论】:

      【解决方案5】:

      我正在研究这个问题,并且喜欢 peege 使用 for 循环的方法! (因为我现在正在学习VBA)

      但是,如果我们尝试匹配另一列的“任何”值,那么使用如下嵌套循环怎么样?

      Sub MatchAndColor()
      
      Dim lastRow As Long
      Dim sheetName As String
      
      
      sheetName = "Sheet1"            'Insert your sheet name here
      lastRow = Sheets(sheetName).Range("A" & Rows.Count).End(xlUp).Row
      
      For lRowA = 1 To lastRow         'Loop through all rows
          For lRowB = 1 To lastRow
              If Sheets(sheetName).Cells(lRowA, "A") = Sheets(sheetName).Cells(lRowB, "B") Then
      
              Sheets(sheetName).Cells(lRowA, "A").Interior.ColorIndex = 3  'Set Color to RED
          End If
      
      Next lRowB
      Next lRowA
      
      End Sub
      

      【讨论】:

        【解决方案6】:

        我无法对最佳答案发表评论,但 Excel 实际上可以让您做到这一点,而无需添加丑陋的条件逻辑。

        条件格式会自动应用到任何非错误的输入,因此您可以获得与以下相同的效果:

        =NOT(ISERROR(MATCH(A1,$B$1:$B$1000,0)))
        

        有了这个:

        = MATCH(A1,$B$1:$B$1000,0)))
        

        如果将以上内容应用于您的数据,如果 A1 匹配 $B$1:$B$1000 中的任何单元格,则将被格式化,因为任何不匹配都会返回错误。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-25
          • 2013-12-31
          • 1970-01-01
          • 1970-01-01
          • 2023-04-02
          相关资源
          最近更新 更多