分享

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

 株野 2022-06-22 发布于陕西

作者: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、颜色设置代码和效果

  1. '设置单元格背景颜色
  2. Sub setColor()
  3. '黑色
  4. Range("A1") = "黑色"
  5. Range("A2").Interior.ColorIndex = 1
  6. Range("A3").Interior.Color = RGB(0, 0, 0)
  7. Range("A4").Interior.Color = 0
  8. Range("A5").Interior.Color = &H0
  9. '红色
  10. Range("B1") = "红色"
  11. Range("B2").Interior.ColorIndex = 3
  12. Range("B3").Interior.Color = RGB(255, 0, 0)
  13. Range("B4").Interior.Color = 255
  14. Range("B5").Interior.Color = &HFF
  15. '绿色
  16. Range("C1") = "绿色"
  17. Range("C2").Interior.ColorIndex = 4
  18. Range("C3").Interior.Color = RGB(0, 255, 0)
  19. Range("C4").Interior.Color = 65280 '255*256=65280
  20. Range("C5").Interior.Color = &HFF00
  21. '蓝色
  22. Range("D1") = "蓝色"
  23. Range("D2").Interior.ColorIndex = 5
  24. Range("D3").Interior.Color = RGB(0, 0, 255)
  25. Range("D4").Interior.Color = 16711680 '255*256*256=16711680
  26. Range("D5").Interior.Color = &HFF0000
  27. 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开头)。代码如下:

  1. Sub setColor()
  2. '黑色
  3. Range("A1") = "黑色"
  4. Range("A2").Interior.ColorIndex = 1
  5. Range("A3").Interior.Color = RGB(0, 0, 0)
  6. Range("A4").Interior.Color = 0
  7. Range("A5").Interior.Color = &HCC000000
  8. '红色
  9. Range("B1") = "红色"
  10. Range("B2").Interior.ColorIndex = 3
  11. Range("B3").Interior.Color = RGB(255, 0, 0)
  12. Range("B4").Interior.Color = 255
  13. Range("B5").Interior.Color = &HCC0000FF
  14. '绿色
  15. Range("C1") = "绿色"
  16. Range("C2").Interior.ColorIndex = 4
  17. Range("C3").Interior.Color = RGB(0, 255, 0)
  18. Range("C4").Interior.Color = 65280 '255*256
  19. Range("C5").Interior.Color = &HCC00FF00
  20. '蓝色
  21. Range("D1") = "蓝色"
  22. Range("D2").Interior.ColorIndex = 5
  23. Range("D3").Interior.Color = RGB(0, 0, 255)
  24. Range("D4").Interior.Color = 16711680 '255*256*256
  25. Range("D5").Interior.Color = &HCCFF0000
  26. '黄色
  27. Range("E1") = "黄色"
  28. Range("E2").Interior.ColorIndex = 6
  29. Range("E3").Interior.Color = RGB(255, 255, 0)
  30. Range("E4").Interior.Color = 65535 '255*256+255
  31. Range("E5").Interior.Color = &HCC00FFFF
  32. '金色
  33. Range("F1") = "金色"
  34. Range("F2").Interior.ColorIndex = 44
  35. Range("F3").Interior.Color = RGB(255, 204, 0)
  36. Range("F4").Interior.Color = 52479 '204*256+255
  37. Range("F5").Interior.Color = &HCC00CCFF
  38. End Sub

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多