【问题标题】:Changing Color based on value根据值更改颜色
【发布时间】:2026-02-17 23:35:02
【问题描述】:

我正在制作一个带有三个按钮的表单和一个小的数据电子表格。每个按钮将对应不同范围的可接受结果。当您按下第一个按钮时,我希望它将工作表中的结果突出显示为绿色(如果它们介于 38 和 44.4 之间),并将超出该范围的结果突出显示为红色。对于第二个按钮,我希望好的范围是 33 到 39.4,第三个按钮是 33 到 39.4(可接受的结果范围相同,测试类型不同)。基本上我需要为每个按钮制定不同的条件格式。我目前正在使用:

Sub Worksheet_SelectionChange(ByVal Target As Range)

If Target.Range("C16") > 44.4 Then Target.Interior.Color = vbRed
If Target.Range("C16") < 38 Then Target.Interior.Color = vbRed
If Target.Range("C16") >= 38 And Target <= 44.4 Then Target.Interior.Color = vbGreen


End Sub

我不熟悉选择更改属性,这无论如何都不起作用。不知道从这里去哪里。任何帮助,将不胜感激。谢谢!

【问题讨论】:

  • SelectionChange 不是属性,而是Worksheet 事件Worksheet_SelectionChange handles 当它被引发/触发时:它是一个 event handler 过程。旁注,事件处理程序应该是Private,你的隐式是Public
  • @Mat'sMug - 如果 Worksheet_SelectionChange 位于私有工作表代码表中(这是它要触发的唯一位置)而不是公共模块代码表,则它是隐式私有的。跨度>
  • @Mat'sMug - 嗯,我知道你不能从另一个代码表中调用它。它必须对该代码表公开,但除此之外是私有的。
  • @Jeeped 如果我在Sheet1 中有那个处理程序并说它是Debug.Print "Hello",然后转到Sheet2,并公开一个Public Sub Test(),它是Sheet1.Worksheet_Change Range("A1"),我将“Hello”打印到即时窗格中。 Seems Public means "public" after all ;-)

标签: excel vba colors conditional-formatting selectionchanged


【解决方案1】:

44.4 大于或等于 38,并且无论其他条件的结果如何,都会对其进行检查,这意味着任何大于或等于 38 的值都将变为绿色。

您需要更好地指定您的条件,特别是“在 X 和 Y 之间”部分。这看起来像是 Select Case 块的工作 - 例如,这将是“38 到 44.4 之间的绿色”代码:

Select Case ActiveSheet.Cells("C16").Value
    Case 38 To 44.4
       Target.Interior.Color = vbGreen
    Case Else
       Target.Interior.Color = vbRed
End Select

“33 到 39.4 之间的绿色”代码如下所示:

Select Case ActiveSheet.Cells("C16").Value
    Case 33 To 39.4
       Target.Interior.Color = vbGreen
    Case Else
       Target.Interior.Color = vbRed
End Select

注意到一个模式?将其参数化并放入自己的程序中:

Public Sub ConditionalHighlight(ByVal checkCell As Range, ByVal target As Range, ByVal lowerLimit As Double, ByVal upperLimit As Double)
    'ensure the value is a Double (and not an error or a string):
    If VarType(checkCell.Value) <> vbDouble Then Exit Sub

    'work with an actual Double instead of the Variant we get off the cell:
    Dim checkValue As Double
    checkValue = CDbl(checkCell.Value)

    Select Case checkValue
        Case lowerLimit To upperLimit
            target.Interior.Color = vbGreen
        Case Else
            target.Interior.Color = vbRed
    End Select

End Sub

现在只需从按钮的 Click 处理程序中调用它:

Private Sub Button1_Click()
    ConditionalHighlight Range("C16"), Range("whatever"), 38, 44.4
End Sub

Private Sub Button2_Click()
    ConditionalHighlight Range("C16"), Range("whatever"), 33, 39.4
End Sub

Private Sub Button3_Click()
    ConditionalHighlight Range("C16"), Range("whatever"), 42, 74.4
End Sub

【讨论】:

  • @Jeeped 谢谢,已修复。我讨厌那种令人困惑的Case Is 语法:)
【解决方案2】:

放入一个按钮:

Sub Button1()

    Dim myRange, cell As Range
    Set myRange = Range("C16:G16")

    For Each cell In myRange
       If cell.Value > 44.4 Then
          cell.Interior.Color = vbRed
       ElseIf cell.Value < 38 Then
          cell.Interior.Color = vbRed
       ElseIf cell.Value >= 38 And cell.Value <= 44.4 Then
          cell.Interior.Color = vbGreen
       End If
    Next
End Sub

【讨论】:

  • 效果很好,但是当我将范围更改为 ("C16:G16") 时,它会给我一个运行时错误。一系列单元格是否有不同的语法?或者知道为什么该范围不起作用?最糟糕的是,我可以为每个单元格复制/粘贴此代码五次...
  • 您需要在“Set myRange = Range("YourRange).查看更新后的帖子。
  • 使用Select CaseElseIf 这样您就不会比较已经满足一个标准的值。