根据另一个单元格值更改单元格颜色

时间:2017-09-15 01:13:14

标签: excel vba excel-vba

在我的工作簿中,D列中有一个公式,用于派生C列中值的后六位数。这些列位于标题为" JE"的表格中。我有一个动态SQL连接查询,其中包含A列中的值。该查询位于标题为" required_refs"的工作表中。基本上,我想写一下:如果D列单元格中的值匹配/等于sheet" required_refs"中该查询中的任何值,请在表单JE中将F列单元格变为红色。

示例:如果单元格D10的值等于" required_refs"中A列中的任何值,请将单元格F10变为红色。此外,如果单元格D13具有匹配/等于工作表" required_refs"中A列中的值的值,则将F13变为红色。等等。

这是我试过的代码。我在Sheet" JE"中添加了它: 代码:

  Sub ChangeCellColor()

    Dim ref_code As Range: Set ref_code = Range("D7:D446").Value
    Dim refCode_Confirm As Range: Set refCode_Confirm = Worksheets("required_refs").Range("A:A").Value
    Dim colorChange As Range: Set colorChange = Worksheets("required_refs").Range("A:A")

    For Each cell In ref_code
        If cell.Value = refCode_Confirm.Value Then
            Range("F7:F446").ActiveCell.Interior.ColorIndex = 3
            Next cell
        End If
    End Sub

目前,此代码无法执行任何操作。它不会将F列单元格变为红色。我已经问了一个与此类似的问题但是,我使用的工作簿从那以后改变了一堆,这个问题比前一个问题简单得多。 如果有人可以提供帮助,我真的很感激。谢谢!

1 个答案:

答案 0 :(得分:0)

您的代码存在许多问题。

  1. .Value返回基本类型,如字符串或long。您无法将其分配给范围变量。
  2. 您的End IfNext cell语句被换掉了。 始终 使用正确的缩进,以便这些错误变得更加明显。
  3. 您有一个未声明的变量cell。这可能会导致错误。在VBE中,启用Tools > Options > Editor > Required Variable Declaration选项以强制在新模块中使用Option Explicit
  4. 解决这些问题导致我们:

    Sub ChangeCellColor()
    
      Dim cell As Range
      Dim ref_code As Range: Set ref_code = Range("D7:D446")
      Dim refCode_Confirm As Range: Set refCode_Confirm = Worksheets("required_refs").Range("A:A")
      Dim colorChange As Range: Set colorChange = Worksheets("required_refs").Range("A:A")
    
      For Each cell In ref_code
        If cell.Value = refCode_Confirm.Value Then
          Range("F7:F446").ActiveCell.Interior.ColorIndex = 3
        End If
      Next cell
    
    End Sub
    

    不幸的是,它仍然无效,因为您无法直接将单个值与VBA中的一列值进行比较。

    以下代码更正了此剩余问题。请注意选择好的有意义的名称以及使用RVBA作为变量。这是一个很好的提示,如何避免类似的错误。另请注意使用.Value2代替.Value。这是高度推荐。

    Sub ChangeCellColor()
    
      Dim rngRef As Range
      Dim rngRefsToCheck As Range: Set rngRefsToCheck = Range("D7:D446")
      Dim rngRequiredRefs As Range: Set rngRequiredRefs = Worksheets("required_refs").Columns("A")
      Dim rngColorChangeRequired As Range: Set rngColorChangeRequired = Columns("F")
    
      For Each rngRef In rngRefsToCheck
        If Not IsError(Application.Match(rngRef.Value2, rngRequiredRefs, 0)) Then
          rngColorChangeRequired.Cells(rngRef.Row).Interior.ColorIndex = 3
        End If
      Next rngRef
    
    End Sub
    

    实现颜色变化的最佳和最快方法是使用高级过滤器,从而避免循环。但是,由于你还在学习基础知识,我已经展示了循环版本。