Excel VBA 编程基础 -- 对象(八)
- 2026-11-02 14:07:14
Excel VBA 编程基础 -- 对象(八)现在 Information 模块中还剩三个函数:IMEStatus、QBColor、RGB。IMEStatus 主要用于获取/设置输入法状态,这个我们在讲用户窗体(UserForms)时再讨论。下面来看两个与颜色有关的函数。 QBColor QBColor 的一般格式为: QBColor(color) 其中,color 是一个 0 ~ 15 之间的数值,QBColor 返回一个 Long 型的值。QBColor 实际上是一个转换函数,将一个用数值编码的颜色号码转换为一个用 RGB 表示的颜色值。 RGB RGB 的一般格式为: RGB(red, green, blue) 其中,red、green、blue 分别是颜色 RGB 表示法中的红(red)、绿(green)、蓝(blue)分量,是一个 0 ~ 255 之间的数值,0 表示该分量无值(不起作用),255 表示该分量为满值(饱和)。RGB 返回三分量混合后的值,是一个 Long 型的数值。 RGB 返回的值和 QBColor 返回的值是一样的,都是以 RGB 编码方式表示的颜色值。 例1. QBColor 和 RGB 用法示例 
图1 QBColor 和 RGB 用法示例 在这段代码中,我们首先用 QBColor 和 RGB 分别生成了黑色的颜色值,从输出窗口可以看到,黑色的颜色值为 0。 接下来我们分别生成两个绿色值:绿色和高亮绿色。QBColor 接受的颜色编码分别是 2 和 10,分别代表绿色和高亮绿色。RGB 接受三个颜色分量,因为是生成绿色,所以红色和蓝色分量都是 0。生成绿色的 RGB 函数是 RGB(0, &H80, 0),生成高亮绿色的 RGB 函数是 RGB(0, 255, 0)。 注:RGB 中的各分量值可以是十进制,也可以是十六进制,&H 表示十六进制。&H80 是十六进制 80,表示十进制的 128,&HFF 是十六进制 FF,表示十进制的 255。所以 RGB(0, &H80, 0) 等价于 RGB(0, 128, 0)。 从最后两行可以看出,QBColor(2) 和 RGB(0, &h80, 0) 表示同一颜色值,同理,QBColor(10) 和 RGB(0, 255, 0) 也表示同一颜色值。 这段代码中的 Hex$() 表示十六进制转换函数,其一般格式如下: Hex$(number) Hex(number) 其中,number 是一个 Long 类型的数值表达式。 这两个函数的作用相同,只不过 Hex$ 返回用 String 类型表示的十六进制,Hex 返回用 Variant/String 类型表示的十六进制。所以,如果你要将转换的结果赋给一个 String 类型的变量,请使用 Hex$,如果是赋给一个 Variant 类型的变量,则使用 Hex。这样可以避免 VBA 的隐式类型转换。 最后我们再看一下 QBColor 和 RGB 返回值的表示。 以 RGB 编码表示的颜色值,其内部表示形式是:RRGGBB,每一个分量占一个字节,总共占用 3 个字节。譬如绿色是 008000,高亮绿色是 00FF00。因为颜色值是一个 Long 型的数值,占用 4 个字节,高位字节不用,则用 0 填充。所以实际的内部表示形式是:00RRGGBB。因此上述颜色值的实际表示应该是 00008000 和 0000FF00。 但上述代码的输出结果并不是如我们所述的那样,譬如绿色的输出结果是 8000,高亮绿色是 FF00。这是因为 Hex$ 把前面的 0 去掉了。从下图我们可以看得更清楚: 
图2 颜色表示及 Hex$ 输出 从右侧立即窗口中可以看出,Hex$ 确实把前置 0 去掉了。 但这段代码还揭示了另外一个问题。根据我们上面所述,颜色值在内部表示为一个 4 字节的 Long 型整数,其表示形式为:00RRGGBB。但仔细看上面的输出结果,RGB(&HF, &H8A, &H20) 生成的颜色值,其内部表示应该是 001F8A20,但显示的结果却是 (00)208A1F。这是怎么回事? 这涉及到 CPU 对数据的内部表示问题。 对这个问题,将另外撰文。简单来说,Intel CPU 对数据的表示是低位字节在前,高位字节在后,这种表示方式称为小端序(little endian),而低位字节在后,高位字节在前的表示方式则称为大端序(big endian)。对于同一数据 001F8A20,两种表示方式示意如下: 
图3 大端序与小端序 对于数据,00 是高位字节,20 是低位字节。对于大端序,高位字节在前,低位字节在后,因此表示为 001F8A20,经过 Hex$ 转换后变为 1F8A20。对于小端序,低位字节在前,高位字节在后,因此表示为 208A1F00,经过 Hex$ 转换后变为 208A1F。 再回到颜色函数上来。QBColor 是早期 Basic 的颜色函数,生成的颜色有限,只有已编号的 16 种颜色。RGB 则是现代生成颜色值的通用方法,可以生成 256 * 256 * 256 = 16,777,216 种颜色,因此在实际编程中应该使用 RGB 函数来生成所需要的颜色值。 相关阅读 Excel VBA 编程基础 -- 对象(一) Excel VBA 编程基础 -- 对象(二) Excel VBA 编程基础 -- 对象(三) Excel VBA 编程基础 -- 对象(四) Excel VBA 编程基础 -- 对象(五) Excel VBA 编程基础 -- 对象(六) Excel VBA 编程基础 -- 对象(七)



本文来自网友投稿或网络内容,如有侵犯您的权益请联系我们删除,联系邮箱:wyl860211@qq.com 。