Hello,各位同学们大家好。
前几次的VBA分享,在留言区收到了很多同学的实际需求。大家的支持,是我们持续分享的动力。
这边会逐渐将大家的需求融进案例中,也希望大家继续在留言区和我们分享你们的VBA使用心得和工作需求。
还是老规矩,看看我们走到哪里了。
好了,闲话不多说,直接上干货~
1.强制申明
行话说:强制申明用得好,VBA臭虫(bug)减不少
先看下W3Cschool上的解释:
VBA使用Option Explicit语句自动提醒你正式地声明你的变量,这个语句必须放在每个模块的最上面。如果你试图运行一个含有未定义的变量的过程时,Option Explicit语句会让VB产生一个错误信息。
这解释也太不友好了,用能听懂的话,怎么说?
用大白话说,强制申明就是:在一段程序中,我们明确告诉VBA将要使用哪些变量,如果遇到其他没有说的变量,VBA直接报错提醒。
上面的大白话仍然不是很好理解,我们看个例子。
案例:在「单元格B2」输入不同的行号,点击「显示答案」按钮,计算「F列」和「H列」的乘积,并将每个乘积结果加上公共值「单元格B4」的50,将最终结果显示在相应的单元格
自信的我们写完代码,点击「显示答案」按钮,以为答案是这样
但其实,结果是这样
看到结果的你,肯定心里一万匹马飘过,“VBA,你这是在侮辱我的智商吗?”
但是,作为行业老湿机的我们,深知——好的程序,都是调试出来的。
我们默默的打开VBA代码,猛地一看,这程序没问题,又是一万匹马飘过
那么,我们只能使出自己的杀手锏——一句句检查代码
(1)点击「显示答案」按钮,VBA自动找到关联的程序「四则运算」按钮
(2)读取第1句「x = Cells(2, 2)」
VBA说:
先看右边,「Cells(2, 2)」我认识,表示「单元格B2」,它的值是4。
再看中间,「=」我认识,表示赋值的意思。
再看左边,「x」我不认识,那它就是变量,我要新建一个名叫x的变量。
最终结果就是——新建了一个变量x,并且现在它的值是4。
[备注]
1.VBA遇到不认识的内容,就会新建一个变量;同时,如果该变量没有赋值,就默认为0;
2.VBA执行语句次序为:从上到下、从右向左;
(3)读取第2句「h = Cells(4, 2)」
VBA说:
先看右边,「Cells(4, 2)」我认识,表示「单元格B4」,它的值是50。
再看中间,「=」我认识,表示赋值的意思。
再看左边,「h」我不认识,那它就是变量,我要新建一个名叫h的变量。
最终结果就是——新建了一个变量h,并且现在它的值是50。
(3)读取第3句「Cells(x, 10) = Cells(x, 6) * Cells(x, 8) + h1」
VBA说:
先看右边,「Cells(x, 6)」我认识,x=4,所以它表示「单元格F4」,它的值是6;「*」我也认识,在VBA中表示「相乘」;「Cells(x,8)」表示「单元格H4」,它的值是5;「+」我认识,表示「相加」;「h1」我不认识,那它就是变量,我要新建一个名叫h1的变量,它没有被赋值,那么它的值就是0。
再看中间,「=」我认识,表示赋值的意思。
再看左边,「Cells(x, 10)」我认识,x=4,所以它表示「单元格J4」,它的值根据左边计算得出。
最终结果就是——「单元格J4」=「单元格F4」*「单元格H4」+ 0。
看到这里,大家可能说,不是说所有的乘积「加上50」吗?怎么这里都变为「加上0」了?
心细的同学已经发现了问题,我们误把变量「h」写为了「h1」,虽说二者仅多了个「1」,但是对于VBA这个严谨的家伙来说,就是2个不同的变量,而由于「h1」是一个没有被赋值的变量。
所以,其默认为0,也就最终酿成了一开始的大型事故翻车“命案”之VBA侮辱人类智商事件。
有同学可能就问了:猴哥,说了这么多,这和我们今天的「强制申明」,有什么关系?
又一个《肖申克救赎》的天台式微笑,悄悄上扬在我的嘴角
来,看代码,我们使用了「强制申明」,然后运行一下程序
有没有很神奇,由于加入了「强制申明」,程序直接报错,而且直接将出错的「h1」批色显示。
看到这里,同学们肯定赞叹:厉害了!「强制申明」
为了进一步理解「强制申明」,我们将添加前后的代码做个对比
在「添加-强制申明」的代码框里,我们发现多了2句话「Option Explicit」和「Dim x, h」。那么,它们是什么意思呢?
「Option Explicit」表示——告诉VBA接下来的程序我要使用强制申明。
「Dim x, h」表示——告诉VBA接下来的程序我只使用变量x和变量h,遇到没见过的,你就警告窗报错提醒我,并用蓝色批注显示它的位置,方便我修改。
因此,到这里,我们就明白了——所谓的「强制申明」就是提前告诉VBA自己接下来要使用哪些变量,如果没有告诉你,那该变量就不被支持,就要报错提醒。
这好比法律,规定了哪些事情可以做?哪些事情不能做?如果你做了违法的事情,你就要接受法律的制裁。
所以,结合这个特点,在VBA里使用「强制申明」,主要由以下3个主要优点(小本本记下来,我们下期考):
(1)正确使用「强制申明」能够帮助我们快速定位错误代码,发现错误;
(2)正确使用「强制申明」能够提升程序的运行效率;
(3)正确使用「强制申明」能够帮助我们养成良好的代码编写习惯,减少很多琐碎的、不必要的麻烦;同时,方便被人理解和查阅代码。
[备注]
1.「Option Explicit」一定要写在所有程序的最开头位置;
2.「Dim」是VBA系统的保留字,用来定义VBA中的变量;
3. 99.99%的大牛都使用「强制申明」,有点业界潜规则的赶脚。
2.常量使用
有些时候,我们写VBA代码难免会遇到一些固定的值,比如:前文例子的公共值50。
对于这种固定值,我们一般情况下都是提前定义一个变量,然后给其赋值,比如:k = 50,在后面我们多次引用这个变量k就行了。
但是,我们在日常工作中,经常出现修改这些固定变量的值,可是代码中多处引用的这个固定值,我要一个个去修改吗?
为了应对这个“多处修改难题”,有些时候我们就会做一些懒癌晚期的蜜汁操作操作:在需要修改的地方直接重新定义变量k,然后给它赋新值,而不是找到原来那个变量,去修改它的值。
然后,然后就酿成了一起起杯具的“惨案”。别问我为什么,我经常这样干,而且发生了很多“命案”。
原因是由于同名变量在VBA不同的地方被赋新值,从赋新值开始的地方,其后所有的代码都会引用这个新值。
这也就是为什么有些同学,代码经常跑出一些神奇的值,而像这种因为给同一个变量赋不同的值,这种小错误是很难检查出来。
同学们,肯定问:这种问题有没有解决方案?
还真有,猴哥今天给你们分享一个非常实用的技巧,让这种问题直接呆在它娘肚子里,永不出来,生活已经这么多欢乐了,请不要再给我增添更多寻找bug代码的快乐了。(手动狗头.jpg)
只需一句代码,就能让你解决上述问题
是的,我们在原来的代码中新增「Const k = 50」这句代码,就是告诉VBA要记住以下2点:
(1)该段代码我定义了1个常量k;
(2)常量k在定义后被赋值,下文如果重新赋值,请警告窗+批蓝色告诉我
[备注]
1.VBA中定义一个「常量」需要使用关键字「Const」;
2.「常量」一般放在开头位置,方便我们随时修改。
3.今日总结
好了,说一下今日的知识点
(1)学会使用「强制申明」,养成良好的代码编写习惯,从根源上减少bug
「强制申明」就是利用「Dim xxx」语句,提前定义VBA变量,目的是为了告诉VBA你接下来要使用哪些变量,未定义变量都是非法变量,需要警告窗报错+批蓝色告诉你
(2)学会使用「常量 Const」,能规避很多不必要的错误和麻烦
「常量」就是利用「Const xxx = xxx」语句,提前定义固定不变或多次引用的常量,目的是为了告诉VBA你定义了哪些常量,这些常量的值是一开始就固定好的,如果中间发生人为修改或重新赋值,需要警告窗报错+批蓝色告诉你
好了,同学们今天的分享就结束了
关于「强制申明」和「常量 Const」你学会了吗?