在VBA中设置字体颜色

我想将单元格的字体颜色设置为特定的RGB值。

如果我使用

ActiveCell.Color = RGB(255,255,0) 

我得到黄色,但如果我使用更奇特的RGB值,如:

 ActiveCell.Color = RGB(178, 150, 109) 

我刚回来一个灰色。

为什么我不能使用任何RGB值? 你知道任何解决方法吗?

谢谢。

Excel只使用调色板中的颜色。 当您使用RGB值设置单元格时,它将select最接近匹配的调色板中的一个单元格。 你可以用你的颜色更新调色板,然后select你的颜色,这将工作。

这会让你看到调色板中的内容:

  Public Sub checkPalette() Dim i As Integer, iRed As Integer, iGreen As Integer, iBlue As Integer Dim lcolor As Long For i = 1 To 56 lcolor = ActiveWorkbook.Colors(i) iRed = lcolor Mod &H100 'get red component lcolor = lcolor \ &H100 'divide iGreen = lcolor Mod &H100 'get green component lcolor = lcolor \ &H100 'divide iBlue = lcolor Mod &H100 'get blue component Debug.Print "Palette " & i & ": R=" & iRed & " B=" & iBlue & " G=" & iGreen Next i End Sub 

这将让你设置调色板

 Public Sub setPalette(palIdx As Integer, r As Integer, g As Integer, b As Integer) ActiveWorkbook.Colors(palIdx) = RGB(r, g, b) End Sub 

一个快速提示:Excel调色板有两行颜色很less使用,通常可以设置为自定义值,而不会显示其他人的工作表变化。

以下是创build一套合理的“软调”颜色的代码,这些颜色远不及默认设置:


Public Sub SetPalePalette(可选wbk As Excel.Workbook)
'这个子程序创build了一个可以用于控制,标题和对话的浅色调的自定义调色板

' **此代码在公共领域**
“Nigel Heffernan http://Excellerando.Blogspot.com

“Excel调色板有两个很less使用的隐藏行:
'第一行:颜色17至24
'行2:颜色25到32 – 在此工作簿中由SetGrayPalette使用

“代码捕获现有的屏幕更新设置,如有必要,
暂时停止更新,而这个过程会产生刺激性
在屏幕上闪烁…并在需要时退出屏幕更新。

Dim bScreenUpdating As Boolean

bScreenUpdating = Application.ScreenUpdating

如果bScreenUpdating = True那么
Application.ScreenUpdating = False
万一

'如果Application.ScreenUpdating <> bScreenUpdating然后
'Application.ScreenUpdating = bScreenUpdating
'万一

如果wbk没有那么
设置wbk = ThisWorkbook
万一

用wbk

 .Colors(17) = &HFFFFD0 ' pale cyan .Colors(18) = &HD8FFD8 ' pale green. .Colors(19) = &HD0FFFF ' pale yellow .Colors(20) = &HC8E8FF ' pale orange .Colors(21) = &HDBDBFF ' pale pink .Colors(22) = &HFFE0FF ' pale magenta .Colors(23) = &HFFE8E8 ' lavender .Colors(24) = &HFFF0F0 ' paler lavender 

结束

如果Application.ScreenUpdating <> bScreenUpdating然后
Application.ScreenUpdating = bScreenUpdating
万一

结束小组

Public Sub SetGreyPalette()
'这个子程序创build了一个灰色自定义的调色板,你可以用它来控制,标题和对话

' **此代码在公共领域**
“Nigel Heffernan http://Excellerando.Blogspot.com

“Excel调色板有两个很less使用的隐藏行:
“行1:颜色17到24” – 在此工作簿中由SetPalePalette使用
'第二排:颜色25到32

“代码捕获现有的屏幕更新设置,如有必要,
暂时停止更新,而这个过程会产生刺激性
在屏幕上闪烁…记得要退出屏幕更新!

Dim bScreenUpdating As Boolean

bScreenUpdating = Application.ScreenUpdating

如果bScreenUpdating = True那么
Application.ScreenUpdating = False
万一

'如果Application.ScreenUpdating <> bScreenUpdating然后
'Application.ScreenUpdating = bScreenUpdating
'万一

与ThisWorkbook
.Colors(25)=&HF0F0F0
.Colors(26)=&HE8E8E8
.Colors(27)=&HE0E0E0
.Colors(28)=&HD8D8D8
.Colors(29)=&HD0D0D0
.Colors(30)=&HC8C8C8
'&HC0C0C0'跳过&HC0C0C0 – 这是主调色板中常规的25%灰度
.Colors(31)=&HB8B8B8'请注意,差距越来越大:人眼更敏感
.Colors(32)=&HA8A8A8'改变浅灰色,所以这将被视为线性尺度
结束

“Excel默认调色板的右列指定了以下灰度:

'颜色(56)=&H333333
'颜色(16)=&H808080
'颜色(48)=&H969696
'颜色(15)=&HC0C0C0'默认'25%灰色'

'这应该被修改,以改善颜色'差距',使颜色容易区分:

与ThisWorkbook
.Colors(56)=&H505050
.Colors(16)=&H707070
.Colors(48)=&H989898
.Colors(15)=&HC0C0C0
结束

如果Application.ScreenUpdating <> bScreenUpdating然后
Application.ScreenUpdating = bScreenUpdating
万一

结束小组

您可以select为每个工作簿的Open()和BeforeClose()事件编写“CaptureColors”和“ReinstateColors”函数…甚至可以为每个工作表的激活和停用事件编写一个“CaptureColors”和“ReinstateColors”函数。

我将代码放在某个地方,为3Dgraphics创build一个“热”颜色渐变,以32步的forms从“冷”蓝色变为“热”红色。 这比你想象的要困难得多:人类视觉系统会感觉到“等间隔”的色彩梯度(以对数强度运行,对红色,绿色和蓝色具有非线性权重作为“强”色)需要时间来构build – 而且您必须使用VBA将MS Chart强制转换为您指定的颜色。

 Sub color() bj = CStr(Hex(ActiveCell.Interior.Color)) If Len(bj) < 6 Then Do Until Len(bj) = 6 bj = "0" & bj Loop End If R = CLng("&H" & Right(bj, 2)) bj = Left(bj, Len(bj) - 2) G = CLng("&H" & Right(bj, 2)) bj = Left(bj, Len(bj) - 2) B = CLng("&H" & bj) End Sub 

谢谢你的回答和评论。

这真的给了我很大的麻烦,因为我的客户端在Excel中安装了其他插件,这些插件也篡改了调色板。

我最终取代了调色板中的几个颜色,然后把我的元素设置为特定的ColorIndex,但男孩,这不是很漂亮。