新人报到,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 会在多个函数里用到,我每个函数里面都写,则不方便代码管理.
...全文
458 13 打赏 收藏 转发到动态 举报
写回复
用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 的回复:
代码转载自:https://pan.quark.cn/s/50df8825dc0d Tensilica Xtensa指令集架构手册是一份详尽阐述Xtensa指令集架构(ISA)的参考指南,它主要面向Tensilica公司所推出的处理器核心,尤其是LX106核,同时亦涵盖了ESP8266和ESP32等相关内容。该手册全面介绍了Xtensa处理器核心的指令集、配置选项、扩展能力以及将架构映射至硬件的详细情况。接下来将依据手册中所述的知识点进行深入解读。 ### Xtensa指令集架构(ISA) Xtensa指令集架构是Tensilica公司为其处理器产品设计的一套指令集,该指令集具备高度的可配置性和可扩展性。这一特性使得Xtensa ISA能够在不同的应用领域和硬件需求中进行个性化定制,以满足特定的功能与性能要求。 #### 可配置性(Configurability) Xtensa ISA的可配置性体现在用户可以根据实际需求对处理器的多个方面进行定制。这包括但不限于: - **指令集扩展**:用户可以根据特定的应用需求添加新的指令,从而提升处理特定任务的效率。 - **寄存器文件扩展**:根据应用需求,可以增加或优化处理器的寄存器数量和类型。 - **协处理器扩展**:通过集成特定的协处理器,可以将专门的计算任务卸载到协处理器上,从而提升整体性能。 #### 可扩展性(Extensibility) Xtensa ISA不仅可配置,还拥有卓越的可扩展性,它支持多种扩展,包括: - **状态扩展(State Extensions)**:允许处理器添加新的状态寄存器,以支持新的功能或增强现有功能。 - **指令扩展(Instruction Extensions)**:...
下载代码方式:https://pan.quark.cn/s/8779ceeac982 YOLOv5被认为是一种功能卓越且精确度高的目标检测系统,它在即时处理场景中展现出优越的性能。"基于YOLOv5的火灾检测"计划致力于运用这项尖端的计算机视觉方法,以达成对火焰和烟雾的有效辨识,进而起到防止及降低火灾事故的作用。在这个压缩文件里,用户能够获取到预先训练完成的模型,这表示使用者能够直接执行推理检测,无需从头开始训练模型。 我们现在将详细探讨YOLO(You Only Look Once)系统。YOLO是一种单阶段的目标检测方法,它将目标检测任务转化成回归问题,通过直接预测边界框和类别可能性来迅速识别图像中的物体。YOLOv5是这一系列的最新迭代,由Ultralytics团队研发,它在前几代的基础上进行了改进,包括更迅速的训练速率、更精准的检测以及更强的适应性。 YOLOv5的关键优化包含: 1. **数据增强**:应用了Mosaic数据增强技术,这是一种融合了随机缩放、翻转、裁剪及色彩调节的技巧,增强了模型的普遍适用性。 2. **更高效的架构**:运用了SPP-Block(Spatial Pyramid Pooling)和Path Aggregation Network (PANet)设计,提升了特征提取的效能和精确度。 3. **权重初始化**:采用了更优化的权重初始化策略,使模型在初始训练阶段就能更快地达到收敛。 4. **联合训练**:YOLOv5支持多尺度训练,即同步训练不同尺度的网络,以改善对小目标的检测效果。 5. **优化的损失函数**:使用了GIOU(Generalized IoU)损失函数,改进了边界框的定位。 针对火灾检测的应用,YOLOv...

2,506

社区成员

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

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