新人报到,400分放血,进来帮我就送分.VBA设置颜色常量的问题.

finder_zhang 2018-10-09 10:45:28
大家好,新人报到,400分放血!

我之前是用C语言多,今天刚开始学习写VBA程序,一边查x度,一边写程序.
做的是一个简单的,在符合条件时,把某单元格的背景色设置为某一颜色.
根据以往的经验,如果我直接写 Cells(y,x).Interior.Color = RGB(r,g,b) ,是可以的,
但以下写法应该会更好
Const myBgColor As Long = ????
... ... ....
Cells(y,x).Interior.Color = myBgColor
这样会更方便以后代码维护.

问题出在 Const myBgColor As Long = ???? 处,问号该如何写?

想当然地,我这样写(C语言我是这样写的), Const myBgColor As Long = RGB(r,g,b)
报错信息是"要求常量表达式",这个 RGB(r,g,b)并非像C那样属于一种预编译宏替换,
RGB(r,g,b)是一个函数,虽然这个函数的结果简单得人脑可以在写代码的时候就知道他的值,
但程序仍然需要在运行时才得到值,一个动态的值赋值给常量是不行的,

在网上查到的,给颜色赋值的代码,基本上是这样的 cr = &HF08040 这种不直观的写法,
我还没有查到一种写得比较好的方法.
而系统自带的,是这样写的 VBA.ColorConstants.vbGreen = &HFF00
这似乎预视着,想自定义颜色常量,要写得比较直观,并没有很好的解决方案.

函数的返回值,不可能是常数,能否用类似宏替换来代替函数呢,网上查了一下,
VBA 与 VB 都是没有宏替换的.

我的初步结论是:
由于没有宏替换,一个很简单的RGB(r,g,b)数值处理也要写成函数,从而导致他与常量处理无缘,
导致颜色常量的写法很难看. cr = &Hxxxxxx

VBA我今天初学,我想讨论一下:
到底有没有定义颜色常量的比较好的写法?
如果只能写成 cr = &Hxxxxxx , 那我能否定义一些全局的变量来使用
例如:
在函数的外面写: Dim myBgColor As Long = RGB(r,g,b) (这种写法是报错的,我初学,语法懂得不多,寻求一种对的写法)
又或者在函数的外面写:
Dim myBgColor As Long
myBgColor = RGB(r,g,b) (这种写法同样是报错的)

我并不想在我的函数里面这样写
Dim myBgColor As Long
myBgColor = RGB(r,g,b)
这样写是对的,但不符合我的要求,因为 myBgColor 会在多个函数里用到,我每个函数里面都写,则不方便代码管理.
...全文
382 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
mu_jiannan 2019-01-12
  • 打赏
  • 举报
回复
引用 8 楼 脆皮大雪糕 的回复:
如果你之前是写C++的,我个人建议你为宏增加类模块。
比如增加一个类模块,名字叫MyColors 增加以下代码


Public myBgColor As Long

Private Sub Class_Initialize()
myBgColor = RGB(200, 200, 0)
End Sub


然后你的正式处理代码里面就可以用以下写法:

Dim Mc As New MyColors

Sub test()
ActiveSheet.Cells(1, 1).Interior.Color = Mc.myBgColor
End Sub


这样,你对所有的颜色定义都可以在MyColors 类里面进行定义。
代码里面穿件一个类实例,后面你就可以直接使用类的字段。以后你要对类进行扩充啥的,都不会影响业务逻辑代码
这种方式最为舒心
excellent~ 2018-11-09
  • 打赏
  • 举报
回复
感谢楼主啊 相当有用
Iris Uniflora 2018-10-14
  • 打赏
  • 举报
回复
十六进制很直观啊……或者你在加载的时候给公共变量赋值
finder_zhang 2018-10-11
  • 打赏
  • 举报
回复
现在老是服务器维护中,等下没问题我来结贴,以后还会在VBA这里发问题,还望各位大神继续帮忙,谢谢!
finder_zhang 2018-10-11
  • 打赏
  • 举报
回复
引用 7 楼 Chen8013 的回复:


3本电子书收到了,谢谢!


引用 8 楼 chewinggum 的回复:


多谢你的这个自定义类的教程,我之前一直不知道如何新建类来工作,现在知道了.
常规做法都是把所有全局的东西放到一个类里面,然后这个类再做个单例出来用.
舉杯邀明月 2018-10-10
  • 打赏
  • 举报
回复
1. 在VB、VBA中有预定义的颜色常量 vbRed、vbYellow、vbWhite等(共8个)。
2. 在VB、VBA中有预定义的“系统颜色常量 ”vbWindowBackground、vbWindowText、vb3DFace等。
3. 你可以在任意的“标准模块”的“通用-声明”节中,用Public(或Global)来定义一系列的变量,
  同时要写一个Public 的过程,在这个过程中将相应的变量进行赋值、并在“代码开始执行”处调用它。

 其实上面1和2中提到的“常量”实际上是“枚举类型”,不过枚举成员在运行中也不可改变其值,
把它们当成“常量”来看待也未尝不可。 你只要在代码中用到其中任意1个,然后在它上面点
鼠标右键,再点“定义”就可以看到同一组内的其它成员了。
 在1中的那组是“ColorConstants”,这一组是“确定的值”,“实际值”是不会变化的;而在2中
