我试图以下列方式设置橙色:
WorkSheet.Range("A1:A5").Interior.color = 49407
和
WorkSheet.Range("A1:A5").Interior.color = &HC0FF 'Hex value of 49407
这两个应该是完全相同的吗? 设定的颜色不同。
答案 0 :(得分:32)
不,这些值不相同: &HC0FF
是-16129,而 &HC0FF&
是49407.
VBA是一种相当古老的语言,默认情况下使用16位整数。在这个时代,你几乎总是希望多头而不是整数,但是你必须向VBA询问它们。
&HC0FF
是一个从十六进制定义16位常量的构造。因为当解释为16位值时,此值中的符号位设置为(on,negative),因此转换为-16129。我们可能会认为这很糟糕,但它不是一个错误!当您使用-16129(作为有符号整数)时,以32位形式,1通过整个前16位传播,并导致蓝色值为255.
这里你真正想要的是一个32位十六进制常量:&HC0FF&
。
最后的额外&
告诉VBA这是一个长常量而不是int。以32位解释,这是一个正值,因此给出了你正在寻找的十进制等值。
简而言之,要求使用尾随&
的长十六进制常量。
顺便说一下,当使用十进制常量时,这种VBA向16位的倾向也会咬我们,例如在16000 * 16000的表达式中,它将溢出16位算术。因此,有时需要在十进制常量上使用尾随&
(或者首先将其分配给一个长整数)。
答案 1 :(得分:8)
这会将您拥有的十六进制格式颜色转换为Office用于RGB颜色的RGB Long:
Function HexToLongRGB(sHexVal As String) As Long
Dim lRed As Long
Dim lGreen As Long
Dim lBlue As Long
lRed = CLng("&H" & Left$(sHexVal, 2))
lGreen = CLng("&H" & Mid$(sHexVal, 3, 2))
lBlue = CLng("&H" & Right$(sHexVal, 2))
HexToLongRGB = RGB(lRed, lGreen, lBlue)
End Function
答案 2 :(得分:6)
我相信Gimp和Johannes的答案都错过了关键问题。
计算机屏幕上的颜色是通过指定所需的红色,蓝色和绿色来定义的。对于三种颜色中的每种颜色,您可以指定0到255之间的数字。这三个数字通常通过连接三个单独的数字指定为单个数字。使用Html,您可以将颜色指定为#RRGGBB,其中RR,GG和BB是十六进制数字,或者您可以用十进制等效值替换RRBBGG。使用Excel时,顺序反转为& HBBGGRR或十进制等效值。
49407是00C0FF的十进制等值,对于Excel表示蓝色= 0,绿色= 192,红色= 255。
但是& HC0FF或& H00C0FF是-16129或蓝色= 255,绿色= 192和红色= 255.这似乎是& H转换中的缺陷。无论如何我都找不到将C0FF转换为49407。
如果你坚持使用& H转换,我能提供的最好的是:
Range("A1:A5").Interior.color = &H01C0FF
这是蓝色= 1,绿色= 192和红色= 255,我无法区分蓝色= 0,绿色= 192和红色= 255。
但我建议:
Range("A1:A5").Interior.color = RGB(255,192,0)
因为RGB函数总是返回正数而您不必担心Excel的反向序列。
答案 3 :(得分:4)
Colorcode通常由三个值组成,RED,GREEN,BLUE。你的Hexcode缺少三个中的一个,excel用FF自动填充它。所以你的颜色C0FF被转换为FFC0FF。
这是一个Exampleprogram,因此你可以看到它的实际效果,制作一个新工作表并执行它。
' C0FF will be changed to be FFC0FF
Range("A1").Interior.Color = &HC0FF
Range("A1").Select
ActiveCell.FormulaR1C1 = Range("A1").Interior.Color
Range("A2").Select
ActiveCell.FormulaR1C1 = "=DEC2HEX(R[-1]C,6)"
' 49407 is actually 00C0FF
Range("B1").Interior.Color = 49407
Range("B1").Select
ActiveCell.FormulaR1C1 = Range("B1").Interior.Color
Range("B2").Select
ActiveCell.FormulaR1C1 = "=DEC2HEX(R[-1]C,6)"
' Use RGB to have better control over your results
' Switch the order when doing so: 00C0FF => 00 Blue C0 Green FF Red
Range("C1").Interior.Color = RGB(&HFF, &HC0, &H0)
Range("C1").Select
ActiveCell.FormulaR1C1 = Range("C1").Interior.Color
Range("C2").Select
ActiveCell.FormulaR1C1 = "=DEC2HEX(R[-1]C,6)"
编辑:添加了第三个示例,用于说明如不同答案中所建议的那样切换颜色。