作者:金人瑞 《Excel VBA175例无理论纯实战教程》学员
最近正在学习郑广学老师的VBA 175例教程,这是一篇新手向的文章,也是一个新手的总结,高手可以批评文章中的不足之处,也可以无视,VBA中的IF判断, 判断一般起到控制作用,如郑老师所说,就像一个水管中的控制阀,水来了,一个个的控制阀决定着流水的走向。而整个流程中判断也的确有着控制流程走向的作用,可以说循环,判断,数组是vba的三驾马车,绝大部分的问题都是他们仨来解决的。其中for循环和if是新手最先学到的东西,今天我就来分享一下我这个新手在安装"阀门"的时候遇到过的坑。
提到判断,首先不得不提的就是IF函数,通常情况下IF有四中写法
第一种, 开关型单句
如下图:这是一个单句, 这是我自己取得名字,为了好理解,我们给他们取个外号"限定阀",在满足某个条件时启动执行某些语句.这样写的好处是加上备注以后一目了然,一看就知道有一个"阀门",不过这是我的个人习惯,在其他情况下,建议使用下面的方法.
第二种,开关型
这还是我自己取得名字,为了好理解,我们依旧给他们取个外号,"球阀",达到某条件就执行某个操作,就像水管里面的球阀,只有开关两种情况,控制上也只能是执行和不执行的区别作用同第一种一样,只不过多了一个end if ,可以将多个满足则执行的语句包起来批量控制.
第三种,分流型
老规矩整个名字:分流控制阀,如下,可以看到if整句起到了控制流程走向的作用.
执行后如下:
第四种:多层控制型
如下图,这种结构足够完整,能控制不同条件的"水流"流向多个方向.在这里就不演示and和or了
为什么我会说他有坑呢?因为在一段程序中我们会时常遇到一个问题到底是用if包一个if,还是用if连接一个if以及判断的位置问题.
先看个例子:
这是代码和执行结果,在do/loop循环中,while i> 2 是判断条件,判定符合条件则执行.下列语句,在上述代码中I = I +1 执行以后I = 2 ,符合while >-=2,所以代码可以得到右侧结果,但是如果写成下方这样,则不执行,因为在I = i+1执行前就已经经过了while判断,此时i=1,不符合.所以无结果
由上可以得到一个结论,判断语句放置的地方一定要考究否则就会出bug,有些需要执行的语句就不执行.所以if作为常用判断语句,其放置的地方一定是要符合逻辑下面总结一下我见过的两种形式,更多复杂的样式大家可自行拓展.这里只做模型.
(1) If /end if---if/end if 连接型
一般情况下,两个判断是独立的时候才需要写两个if,
如上,我需要删除考试没写名字的考生,也要选出语文为70分以上的考生标记为黄色,那么我就需要做两个if语段,代码如下
结果如下:
这个就是典型的两个独立的if在for循环中的应用,值得注意的是这两个if在程序中是都会被执行的.但是下面这种情况就不一样了,第一个if会被执行,但是第二个就不一定了,
(2) If –if/end if – end if ,第二种,if包含if
依旧是上面的例子,在找到语文为70分以上的学生以后,我希望在语文70分以上的颜色由黄色改为红色,同时数学60分以上语文70分一下的底色改成黄色.代码如下
执行结果如下
我们可以通过执行结果看到判断数学大学60分这个判断其实是被语文大于70分这个判断"阉割"过的结果.这就是if包if 的模型.
总结一下:if连if,两个判断是独立的.if包if两个判断不独立,外层的if控制里层的if.第一种连接型的适用范围是需要做两个判断,且所需要执行的代码语句不一样,比如删除和上色.不同的判定条件有不同的语句执行.第二种包裹型if,适用范围是两层判断,先筛选出来的数据要再次筛选,如果判定成功需要执行的语句一样,比如都是底色上红色,那么些一个and连接语句同时满足即可,但是执行想语句不一样,则需要写成包裹型.
补充一点:学vba时间不长,所幸认识郑老师不算太晚,见过的大神多,他们的特点就是理解能力强,思路清晰,作为新手我觉得注释很重要,一来写代码的设计思路,二来写语句的作用,这些都至关重要,再一个就是建立自己的理解模型就像上面的if,代码的设计其实是有模型思维的,任何事物借助模型都可以快速的去理解,通过修改模型,引用模块,即使很复杂的代码我们也能很快的完成。
最后给大家看看郑老师的无敌IF多层程序框图
.最后说一点学习历程
一开始也是找各种免费课,速成课,看完速成课的最大结果其实是他给的案例你会,你自己的案例不会,还不容易百度到了吧,黄花菜都老了,这不是VBA应该有的效率,我要的是高效率,不仅快捷还要方便。于是我在QQ阅读买了书,又买了纸质书!加了群,可还是那样,书里面只带你入门,他写的很多我都会,不会的也看不懂,场面一度极其尴尬。究竟什么是提高?究竟如何才能提高?这两个问题直到我在b站看到了郑老师我才反应过来,真正的高手是能在一瞬间就有思路怎样去处理数据,也能在很短的时间里面调用写好的模块。这才是真正的高效率。这也恰恰是这么长时间我在其他课程里面没听到的东西,虽然前面走了很多弯路,不过这一个月来我每天上厕所都要看老师的视频,VBA水平突飞猛进,学习上瘾的这种感觉,比打游戏上瘾还强烈!!!