excel 如何引用范围对象从单元格中提取RGB值

p3rjfoxz  于 2023-11-20  发布在  其他
关注(0)|答案(5)|浏览(230)

我试图从工作表中的单元格中提取RGB值,并将另一个范围(多个区域)的单元格背景格式化为该颜色-作为奖励,如果颜色较暗,则将文本格式化为白色。
有多组值,影响不同的区域。一些单元格有菜单来选择颜色,最终我希望任何变化都能自动触发相关单元格的格式设置。
我正试着从公司通讯允许使用的颜色列表中挑选一组颜色用于技术报告。有一个网格,我们可以看到所有的组合,并找出我们是否可以区分它们-无论是视力正常的人,还是我们这些有颜色缺陷的人。
最终的计划将是调用几个外部例程中的一个来设置范围,或者传递一个变量以在case语句中使用。
这是可行的:

DestColor = RGB(Range("d4"), Range("e4"), Range("f4"))
Sheets("Main").Range("$B$5:$P$5,$B$4,$I$2,$I$4,$I$6,$I$8,$I$10,$I$12,$I$14,$I$16,$I$18").Interior.Color = DestColor

字符串
这给
1004:应用程序定义或对象定义错误

Set DestCells = Sheets("Main").Range("$B$5:$P$5,$B$4,$I$2,$I$4,$I$6,$I$8,$I$10,$I$12,$I$14,$I$16,$I$18")
DestColor = RGB(Range("d4"), Range("e4"), Range("f4"))
Sheets("Main").Range(DestCells).Interior.Color = DestColour


我创建了一个名为DestCells的Range类型的对象,所以我应该能够在任何使用Range(...)的地方使用它。
是我误解了什么,还是我的语法有问题?
最终,我将寻找这样的一个子:

Sub SetCells(DestCells As Range, ColorVals As Range)
  
  vRed = ColorVals.Columns(1)
  vGreen = ColorVals.Columns(2)
  vBlue = ColorVals.Columns(3)
' some more stuff to go in here ...
End Sub


但试着把它叫做(并简化测试范围):

SetCells(Sheets("Main").Range("$B$5:$P$5"), Sheets("Main").Range("d4:f4"))



编译错误:预期=
我试过带括号和不带括号。

j0pj023g

j0pj023g1#

对于本部分:

Set DestCells = Sheets("Main").Range("$B$5:$P$5,$B$4,$I$2,$I$4,$I$6,$I$8,$I$10,$I$12,$I$14,$I$16,$I$18")
DestColor = RGB(Range("d4"), Range("e4"), Range("f4"))
Sheets("Main").Range(DestCells).Interior.Color = DestColour

字符串
这一行Sheets("Main").Range(DestCells).Interior.Color = DestColourDestCells已经是一个范围,因此删除.Range()。您已经引用了工作表,因此不需要Sheets("Main")
制作:

Set DestCells = Sheets("Main").Range("$B$5:$P$5,$B$4,$I$2,$I$4,$I$6,$I$8,$I$10,$I$12,$I$14,$I$16,$I$18")
DestColor = RGB(Range("d4"), Range("e4"), Range("f4"))
DestCells.Interior.Color = DestColour


对于本部分:

SetCells(Sheets("Main").Range("B5:P5"), Sheets("Main").Range("d4:f4"))


() on calls让它认为你正在返回一些东西,你想要:

SetCells Sheets("Main").Range("B5:P5"), Sheets("Main").Range("d4:f4")

cclgggtu

cclgggtu2#

Sheets("Main").Range(DestCells).Interior.Color = DestColour

字符串

DestCells.Interior.Color = DestColour

其他几个问题:

1.一旦你设置了一个范围,你可以直接像上面那样引用它。
1.您可以删除所有锁定的单元格引用($)。它们对您的代码没有任何帮助,同时降低了可读性
1.你正在使用两种颜色的拼写(不是问题,只是有趣)

epggiuax

epggiuax3#

你可以通过阅读单元格内部填充ColorIndex(而不是Color)并将其与深色ColorIndex列表进行比较来处理字体颜色挑战。这里有一个函数和一些代码来测试.在运行测试子程序之前,只需选择一个具有不同单元格颜色的区域:

Option Explicit
Sub fontColourTest()
    Dim cell As Range
    For Each cell In Selection
        cell.Font.Color = fontColour(cell.Interior.ColorIndex)
    Next cell
End Sub
Private Function fontColour(interiorColour As Integer)
    Dim darkIndexes As Variant
    Dim i As Integer
    darkIndexes = Array(1, 3, 5, 9, 10, 11, 12, 13, 14, 16, 18, 21, 23, 25, 26, 29, 30, 31, 32, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56)
    For i = 0 To UBound(darkIndexes)
        If interiorColour = darkIndexes(i) Then
            Exit For
        End If
    Next i
    If i > UBound(darkIndexes) Then
        'the interior colour was not found in the dark indexes - use black font:
        fontColour = 0
    Else
        'dark interior - use white font:
        fontColour = 16777215
    End If
End Function

字符串
可能有一个更复杂的方法。如果黑色和白色是目标,这个方法很好用,但是直接推断“相反”的颜色会很方便。也许一些关于RGB值的简单数学。

kyxcudwk

kyxcudwk4#

下面是一个获取单元格RGB细节的程序.

Sub GetRGBDetails()

Dim ColorToGet, NewColor As Double
 
'Get the color of a cell
ColorToGet = Range("A1").Interior.Color
 
'Get the decomposition of color
Red = ColorToGet And 255
Green = ColorToGet \ 256 And 255
Blue = ColorToGet \ 256 ^ 2 And 255
 
'Set the color on a new variable
NewColor = RGB(Red, Green, Blue)

End Sub

字符串

ttvkxqim

ttvkxqim5#

谢谢大家-一个最友好和乐于助人的群体。所有的贡献都是有用的,但@Warcupine是理解我错在哪里的关键。现在整个事情都建立起来了-我发现一旦我越过了那个路障,它就相当容易了。再次感谢。

相关问题