Hi,大家好,本专栏将会从零开始和大家用图文的方式,让你从零基础学会VBA!有兴趣的小伙伴可以持续关注我,或者在专栏进行查看学习,愿与君携手共进!
在上一个章节中我们说到循环嵌套的使用方法,相信经过一段的时间学习,您已经完全学会使用它们了。今天要和大家介绍的是另外一个神奇,他就是我们常用的GOTO语句。那么这个语句是如何理解呢?goto语句也被我们称为无条件转移语句,其一般格式如下: goto 语句标号; 其中语句标号是按标识符规定书写的符号, 放在某一语句行的前面,标号后加冒号(:)。语句标号起标识语句的作用,与goto 语句配合使用。在代码中使用的如下所示:
PS:goto语句通常与条件语句配合使用。可用来实现条件转移,构成循环,跳出循环体等功能。但是在结构化程序设计中我们一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。
在VBA中间使用的时候,需要用冒号做标记,但是跟批处理的不一样,冒号在后面
start:
goto start
此例子就是会跳转到start:语句处,我们在给大家分享一个例子,如下所示:
Part-01小程序实现功能:判断表格数据中是否为迟到
Part-02 使用如下代码:
Part-03,程序执行以后得到的结果如下所示,综上所述,如下为GoTo 和GoSub的用法,都是跳转到某行,继而运行某个模块的功能。
那么说到这里,我们在什么情况使用这个语句呢?在以下的几种情况,我们可以选择使用它。
1、从多重循环中直接跳出,这样可以加快程序的执行效率;或许有的小伙们会说可以选择break;只能跳出单层的循环,return将整个函数都返回了,没法再继续了,显然也不行,所以我们想到了goto。如果是在陷入了很深层次的循环里想要跳出最外层的循环,用 goto 直接跳出却比用 break 一个循环一个循环地跳出要好得多。有人甚至形象比喻说:“就像楼房着火了,来不及从楼梯一级一级往下走,可从窗口跳出火坑。” 其实,你可以将 break 和 continue 理解成弱化了的 goto 语句。
2、程序出现报错时清除资源,如果一个函数有多个出口,则在每个出口处,会产生巨大的退出代码,如下例一,每个函数只能有一个出口,所有的资源释放必须放在出口统一解决,那全部使用大括号,十几个,几十个if判断条件下来,你数数你的大括号有多深?这种代码可读性不好,一旦写错了,难于寻找错误。所有这些问题,一个goto就解决了。
当程序要分配和清除资源时(像内存、或处理字形、窗口、打印机),这种情形下用goto通常是为了复制代码或清除资源。若遇到这种情况,程序员就要掂量是 goto 的缺点令人讨厌呢?还是复制代码那令人头痛的维护更讨厌呢?最后还是认为 goto 的缺点更可忍受。
3、可增加程序的清晰度的情况。若不使用goto语句会使功能模糊,有时候使用goto语句,一眼就看清楚了程序的意图,可用那些对应的循环break语句等实现的语句段,要想老半天才搞清楚程序意图的情况,也可考虑使用goto语句。
那么使用这个语句也会相应的带来一些弊端,如下所示的几个情况:
不加限制地使用goto破坏了清晰的程序结构,使程序的可读性变差,甚至成为不可维护的"面条代码"。不加限制地使用goto经常带来错误或隐患。它可能跳过了某些对象的构造、变量的初始化、重要的计算等语句,例如:在后续的学习中,需要做到结构化程序设计即可,如下所示:
在这里给小伙伴们一些建议,就是在使用GOTO语句的时候,还是需要稍微加以限制,虽然他好用,但是他的风险其实是非常大的,也是不可预料的。
goto语句一般情况下被当作破坏结构化程序的典型代表,可以说,在结构化程序设计年代,goto语句就像洪水猛兽一样,程序员都唯恐避之不及;可后来在微软的一些例子程序中经常把goto语句用来处理出错,当出错时,goto到函数要退出的一个label那里进行资源释放等操作。那么,goto语句是不是只可以用于出错处理,其他地方都不可以用了呢?下列关于使用goto语句的原则可以供读者参考。
1) 使用goto语句只能goto到同一函数内,而不能从一个函数里goto到另外一个函数里。
2) 使用goto语句在同一函数内进行goto时,goto的起点应是函数内一段小功能的结束处,goto的目的label处应是函数内另外一段小功能的开始处。
3) 不能从一段复杂的执行状态中的位置goto到另外一个位置,比如,从多重嵌套的循环判断中跳出去就是不允许的。
4)应该避免向两个方向跳转。这样最容易导致"面条代码"。
好啦!快乐的时间总是非常短暂的,又到了和大家说再见的时候,如果大家感觉本文如果对你有所帮助的话,请帮忙转发点赞,谢谢您能观看到现在,我们下期再见!
我是Excel教案,关注我持续分享更多的Excel技巧!
如果有不明白的或者不懂的可以在下方留言,我们会一一解答的。