Excel 为单元格着色动态选择行的一部分

Excel 为单元格着色动态选择行的一部分,excel,vba,format,Excel,Vba,Format,我想根据单元格的值更改单元格的背景色,但不是整行。我有一些代码可以满足我的需要,但我相信有一种更有效的方法,我希望能得到一些帮助,使我的代码更高效。下面列出了执行该任务的代码片段 Sub chg_bkgrnd_Color() Dim rng As Range Dim row As Range Dim cell As Range Dim counter As Long Set rng = Range("k2:k23") Range("k2").Select For Each cell In

我想根据单元格的值更改单元格的背景色,但不是整行。我有一些代码可以满足我的需要,但我相信有一种更有效的方法,我希望能得到一些帮助,使我的代码更高效。下面列出了执行该任务的代码片段

Sub chg_bkgrnd_Color()

Dim rng As Range
Dim row As Range
Dim cell As Range
Dim counter As Long

Set rng = Range("k2:k23")
Range("k2").Select

For Each cell In rng

  Select Case cell.Value

    Case Is = "Closed"

      ActiveCell.Offset(counter, -10).Interior.ThemeColor = xlThemeColorDark1 
      ActiveCell.Offset(counter, -10).Interior.TintAndShade = -0.249977111117893
      ActiveCell.Offset(counter, -9).Interior.ThemeColor = xlThemeColorDark1
      ActiveCell.Offset(counter, -9).Interior.TintAndShade = -0.249977111117893
      ActiveCell.Offset(counter, -8).Interior.ThemeColor = xlThemeColorDark1
      ActiveCell.Offset(counter, -8).Interior.TintAndShade = -0.249977111117893
      ActiveCell.Offset(counter, -7).Interior.ThemeColor = xlThemeColorDark1
      ActiveCell.Offset(counter, -7).Interior.TintAndShade = -0.249977111117893


    End Select

    counter = counter + 1
  Next

End Sub

条件格式最好,但如果您希望使用普通格式,这是代码的简化版本:

Sub chg_bkgrnd_Color()
    Dim i&
    For i = 2 To 23
        If Cells(i, 11) = "Closed" Then
            With Range(Cells(i, 1), Cells(i, 4)).Interior
                .ThemeColor = xlThemeColorDark1
                .TintAndShade = -0.249977111117893
            End With
        End If
    Next
End Sub
根据@Jeeped的建议,这里有一个用于自动执行此操作的版本。在工作表的“代码”模块中,放置以下内容:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    RangeAutoBackFill "Closed", 11, 2, 23, 1, 4, xlThemeColorDark1, -0.249977111117893