提到的那一组,相当于是“颜色代号”,其“实际值”取决于具体的系统版本、以及“当前主题”的
设置,在不同的具体的运行环境下,有可能是不同的值,这一点你必须要注意。
脆皮大雪糕 2018-10-10
  • 打赏
  • 举报
回复
如果你之前是写C++的,我个人建议你为宏增加类模块。
比如增加一个类模块,名字叫MyColors 增加以下代码


Public myBgColor As Long

Private Sub Class_Initialize()
myBgColor = RGB(200, 200, 0)
End Sub


然后你的正式处理代码里面就可以用以下写法:

Dim Mc As New MyColors

Sub test()
ActiveSheet.Cells(1, 1).Interior.Color = Mc.myBgColor
End Sub


这样,你对所有的颜色定义都可以在MyColors 类里面进行定义。
代码里面穿件一个类实例,后面你就可以直接使用类的字段。以后你要对类进行扩充啥的,都不会影响业务逻辑代码
X-i-n 2018-10-10
  • 打赏
  • 举报
回复
&Hrrggbb还不够直观?不比RGB(r, g, b)差吧 变量也可以到处用,只要用public定义一下它的作用域就行。
舉杯邀明月 2018-10-10
  • 打赏
  • 举报
回复
&HFFFFFF肯定不会被处理成 &HFFFFFFFF 啊,因为“6个F”已经是24位的数值了,
 那么它肯定不可能是Integer类型,只能是Long类型了。
&HFFFFFF 自然就等于 &H00FFFFFF 。
并且,你在代码中输入6个F后,就算你给它“加个 & 在后面”,它也会给你去掉!
因为“你不说它是Long类型,它也只能是Long类型”,那个&当然就是多余的了。

而你上面3楼中说的“&H0000FF00”,因为“数值数据的高位0无效”,
因此“规范化”之后就是 &HFF00,这时它“刚好16位”,于是它就是“Integer类型”;
然后,你的 Const myColor 指定了它为Long类型,这是32位的数据类型;
  而“赋值号”右边的是“Integer”,只有16位,要完成赋值,需要“位扩展”操作,
  按照相关的类型转换规则,是按照“符号位扩展”进行类型转换操作的,
  因此 &HFF00 → 16位扩展到32位 → &HFFFFFF00 。
你可以试一下(比如在立即窗口中执行 ? &HFF00),16位的&HFF00,其10进制的值是-256;
 而32位的 &HFFFFFF00,它的10进制值也是 -256。它们的“值是相等”的。
而如果你输入的是&HFF00&的话,那么表示这个数据是Long类型的,是“32位数据”,
 用16进制完整表示就是 &H0000FF00,这时“符号位”就是0了,
 它的值就不再是负数了,10进制的值就是 65280 。


我这儿有点资料,你可以到我的百度网盘下载:
链接: https://pan.baidu.com/s/1YdiuveTdPPRumwH3Yg4mcw
密码: knyb
7天后分享失效。
其实你在网上搜索一下,也应该能找到不少的书箱资料吧。
finder_zhang 2018-10-10
  • 打赏
  • 举报
回复
引用 5 楼 Chen8013 的回复:


你说的太好太详细了,我在写一个反色的代码,反色 = (Not 原色) And &Hffffff ,
在这里我发现这个 &Hffffff 并没有被处理成 FFFFFFFF ,它是对的.
后来我再发现,我写 ffff ff 的颜色都是错的,但 fffff 1ffff 的颜色却是对的,
经过你这样一说,我就明白了,我需要加上 &Hxxx& 来指定 long 类型.

准备结贴了
我基础很差,大神有没有VBA入门的PDF书帮发一下给我邮箱,谢谢! 5171988@qq.com
舉杯邀明月 2018-10-10
  • 打赏
  • 举报
回复
对于“数值”常数,高位的0肯定是“无效”的。
VB6将输入的整数数值优先解释为“Integer类型”,
 当超过“16位整数”的值域时,才解释为32位整数。

因此,你输入 &H0000FF00 时,它首先“语法检查”,再“规范”格式,
 把你的 &0000HFF00 变成 &HFF00,然后这个“刚好是16位整数”了。
解决方法就是在后面加 & ,强制指定它的“数据类型”为Long(32位整数)就行了。
应该这样写:
Const myColor As Long = &HFF00&
X-i-n 2018-10-10
  • 打赏
  • 举报
回复
&HFF00& = 65280
finder_zhang 2018-10-10
  • 打赏
  • 举报
回复
谢谢1楼2楼的回复!
特别是2楼你说得很具体.

另外我现在自定义颜色时,发现了一个问题.还想再请教1楼2楼.
Const myColor As Long = &HFF00 '(我本意是想使用绿色)
但实际调试时发现,myColor 实际等于 &HFFFFFF00 而非 FF00,颜色变成了青色而非绿色.
这个我可以理解,VBE在看到 &HFF00 时,认为我写的是一个负数(-256),
直接帮我左边补1,得到一个32位的 -256 &HFFFFFF00
但其实我本意是想要一个 &H0000FF00 ,我这样写时,VBE自动帮我把 0 删掉了,又变成了 &HFF00
这个是否有什么设置可以解决的呢? 我在赋值的时候,可以强调说这是一个正数吗?



引用 1 楼 Runnerchin 的回复:




引用 2 楼 Chen8013 的回复:

2,503

社区成员

发帖
与我相关
我的任务
社区描述
VBA(Visual Basic for Applications)是Visual Basic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。
社区管理员
  • VBA
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