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

Posted 宋哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VBA研究关于单元格颜色值的十六进制赋值相关的知识,希望对你有一定的参考价值。

作者: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被系统认为是负数(-256),按补码规则,扩充位数(16bit到24bit)时高位补1,我试了一下用&HFFFF赋值,结果是白色,和&HFFFFFF完全相同。我想用&H00FF00赋值,但是开发环境立即优化,去掉前面的00,看来用十六进制表示颜色值是不保险的(十进制没有问题但不直观),还是用RGB()函数吧。

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

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

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

以上是关于VBA研究关于单元格颜色值的十六进制赋值的主要内容,如果未能解决你的问题,请参考以下文章

VBA-如何选择具有值的列单元格

Excel VBA自动创建sheet,设置字体,单元格颜色和边框

Excel vba中怎样填写数值改变单元格后触发事件

excel vba如何将选中的不连续单元格赋值到数组

求VBA高手 ComboBox 自动出现在单元格,选择值后自动赋值给当前单元格的问题

VBA研究关于工作表单元格复制粘贴的语句