2017-09-15 204 views
0

在我有一个工作簿中,D列中有一个公式可以导出列C中值的最后六位数。这些列位于标题为“JE”的表单中。我有一个动态的SQL连接查询,它具有A列中的值。该查询位于名为“required_refs”的工作表中。本质上,我想写:如果D列单元格中的值匹配/等于工作表“required_refs”中该查询中的任何值,则在工作表JE中将F列单元格变为红色。基于另一个单元格值更改单元格颜色

示例:如果单元格D10的值等于“required_refs”列A中的任意值,则将单元格F10变为红色。另外,如果单元格D13的值与表“required_refs”中列A中的值匹配/等于,则将F13变为红色。等等。

这是我试过的代码。我补充它在工作表“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列单元格变成红色。我已经提出了类似这样的问题,但是从那以后,我正在使用的工作簿已经发生了一些变化,这个问题比前一个更简单。 如果有人可以帮忙,我会很感激。谢谢!

+0

您可以尝试将'Range(“F7:F446”)。ActiveCell'更改为'cell' – Prisoner

回答

0

你的代码有很多问题。

  1. .Value返回基本类型,如字符串或long。您不能将其分配给范围变量。
  2. 您的End IfNext cell语句被换掉。 总是使用正确的缩进因此这些错误变得更加明显。
  3. 你有一个未申报的变量cell。这可能会导致错误。在VBE中,打开Tools > Options > Editor > Required Variable Declaration选项可强制在新模块中使用Option Explicit

修复这些问题,使我们这样的:

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 

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

+0

非常感谢您的解释和纠正。我很感激。你是否建议使用先进的过滤器而不是vba来完成细胞颜色变化?再次感谢! – anve

+0

@anve对不起。我的意思是在*** VBA中使用高级过滤器***。当然,这需要通过在数据上添加额外的四行来更改工作表,或者在VBA中暂时添加。如果在你的情况下运行循环的时间是可以接受的,那么就没有必要进入额外的复杂度。我在一般情况下发言,并且在下次您做类似​​的事情时考虑一下。 – robinCTS

+0

感谢您的澄清。我将你的代码合并到我的“JE”表单中,不幸的是,它不会将F列单元格变成红色。它不会导致任何错误或任何事情。但是,我会继续调查,看看我能否实现它。再次感谢您的帮助! – anve

相关问题