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

问题描述 投票:0回答:5

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

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

这可以实现吗?

excel vba colors cell
5个回答
38
投票

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)

7
投票

D1中输入:

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

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

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

enter image description here


2
投票

我想扩展蒂姆·威廉姆斯的精彩答案。我需要能够根据其他单元格在我的单元格中显示十六进制值。因此,我还希望将字体设置为白色或黑色。所以我修改了函数如下:

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)
并得到以下结果:

Excel sheet


1
投票

假设您希望它适用于整个列,而不仅仅是第 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


0
投票

“ThisCell”属性的手册页包含此警告:“用户在用户定义的函数内部时不应访问 Range 对象上的属性或方法。” Tim Williams 的 UDF 忽略警告并通过使用“Evaluate”方法规避它,以便在执行 UDF 时立即更改颜色。

在警告之后,手册页有这样的建议:“用户可以缓存 Range 对象以供以后使用,并在重新计算完成后执行其他操作”。

这是 Tim Williams 的 UDF 的修改版本,它达到了相同的结果,但遵守警告并遵循建议。 它安排 ChangeIt sub 的执行“立即”发生,这将其放置在队列的底部,以便在重新计算完成后执行。

Dim clr As Long, src As Range
Function myRGB(r, g, b)

    Dim f

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

    Set src = Application.ThisCell

    f = "Application.OnTime Now, Changeit()"
    src.Parent.Evaluate f
    myRGB = ""
End Function

Sub ChangeIt()
    src.Interior.Color = clr
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.