【问题标题】:Set the background color for a fixed range of cells为固定范围的单元格设置背景颜色
【发布时间】:2010-04-30 16:45:10
【问题描述】:

我在 Excel 电子表格中有 VBA 代码。它用于根据单元格中的值设置单元格的字体和背景颜色。我在 VBA 而不是“条件格式”中执行此操作,因为我有 3 个以上的条件。代码是:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range, d As Range, fc As Long, bc As Long, bf As Boolean
Set d = Intersect(Range("A:K"), Target)
If d Is Nothing Then Exit Sub
For Each c In d
    If c >= Date And c <= Date + 5 Then
        fc = 2: fb = True: bc = 3
    Else
        Select Case c
            Case "ABC"
                fc = 2: fb = True: bc = 5
            Case 1, 3, 5, 7
                fc = 2: fb = True: bc = 1
            Case "D", "E", "F"
                fc = 2: fb = True: bc = 10
            Case "1/1/2009"
                fc = 2: fb = True: bc = 45
            Case "Long string"
                fc = 3: fb = True: bc = 1
            Case Else
                fc = 1: fb = False: bc = xlNone
        End Select
    End If
    c.Font.ColorIndex = fc
    c.Font.Bold = fb
    c.Interior.ColorIndex = bc
    c.Range("A1:D1").Interior.ColorIndex = bc
Next
End Sub

问题出在“c.Range”行。它总是将当前单元格用作“A”,然后向右移动四个单元格。我希望它从当前行的“真实”单元格“A”开始,然后转到当前行的“真实”单元格“D”。基本上,我想要一个固定范围而不是动态范围。

【问题讨论】:

  • 只是为了验证,我假设您担心允许的条件数量,因为这将交付给不仅仅是 xl2007 的用户?
  • 我们使用的 Excel 2003 似乎只允许 3 个条件。用户有 6 个条件需要测试,包括他们无法在向导中使用的日期范围。

标签: excel conditional-formatting vba


【解决方案1】:

所以c.Range("A1:D1") 有自己的相对范围。
一种解决方案是改用工作表的范围属性。
我在顶部添加了两行(#added),并在底部更改了一行(#changed)。

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range, d As Range, fc As Long, bc As Long, bf As Boolean
Dim ws As Worksheet ''#added

Set d = Intersect(Range("A:K"), Target).Cells
Set ws = d.Worksheet ''#added
If d Is Nothing Then Exit Sub
For Each c In d.Cells
    If c >= Date And c <= Date + 5 Then
        fc = 2: bf = True: bc = 3
    Else
        Select Case c.Value
            Case "ABC"
                fc = 2: bf = True: bc = 5
            Case 1, 3, 5, 7
                fc = 2: bf = True: bc = 1
            Case "D", "E", "F"
                fc = 2: bf = True: bc = 10
            Case "1/1/2009"
                fc = 2: bf = True: bc = 45
            Case "Long string"
                fc = 3: bf = True: bc = 1
            Case Else
                fc = 1: bf = False: bc = xlNone
        End Select
    End If
    c.Font.ColorIndex = fc
    c.Font.Bold = bf
    c.Interior.ColorIndex = bc
    ws.Cells(c.Row, 1).Interior.ColorIndex = bc ''#changed
    ws.Cells(c.Row, 2).Interior.ColorIndex = bc ''#added
    ws.Cells(c.Row, 3).Interior.ColorIndex = bc ''#added
    ws.Cells(c.Row, 4).Interior.ColorIndex = bc ''#added
Next
End Sub

【讨论】:

  • 但这会设置“第一”行 (A1:D1) 的 A 到 D。我想要“当前”行的 A 到 D。如果我在单元格 E7 中输入“5/1/2010”,我希望 A7 到 D7 发生变化。如果我在单元格 c99 中输入“5/1/2010”,我希望 A99 到 D99 发生变化。基本上是当前列的前四个单元格。
  • @Count:很棒的收获。修复了那个问题。告诉我进展如何。
  • 既然你告诉我“c.Row”是当前行的编号,我把最后四行合二为一:ws.Range("A" & c.Row & ":D " & c.Row).Interior.ColorIndex = bc 非常感谢。
猜你喜欢
  • 2010-11-21
  • 1970-01-01
  • 2019-07-27
  • 2017-02-08
  • 2016-12-18
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
  • 2015-06-02
相关资源
最近更新 更多