根据存储在其他单元格中的 RGB 值动态更改单元格的背景颜色

Posted

技术标签:

【中文标题】根据存储在其他单元格中的 RGB 值动态更改单元格的背景颜色【英文标题】:Change a cell's background color dynamically according to a RGB value stored in other cells 【发布时间】:2016-01-15 17:40:13 【问题描述】:

我正在尝试在 Excel 中编写一个函数,该函数将根据存储在其他三个单元格中的值设置活动单元格的背景颜色(这三个单元格中的每一个都存储一个从 0 到 255 的数值,具体取决于颜色 R、G 或 B)。

所以 A1 单元格为 150,B1 单元格为 220,C1 单元格为 90(即 RGB(150, 220, 90))。我需要 D1 单元格的颜色是之前声明的 RGB(某种绿色),而且,如果我将函数放在 D2 中,它将选择存储在 A2、B2 和 C2 中的 RGB,依此类推...

这可以实现吗?

【问题讨论】:

请进一步解释。我不明白。 你应该可以使用这样的代码来设置单元格的颜色SomeCell.Interior.Color = RGB(150, 220, 90) 【参考方案1】:

UDF 版本:

Function myRGB(r, g, b)

    Dim clr As Long, src As Range, sht As String, f, v

    If IsEmpty(r) Or IsEmpty(g) Or IsEmpty(b) Then
        clr = vbWhite
    Else
        clr = RGB(r, g, b)
    End If

    Set src = Application.ThisCell
    sht = src.Parent.Name

    f = "Changeit(""" & sht & """,""" & _
                  src.Address(False, False) & """," & clr & ")"
    src.Parent.Evaluate f
    myRGB = ""
End Function

Sub ChangeIt(sht, c, clr As Long)
    ThisWorkbook.Sheets(sht).Range(c).Interior.Color = clr
End Sub

用法(在 D1 中输入):

=myRGB(A1,B1,C1)

【讨论】:

从来没有想过从函数中调用 sub 来进行更改,NICE。 美丽。这种技术也可用于实现许多其他事情。 这正是我所需要的!!谢谢蒂姆! TIM,用户定义函数,由您提供是一个有用的工具,将 3000 像素的 RGB 值生成到图像中。谢谢。【参考方案2】:

D1中输入:

=A1 & "," & B1 & "," & C1

并在工作表代码区域中,输入以下事件宏:

Private Sub Worksheet_Calculate()
   Range("D1").Interior.Color = RGB(Range("A1"), Range("B1"), Range("C1"))
End Sub

【讨论】:

这似乎不是很有用...带有硬编码范围 @ExcelHero 代码“设计”时考虑了问题。 即使这三个单元格实际上是所有 OP 想要的,您的解决方案也不是一个好的设计。为什么每次工作表计算时都运行这个?规定的任务应保持在绝对最少的执行次数内。 @Gary'sStudent 我很抱歉。现在再读一遍,我发现它比我预期的要严厉一些。 @Gary'sStudent,您的代码非常适合单元格 D1!有没有办法让这段代码在任何给定的单元格中工作,从任何给定的三个单元格组中绘制 RGB 数据?谢谢【参考方案3】:

假设您希望它适用于整个列而不是仅第 1 行,这里是工作表代码模块的 VBA 过程:

Private Sub Worksheet_Change(ByVal Target As Range)

    With Target
        If .Count = 1 Then
            If .Column < 4 Then
                Cells(.Row, 4).Interior.Color = RGB(Cells(.Row, 1), Cells(.Row, 2), Cells(.Row, 3))
            End If
        End If
    End With

End Sub

注意:我不知道您所说的以下内容是什么意思,因此没有解决它:and also, if I place the function in D2, it will select the RGB stored in A2, B2 and C2

【讨论】:

EH,我猜 Tim 的回答解决了未决问题。用户可以放置在任何地方的 UDF。 @A.S.H 也许吧。仍然不确定OP是什么意思。 设置颜色的小错字代码 - 最后一个值(蓝色)在 "Cells(.Row, 3)" 之前有一个句点应该是: Cells(.Row, 4).Interior.Color = RGB(单元格(.Row, 1), 单元格(.Row, 2), 单元格(.Row, 3))【参考方案4】:

我想详细介绍 Tim Williams 的绝妙答案。我需要能够根据其他单元格在我的单元格中显示十六进制值。因此,我还希望将字体设置为白色或黑色。于是我修改了函数如下:

Function hexColor(r, g, b)

    Dim bclr As Long, fclr As Long, src As Range, sht As String, f, v

     If IsEmpty(r) Or IsEmpty(g) Or IsEmpty(b) Then
        bclr = vbWhite
        fclr = vbBlack
    Else
        bclr = RGB(r, g, b)
        If ((r * 0.299) + (g * 0.587) + (b * 0.114) > 186) Then
            fclr = vbBlack
        Else
            fclr = vbWhite
        End If
    End If

    Set src = Application.ThisCell
    sht = src.Parent.Name

    f = "Changeit(""" & sht & """,""" & _
                  src.Address(False, False) & """," & bclr & "," & fclr & ")"
    src.Parent.Evaluate f

    Dim hr As String, hg As String, hb As String

    hr = Right("0" & Hex(r), 2)
    hg = Right("0" & Hex(g), 2)
    hb = Right("0" & Hex(b), 2)

    hexColor = "#" & hr & hg & hb
End Function

Sub ChangeIt(sht, c, bclr As Long, fclr As Long)
    ThisWorkbook.Sheets(sht).Range(c).Interior.Color = bclr
    ThisWorkbook.Sheets(sht).Range(c).Font.Color = fclr
End Sub

这意味着我可以输入以下两个单元格值:=hexColor(185,201,225)=hexColor(115,146,198) 得到如下结果:

【讨论】:

以上是关于根据存储在其他单元格中的 RGB 值动态更改单元格的背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

根据在单元格中的文本字段中输入的值动态增加表格视图单元格

集合视图单元格中的动态按钮宽度

根据其他节点的条件或行值动态更改 AG 网格上一个单元格样式

使用单元格中的值作为公式中的单元格引用?

如果单元格中的计算值发生变化,则更改单元格颜色

当我在另一个单元格中选择一个值时如何更改单元格的值