End Sub
Public Sub RangeAutoBackFill(Key$, KeyCol&, KeyRowLow&, KeyRowHigh&, FillColLow&, FillColHigh&, FillTheme&, FillTint#)
    Dim i&
    For i = KeyRowLow To KeyRowHigh
        If Cells(i, KeyCol) = Key Then
            With Range(Cells(i, FillColLow), Cells(i, FillColHigh)).Interior
                .ThemeColor = FillTheme
                .TintAndShade = FillTint
            End With
        End If
    Next
End Sub
然后在标准代码模块中,放置以下内容:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    RangeAutoBackFill "Closed", 11, 2, 23, 1, 4, xlThemeColorDark1, -0.249977111117893

End Sub
Public Sub RangeAutoBackFill(Key$, KeyCol&, KeyRowLow&, KeyRowHigh&, FillColLow&, FillColHigh&, FillTheme&, FillTint#)
    Dim i&
    For i = KeyRowLow To KeyRowHigh
        If Cells(i, KeyCol) = Key Then
            With Range(Cells(i, FillColLow), Cells(i, FillColHigh)).Interior
                .ThemeColor = FillTheme
                .TintAndShade = FillTint
            End With
        End If
    Next
End Sub

您正在询问如何根据列K中的相应值是否为“闭合”来获取列A:D中的单元格以具有高亮显示。是一个更好的解决方案,因为它可以立即对K列中的更改进行自动背景反应

Sub Create_Conditional_Formatting_for_AD_based_on_K_Closed()
    Dim v As Long, vSTATEs As Variant, vCOLOURs As Variant

    vSTATEs = Array("Open", "Closed", "Pending")
    vCOLOURs = Array(3, 10, 5)

    With ActiveSheet.Columns("A:D")
        .FormatConditions.Delete
        For v = LBound(vSTATEs) To UBound(vSTATEs)
            With .FormatConditions.Add(Type:=xlExpression, _
              Formula1:="=$K1=" & Chr(34) & vSTATEs(v) & Chr(34))
                With .Interior
                    .ColorIndex = vCOLOURs(v)
                End With
                .StopIfTrue = True
            End With
        Next v
    End With

End Sub
此例程可能非常适合于将CF规则应用于大量工作表的情况,或者作为定期导入到新工作表的重复任务,但它可能比简单地手动创建六条规则要复杂得多

我使用
.ColorIndex
属性简化了回填颜色的选择。您可以找到一个颜色索引编号和颜色表

请注意,在构建新的CF规则之前,我正在删除A:D列中带有“应用于”的先前CF规则。如果您在a:D列中有其他CF规则来管理行为,那么这可能是一个考虑因素

在CF规则中使用公式,并使用绝对$指示符锁定列K引用,可以实现应用于:与正在计算的列不同。使用家► 条件格式► 管理规则以查看结果

手动方法:

  • 选择A:D列,A1列为
  • 选择家► 条件格式► 新规则
  • 选择使用公式确定要格式化的单元格,并在该公式为真的格式值中提供以下内容:文本框:

    =$K1=“closed

  • 单击并从“填充”选项卡中选择适当的高光组合
  • 单击“确定”接受格式更改,然后再次单击“确定”创建规则
  • 如有必要,请转至步骤2并重复。如果从主页开始► 条件格式► 管理规则并选择“新建”,您可以保存几次单击
  • 您的结果应该类似于以下内容


    为什么不使用?我只需要一系列突出显示的单元格,而不是整行。正如Jeeped所问,您可以有条件地格式化少数单元格,而无需有条件地格式化整行或整列。这似乎比绑定重新创建现有单元格要简单得多。寻址的额外积分不管方法的适用性如何,实际的问题都会出现。我有时会忘记解决这个问题。Excel Hero,我回复了上面的Jeeped,并感谢他提供的示例。我对如何继续使用这个问题有一些想法。我能够接受您的代码建议并使其适用于我的示例,正如我在上面解释的,我问得不好我的问题。您的示例提供了一个很好的例子,说明了我试图在代码中优化的内容。由于我不熟悉这一点,我还有两个额外的问题:在“Dim I”之后,符号和做什么&“你能推荐一些用vba教授细胞方法的Excel编程书吗?”?再次感谢您在这方面的帮助。这可以充实到一个事件宏中,为您提供一个真正伟大的答案,提供一个自动响应的回填。@Aaron John Walkenbach的任何一本书都不会出错。喜欢此外,有许多方法可以从VBA引用单元格和范围。多年前,我在我的网站上发表了一篇文章,展示了使用大多数常用方法访问范围的相对速度@Aaron关于
    尺寸i&
    。。。符号是将变量声明为Long的快捷方法。VBA中的许多内在变量类型都有一个快捷方式。这些快捷方式称为类型声明字符。其他重要的是用于Double的
    #
    和用于String的
    $
    。你会听到一些Yahoo哀叹他们是坏习惯。它们的使用绝对没有问题。有时我使用它们,有时我使用冗长(正常/现代)的方式。1977年,当我在Commodore宠物电脑上学习BASIC时,我开始使用类型声明字符!吉普,谢谢你的例子。我想我理解你的观点,即利用现有的Excel功能比从头开始创建更有效。话虽如此,我问的问题做得不够好,所以很抱歉造成混乱。我想知道如何以更有效的方式在代码中实现我正在做的事情。基本上,想要知道如何在不需要执行原始样本中所有明确说明的情况下动态更新相关单元格的背景颜色,我需要测试六个条件;Open、Closed、Pending等。要对您的示例执行此操作,我是否可以在“with ActiveSheet.Columns(“a:D”)”之后添加一个select case语句,并为每个测试条件复制代码块的其余部分?再次感谢您的示例,尽管我能够合并“Excel Hero”示例,这与我的尝试更为一致。请参阅上面通过两个变体数组的附加循环。Jeeped,这非常酷。我不理解所有的细节,但我知道代码是如何在高层次上工作的。你能解释一下CF工具是如何理解代码的吗?它只是:=“=$K1=”引用吗?再次感谢您为此花费额外的时间和精力;一个带有条件词,另一个带有相关颜色变化。罗