Excel 根据其中一个单元格的内容为整行着色

Excel 根据其中一个单元格的内容为整行着色,excel,vba,formatting,Excel,Vba,Formatting,我试图根据其中一列给出的结果给电子表格上色。我正在使用以下代码: With newSheet.Range("B:B") .FormatConditions.Add(Excel.XlFormatConditionType.xlCellValue, Excel.XlFormatConditionOperator.xlEqual, "CORRECT") .FormatConditions(1).Interior.ColorIndex = 4 .FormatConditions

我试图根据其中一列给出的结果给电子表格上色。我正在使用以下代码:

With newSheet.Range("B:B")
    .FormatConditions.Add(Excel.XlFormatConditionType.xlCellValue, Excel.XlFormatConditionOperator.xlEqual, "CORRECT")
    .FormatConditions(1).Interior.ColorIndex = 4

    .FormatConditions.Add(Excel.XlFormatConditionType.xlCellValue, Excel.XlFormatConditionOperator.xlEqual, "INCORRECT")
    .FormatConditions(2).Interior.ColorIndex = 3
End With
.FormatConditions.Add(Type:=XlFormatConditionType.xlExpression, Formula1:="=B" & row & "= ""CORRECT"")")
.FormatConditions(1).Interior.ColorIndex = 4
不幸的是,这只会给包含“正确”或“不正确”的单元格着色。我希望它扩展到它们所在的行(例如,如果B12包含“CORRECT”,我希望A12:G12都是绿色的)。有人建议我尝试使用表达式,因此我尝试了以下代码:

With newSheet.Range("B:B")
    .FormatConditions.Add(Excel.XlFormatConditionType.xlCellValue, Excel.XlFormatConditionOperator.xlEqual, "CORRECT")
    .FormatConditions(1).Interior.ColorIndex = 4

    .FormatConditions.Add(Excel.XlFormatConditionType.xlCellValue, Excel.XlFormatConditionOperator.xlEqual, "INCORRECT")
    .FormatConditions(2).Interior.ColorIndex = 3
End With
.FormatConditions.Add(Type:=XlFormatConditionType.xlExpression, Formula1:="=B" & row & "= ""CORRECT"")")
.FormatConditions(1).Interior.ColorIndex = 4

但是,这将返回一个E_INVALIDARG异常。如果有任何关于如何解决这个问题的建议,我将不胜感激。我还应该注意到,在每一行中循环并一次检查一行并不是一个真正的选项,因为有数千行。

您可以将其粘贴到有问题的工作表中:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i As Integer
    i = 1
    While Range("B" & i).Value2 <> ""
        If Range("B" & i).Value2 = "INCORRECT" Then
            Range("A" & i & ":G" & i).Interior.ColorIndex = 3
        ElseIf Range("B" & i).Value2 = "CORRECT" Then
            Range("A" & i & ":G" & i).Interior.ColorIndex = 4
        Else
            Range("A" & i & ":G" & i).Interior.ColorIndex = 0
        End If
        i = i + 1
    Wend
End Sub
Private子工作表\u更改(ByVal目标作为范围)
作为整数的Dim i
i=1
而范围(“B”和“i”)。值2
如果范围(“B”和i).Value2=“不正确”,则
范围(“A”&i&“:G”&i)。Interior.ColorIndex=3
ElseIf范围(“B”和i).Value2=“正确”然后
范围(“A”&i&“:G”&i)。Interior.ColorIndex=4
其他的
范围(“A”&i&“:G”&i)。Interior.ColorIndex=0
如果结束
i=i+1
温德
端接头

这假设您的数据从第1行开始(否则更改
i
的起始值)。

您可以将其粘贴到相关工作表中:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i As Integer
    i = 1
    While Range("B" & i).Value2 <> ""
        If Range("B" & i).Value2 = "INCORRECT" Then
            Range("A" & i & ":G" & i).Interior.ColorIndex = 3
        ElseIf Range("B" & i).Value2 = "CORRECT" Then
            Range("A" & i & ":G" & i).Interior.ColorIndex = 4
        Else
            Range("A" & i & ":G" & i).Interior.ColorIndex = 0
        End If
        i = i + 1
    Wend
