以十六进制和十进制设置颜色的行为方式不同

Ani*_*han 11 excel vba excel-vba

我试图以下列方式设置橙色:

WorkSheet.Range("A1:A5").Interior.color = 49407
Run Code Online (Sandbox Code Playgroud)

WorkSheet.Range("A1:A5").Interior.color = &HC0FF 'Hex value of 49407
Run Code Online (Sandbox Code Playgroud)

这两个应该是完全相同的吗?设置的颜色是不同的.

Eri*_*idt 34

不,这些值不相等:&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位算术.因此,有时需要使用&十进制常量的尾随(或者首先将一个指定为长整数).


Ste*_*erg 10

这会将您拥有的十六进制格式颜色转换为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
Run Code Online (Sandbox Code Playgroud)


Ton*_*ore 7

我相信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
Run Code Online (Sandbox Code Playgroud)

这是蓝色= 1,绿色= 192和红色= 255,我无法区分蓝色= 0,绿色= 192和红色= 255.

但我会建议:

Range("A1:A5").Interior.color = RGB(255,192,0)
Run Code Online (Sandbox Code Playgroud)

因为RGB函数总是返回正数,您不必担心Excel的反向序列.