【VBA研究】关于单元格颜色值的十六进制赋值

VBA_Excel 专栏收录该内容
113 篇文章 12 订阅

作者:iamlaosong

1、单元格颜色的设置

背景颜色用属性Interior,字体颜色用属性Font。颜色的值,可以用Colorindex,这种方法只有Excel规定的56中颜色,如下图所示:

也可以用RGB()函数,这样就可以设置成任何颜色。RGB()函数函数实际是返回一个颜色值,因此,也可以直接赋值,只是这个值不直观而已。其实这个值就是RGB()函数的值,用十进制表示:

RGB(R,G,B)=B*256*256+G*256+R

其中R、G、B是红绿蓝三种颜色十进制值。

用十六进制表示颜色值就非常直观了,最低两位表示红色,最高两位表示蓝色,中间两位表示绿色,就是上图表格中十六进制值,只是红蓝调换一下位置,即:

&HBBGGRR,其中RR、GG、BB是红绿蓝三种颜色十六进制值。

如红色(ColorIndex=3)即RGB(255,0,0)可以用16进制数表示为&H0000FF

2、颜色设置方法

改变单元格的背景色用:     range.Interior.ColorIndex=
改变单元格的字体的颜色:   range.font.ColorIndex=

3、颜色设置代码和效果

'设置单元格背景颜色
Sub setColor()
    '黑色
    Range("A1") = "黑色"
    Range("A2").Interior.ColorIndex = 1
    Range("A3").Interior.Color = RGB(0, 0, 0)
    Range("A4").Interior.Color = 0
    Range("A5").Interior.Color = &H0
    '红色
    Range("B1") = "红色"
    Range("B2").Interior.ColorIndex = 3
    Range("B3").Interior.Color = RGB(255, 0, 0)
    Range("B4").Interior.Color = 255
    Range("B5").Interior.Color = &HFF
    '绿色
    Range("C1") = "绿色"
    Range("C2").Interior.ColorIndex = 4
    Range("C3").Interior.Color = RGB(0, 255, 0)
    Range("C4").Interior.Color = 65280      '255*256=65280
    Range("C5").Interior.Color = &HFF00
    '蓝色
    Range("D1") = "蓝色"
    Range("D2").Interior.ColorIndex = 5
    Range("D3").Interior.Color = RGB(0, 0, 255)
    Range("D4").Interior.Color = 16711680   '255*256*256=16711680
    Range("D5").Interior.Color = &HFF0000
End Sub

这个C5单元格颜色有点奇怪,明明设置的是绿色(用十六进制值&HFF00) ,结果却是这个颜色。设置完毕,再测试这个单元格的颜色值,居然是8号颜色,十六进制值&HFFFF00,如下图:

这是什么情况?难道16进制表示有什么问题吗?将该语句换成:

Range("C5").Interior.Color = &HFFFF00

 效果完全相同。

之所以这样,应该和十六进制数据转换有关系,&HFF00被系统认为是整型(整型数据范围: -32768 ~ 32767,16bit),但是为负数(-256),按补码规则,扩充到长整型时(长整型数据范围:-2147483648 ~ 2147483647,32bit)时高位补1,我试了一下用&HFFFF赋值,结果是白色,和&HFFFFFF完全相同。我想用&H00FF00赋值,但是开发环境立即优化,去掉前面的00,看来用十六进制表示颜色值是不保险的(十进制没有问题但不直观),还是用RGB()函数吧。

那么有没有解决办法呢?办法还是有的,既然开发环境会优化掉数字前面的00,那么只要不写00就行了,所以,只要将语句改成下面的形式就行了(后6位是颜色值):

Range("C5").Interior.Color = &H100FF00 - &H1000000

进一步研究发现,后面的H1000000减不减效果是一样的,也就是说,颜色赋值,只关心后面的24bit,高位是什么内容,没有关系。

VBA没有无符号整数,所以用VBA处理无符号整数(比如移位),会碰到与上面类似的问题,这一点要注意。真要处理,就用Byte类型吧。

最后,完整的看下效果吧。为了统一并防止出错,十六进制值都用CC开头,后跟6位颜色代码(用什么十六进制数开头都可以,只要不是0就行,用CC是因为颜色的英文是C开头)。代码如下:

Sub setColor()
    '黑色
    Range("A1") = "黑色"
    Range("A2").Interior.ColorIndex = 1
    Range("A3").Interior.Color = RGB(0, 0, 0)
    Range("A4").Interior.Color = 0
    Range("A5").Interior.Color = &HCC000000
    '红色
    Range("B1") = "红色"
    Range("B2").Interior.ColorIndex = 3
    Range("B3").Interior.Color = RGB(255, 0, 0)
    Range("B4").Interior.Color = 255
    Range("B5").Interior.Color = &HCC0000FF
    '绿色
    Range("C1") = "绿色"
    Range("C2").Interior.ColorIndex = 4
    Range("C3").Interior.Color = RGB(0, 255, 0)
    Range("C4").Interior.Color = 65280     '255*256
    Range("C5").Interior.Color = &HCC00FF00
    '蓝色
    Range("D1") = "蓝色"
    Range("D2").Interior.ColorIndex = 5
    Range("D3").Interior.Color = RGB(0, 0, 255)
    Range("D4").Interior.Color = 16711680     '255*256*256
    Range("D5").Interior.Color = &HCCFF0000
    '黄色
    Range("E1") = "黄色"
    Range("E2").Interior.ColorIndex = 6
    Range("E3").Interior.Color = RGB(255, 255, 0)
    Range("E4").Interior.Color = 65535     '255*256+255
    Range("E5").Interior.Color = &HCC00FFFF
    '金色
    Range("F1") = "金色"
    Range("F2").Interior.ColorIndex = 44
    Range("F3").Interior.Color = RGB(255, 204, 0)
    Range("F4").Interior.Color = 52479     '204*256+255
    Range("F5").Interior.Color = &HCC00CCFF
    
End Sub

  • 1
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值