End Sub
Private子工作表\u更改(ByVal目标作为范围)
作为整数的Dim i
i=1
而范围(“B”和“i”)。值2
如果范围(“B”和i).Value2=“不正确”,则
范围(“A”&i&“:G”&i)。Interior.ColorIndex=3
ElseIf范围(“B”和i).Value2=“正确”然后
范围(“A”&i&“:G”&i)。Interior.ColorIndex=4
其他的
范围(“A”&i&“:G”&i)。Interior.ColorIndex=0
如果结束
i=i+1
温德
端接头

这假设数据从第1行开始(否则更改
i
的起始值)。

这是一个非常、非常低技术的答案。但是,当你用你需要的颜色突出显示单元格后(使用代码),复制列中的所有值,并在行本身上进行“格式”的特殊粘贴

问题是它将是静态的,如果您的值随输入而更改,则行上的颜色将关闭

但如果这是一次性的,那可能会奏效

如果执行此操作,请确保要计算的列具有与要粘贴到的行中的数据兼容的单元格格式类型(即:“常规”、“文本”等)

克鲁奇,但如果你绝对需要这么快,你只需要做一次,它可能会工作


编辑:非常确定Kevin下面的答案是更好的,因为它实际上是用代码解决的,而且看起来即使计算的单元格中的值发生变化,它也能工作

这是一个非常、非常低技术含量的答案。但是,当你用你需要的颜色突出显示单元格后(使用代码),复制列中的所有值,并在行本身上进行“格式”的特殊粘贴

问题是它将是静态的,如果您的值随输入而更改,则行上的颜色将关闭

但如果这是一次性的,那可能会奏效

如果执行此操作,请确保要计算的列具有与要粘贴到的行中的数据兼容的单元格格式类型(即:“常规”、“文本”等)

克鲁奇,但如果你绝对需要这么快,你只需要做一次,它可能会工作


编辑:非常确定Kevin下面的答案是更好的,因为它实际上是用代码解决的,而且看起来即使计算的单元格中的值发生变化,它也能工作

删除多余的右括号并使列成为绝对值后,您的公式应该可以使用

.FormatConditions.Add(Type:=XlFormatConditionType.xlExpression, Formula1:="=$B1= ""CORRECT""")
.FormatConditions(1).Interior.ColorIndex = 4

确保将公式中的行
$B1
设置为格式化范围的第一行(无需执行循环)

删除多余的右括号并使该列成为绝对值后,公式应能正常工作

.FormatConditions.Add(Type:=XlFormatConditionType.xlExpression, Formula1:="=$B1= ""CORRECT""")
.FormatConditions(1).Interior.ColorIndex = 4

确保将公式中的行
$B1
设置为格式化范围的第一行(无需执行循环)

谢谢,这样就完成了任务。使列成为绝对值是我挂起的部分-我以前没有正确理解xlExpression。括号是我试过的其他东西留下的。。。真不敢相信我错过了。谢谢,这就完成了。使列成为绝对值是我挂起的部分-我以前没有正确理解xlExpression。括号是我试过的其他东西留下的。。。真不敢相信我竟然错过了。谢谢你的建议,不幸的是,这是我在尝试条件格式之前所做的,对于数千行来说,速度非常慢(根据我的结果,速度大约慢30到60倍,而且越行越慢)。啊,好的。在这种情况下,您可以使用条件格式功能本身。在他们的示例中,他们使用
=$B2>75
作为条件,但对于不正确的格式,您可以使用
=$B2=“不正确”
。这应该更快,因为它使用本机功能。感谢您的建议,不幸的是,这是我在尝试条件格式之前所做的,对于数千行来说,速度非常慢(根据我的结果,速度大约慢30到60倍,而且随着行数的增加,这只会变得更糟)。啊,好的。在这种情况下,您可以使用条件格式功能本身。在他们的示例中,他们使用
=$B2>75
作为条件,但对于不正确的格式,您可以使用
=$B2=“不正确”
。这应该更快,因为它使用本机功能。感谢您的建议,但我每天需要多次运行此代码。感谢您的建议,但我每天需要多次运行此代码。