书接上回。我们已经学会了最基本的页面打开、保存操作。第一次学的同学看到各种各样的步骤截图,不免觉得有些繁琐难记,但只要你上手跟着步骤走一遍流程,你就会发现其实很简单,这是因为动手实践比双手插兜硬看效率要高的多(学任何东西都是如此)。
所以让我们打开上节课保存的代码,来学习本节课的主题:代码结构。
代码是什么?你可以把代码理解为机器的语言,那么一行代码就是我们说的一句话。而代码结构就是代码的运行顺序。代码结构有三种:
顺序结构
选择结构
循环结构
让我来一一介绍。
一、顺序结构
我们来审视一下上节课的代码:
我们会发现我们的代码只有一句话,现在让我们把他改变一下,变成:
a=1是一句赋值语句,表示把1的值赋给a变量。
现在我们如果运行,我们会得到弹出的消息框显示1。这是因为我们先让a=1,然后再去输出a的值。这就是最简单的顺序结构,也是代码运行默认的顺序。在没有其他结构情况下,代码会自上而下依次执行每一句代码内容。这很好理解,就相当于每天要起床,吃饭,工作,睡觉,这是一个固定的顺序。
那这个世界上有没有不确定的顺序呢?
二、选择结构
现在我们想象一下,我们要出门逛街时,需不需要带伞?我们会执行一个“判断”,也就是外面有没有下雨。如果外面下雨了,我们就带伞,如果外面不下雨,我们就不带伞。当我们做出判断的时候,我们的脑子是这样想的:
如果 外面下雨 我就 带伞 否则 不带伞
让我们整理一下,把心中的逻辑变成纸面的逻辑写出:
如果 外面下雨 就
带伞
否则
不带伞
让我们更进一步,学点英语词汇:
If 如果
Then 就
Else 否则
End 终止
把他写成代码的样子吧:
我们会发现,If和End If,好像有点眼熟——这不是跟过程Sub和End Sub差不多嘛!没错,VBA经常用这种组合来把代码裹起来,这里的End If就是指示一下我们,选择语句就是在If和End If之间的区域进行的。
有些时候,我们不一定需要“Else”,就像我们的大脑不需要真正指示我们“别带伞”。所以,如果没有什么不下雨必须要干的事情,我们可以不使用Else:
现在,让我们真正尝试去写选择结构,我们来试试这个
这个代码就是让a=1,b=2,然后进行一个判断,如果a>b成立,则输出“a比b大”这句话,反之会输出“a比b小”。如果你把前两句改成a=4和b=3,你就会得到不同的输出。
学到这里,顺序结构、选择结构似乎都还算简单,那么,来看看循环结构吧。
三、循环结构
所谓循环,就是重复执行某段代码。比如我们走路时,我们大脑会不断指挥我们“迈左脚”、“迈右脚”、“迈左脚”、“迈右脚……那么,如果写成代码:想必是这样:
迈左脚
迈右脚
迈左脚
迈右脚
……
如果是这样,那么我们如果要走1000步就要有1000句代码,太傻了吧,我们需要重复执行代码。
我们可以让大脑这样发出指令:
重复执行以下命令100遍!
迈左脚
迈右脚
我们的循环语句正是为此而生,我们来看看程序写法:
这个就是循环结构的一种最简单的形式——For循环。这里的i是计数器,用来计数。i=1 to 100表示i在循环中从1一次次加到100,每循环一次,i就加1。在佛门修行过的同学们都知道,为了计算念诵佛号的次数,佛门弟子往往会使用“佛珠”或者称“念珠”的法具来记忆念诵次数,每念诵一次就手捻一次,这和循环结构中的计数器是一样的道理。
Next是循环结构的终点,语句会在For和Next之间循环运行,直到i加到100为止。至于Next后面为什么有个i——为了呼应前文中计数器i,让你看的更清爽,其实并没有用处,删掉也不影响。
让我们来实践一下吧:
执行这个代码,你将不得不按五次确认(不要写For i=1 To 100甚至更多!)
让我们改进一下,看看计数器i还有没有别的用处:
有意思,我们可以看到1、2、3、4、5接连输出。
再来试试这个:
我们会发现i的输出值变为6、7、8、9。
也就是说,我们可以改动i循环的起始结束位置。
我们发现,i每次总是加1。那么,能不能改变i每次增加的值呢?
来试试这个:
我们会发现,输出变成了1、3、5,我们用step 2把循环的计数步长变成了2(代码默认step为1)。
这就是For循环的基本用法,事实上,循环结构还有很多种类型,我不准备一次性介绍完,但是,一个For循环就已经可以做很多事了。
如果你跟着我的文章打了一遍代码并理解了,那么恭喜你!你已经掌握了循环结构,现在我们来玩会数学吧。
玩练习题!
相信大家都听过一位大数学家高斯,高斯小时候上学,老师让他们班计算从1+2+3……加到100,大家都搁那儿一个一个加呢,人家高斯直接用倒序相加法算出结果是50×101=5050。
诚然我们并不是高斯,但是我们有电脑,电脑最擅长的就是干重复的活儿。让我们来硬算1加到100吧。
如果你想挑战一下独立把代码写出来,可以先自己尝试一下,如果不成功,再来看下文。如果成功了,也可以看看我的思路和你的思路有何异同。
接下来我们来仔细剖析一下代码思路,注意:思路比技巧更重要。
首先,我们需要一个过程Sub和End Sub,因为这是所有程序必不可少的。
然后我们想想,本篇学的三种结构,应该用哪种?题目中有需要我们选择判断的地方吗?没有;有需要重复的地方吗?有。所以我们需要循环结构。
我们不知道具体怎么写,但是我们可以想到要循环多少次。从1加到100,显然某种代码要循环100次。我们来大致写个框架吧:
框架已经搭好了,我们知道i会在循环中从1一次次加1,直到变成100,而我们正需要i在每次循环中的加和,那么,我们要怎样一点点的收集i的值呢?
我们需要一个容器来装i。
我们可以创造一个容器a,这个容器刚开始是空空如也,空空如也就是0,我们要给a赋值0。而且我们可以提前找好这个容器,所以这一句a=0应该写在循环结构外面:
我们让它在循环结构把i一遍又一遍地装到自己身体里,我们使用a=a+i来实现,注意“=”在这里并不是数学上的等于,而是“赋值”,这句代码的意思是:a的值加上i的值形成的这样一个值,赋值给a。比如说,如果a=5,b=7,那么执行a=a+b后,a的值就变成了12,而b不会有变化。
我们把a=a+i放到循环结构里,来看看现在我们的代码:
循环代码中i一次次增加,而a一次次从i中抽取值放到自己的身体里,现在我们想要知道结束后a装了多少数值了,我们来用Msgbox一探究竟吧:
这就是最终代码了,运行后输出答案为5050。恭喜你,你使用电脑成功逼平了儿童状态的高斯!
本篇所介绍的三种代码结构,将是编程最基本也最重要的概念之一,务必理解掌握,如果总是不理解,请反复学习。
对应视频: