VBA中重要的强制申明,谁看谁明白_自动化表格


Hello,各位同学们大家好。


前几次的VBA分享,在留言区收到了很多同学的实际需求。大家的支持,是我们持续分享的动力。


VBA中重要的强制申明,谁看谁明白_自动化表格_02

VBA中重要的强制申明,谁看谁明白_自动化表格_03


这边会逐渐将大家的需求融进案例中,也希望大家继续在留言区和我们分享你们的VBA使用心得和工作需求。


还是老规矩,看看我们走到哪里了。

1.认识VBA:什么是VBA?

2.这些掌握了,你才敢说自己懂VBA

3.VBA变量5年踩坑吐血精华总结

VBA中重要的强制申明,谁看谁明白_自动化表格_04

好了,闲话不多说,直接上干货~


1.强制申明


行话说:强制申明用得好,VBA臭虫(bug)减不少


先看下W3Cschool上的解释:

VBA使用Option Explicit语句自动提醒你正式地声明你的变量,这个语句必须放在每个模块的最上面。如果你试图运行一个含有未定义的变量的过程时,Option Explicit语句会让VB产生一个错误信息。


这解释也太不友好了,用能听懂的话,怎么说?


用大白话说,强制申明就是:在一段程序中,我们明确告诉VBA将要使用哪些变量,如果遇到其他没有说的变量,VBA直接报错提醒。


上面的大白话仍然不是很好理解,我们看个例子。


案例:在「单元格B2」输入不同的行号,点击「显示答案」按钮,计算「F列」和「H列」的乘积,并将每个乘积结果加上公共值「单元格B4」的50,将最终结果显示在相应的单元格

VBA中重要的强制申明,谁看谁明白_自动化表格_05

自信的我们写完代码,点击「显示答案」按钮,以为答案是这样

VBA中重要的强制申明,谁看谁明白_自动化表格_06

但其实,结果是这样

VBA中重要的强制申明,谁看谁明白_自动化表格_07

看到结果的你,肯定心里一万匹马飘过,“VBA,你这是在侮辱我的智商吗?”


但是,作为行业老湿机的我们,深知——好的程序,都是调试出来的。


我们默默的打开VBA代码,猛地一看,这程序没问题,又是一万匹马飘过

VBA中重要的强制申明,谁看谁明白_自动化表格_08

那么,我们只能使出自己的杀手锏——一句句检查代码


(1)点击「显示答案」按钮,VBA自动找到关联的程序「四则运算」按钮

VBA中重要的强制申明,谁看谁明白_自动化表格_09

(2)读取第1句「x = Cells(2, 2)」

VBA中重要的强制申明,谁看谁明白_自动化表格_10

VBA说:

先看右边,「Cells(2, 2)」我认识,表示「单元格B2」,它的值是4。

再看中间,「=」我认识,表示赋值的意思。

再看左边,「x」我不认识,那它就是变量,我要新建一个名叫x的变量。

最终结果就是——新建了一个变量x,并且现在它的值是4。


[备注]

1.VBA遇到不认识的内容,就会新建一个变量;同时,如果该变量没有赋值,就默认为0;

2.VBA执行语句次序为:从上到下、从右向左;


(3)读取第2句「h = Cells(4, 2)」

VBA中重要的强制申明,谁看谁明白_自动化表格_11

VBA说:

先看右边,「Cells(4, 2)」我认识,表示「单元格B4」,它的值是50。

再看中间,「=」我认识,表示赋值的意思。

再看左边,「h」我不认识,那它就是变量,我要新建一个名叫h的变量。

最终结果就是——新建了一个变量h,并且现在它的值是50。


(3)读取第3句「Cells(x, 10) = Cells(x, 6) * Cells(x, 8) + h1」

VBA中重要的强制申明,谁看谁明白_自动化表格_12


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」了?

VBA中重要的强制申明,谁看谁明白_自动化表格_13

心细的同学已经发现了问题,我们误把变量「h」写为了「h1」,虽说二者仅多了个「1」,但是对于VBA这个严谨的家伙来说,就是2个不同的变量,而由于「h1」是一个没有被赋值的变量。


所以,其默认为0,也就最终酿成了一开始的大型事故翻车“命案”之VBA侮辱人类智商事件。


有同学可能就问了:猴哥,说了这么多,这和我们今天的「强制申明」,有什么关系?


又一个《肖申克救赎》的天台式微笑,悄悄上扬在我的嘴角


来,看代码,我们使用了「强制申明」,然后运行一下程序


VBA中重要的强制申明,谁看谁明白_自动化表格_14

有没有很神奇,由于加入了「强制申明」,程序直接报错,而且直接将出错的「h1」批色显示。


看到这里,同学们肯定赞叹:厉害了!「强制申明」


为了进一步理解「强制申明」,我们将添加前后的代码做个对比

VBA中重要的强制申明,谁看谁明白_自动化表格_15


在「添加-强制申明」的代码框里,我们发现多了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不同的地方被赋新值,从赋新值开始的地方,其后所有的代码都会引用这个新值。

VBA中重要的强制申明,谁看谁明白_自动化表格_16

这也就是为什么有些同学,代码经常跑出一些神奇的值,而像这种因为给同一个变量赋不同的值,这种小错误是很难检查出来。


同学们,肯定问:这种问题有没有解决方案?


还真有,猴哥今天给你们分享一个非常实用的技巧,让这种问题直接呆在它娘肚子里,永不出来,生活已经这么多欢乐了,请不要再给我增添更多寻找bug代码的快乐了。(手动狗头.jpg)


只需一句代码,就能让你解决上述问题

VBA中重要的强制申明,谁看谁明白_自动化表格_17

是的,我们在原来的代码中新增「Const k = 50」这句代码,就是告诉VBA要记住以下2点:


(1)该段代码我定义了1个常量k;

(2)常量k在定义后被赋值,下文如果重新赋值,请警告窗+批蓝色告诉我

VBA中重要的强制申明,谁看谁明白_自动化表格_18

[备注]

1.VBA中定义一个「常量」需要使用关键字「Const」;

2.「常量」一般放在开头位置,方便我们随时修改。


3.今日总结


好了,说一下今日的知识点


(1)学会使用「强制申明」,养成良好的代码编写习惯,从根源上减少bug


「强制申明」就是利用「Dim xxx」语句,提前定义VBA变量,目的是为了告诉VBA你接下来要使用哪些变量,未定义变量都是非法变量,需要警告窗报错+批蓝色告诉你


2)学会使用「常量 Const」,能规避很多不必要的错误和麻烦


「常量」就是利用「Const xxx = xxx」语句,提前定义固定不变或多次引用的常量,目的是为了告诉VBA你定义了哪些常量,这些常量的值是一开始就固定好的,如果中间发生人为修改或重新赋值,需要警告窗报错+批蓝色告诉你


好了,同学们今天的分享就结束了


关于「强制申明」和「常量 Const」你学会了吗?


VBA中重要的强制申明,谁看谁明白_自动化表格_19


推荐:人人都需要的数据分析思维


VBA中重要的强制申明,谁看谁明白_自动化表格_20