上次和这次还有下次的东西对于学过编程的孩子来说非常简单,学过编程的孩子可以直接跳过不看
最近忙着用VBA简化工作流程,码代码很快乐,好久没有分享我的VBA学习过程了
Tina:我的VBA学习之旅(四)——程序结构之顺序结构+变量zhuanlan.zhihu.com
选择结构也叫分支结构,拿一个条件做判断,符合哪个条件就执行哪个步骤。比如,到饭点了,要去吃饭了,但是不知道该去哪里吃,这时可以打开相关app,输入一些条件,比如距离远近、好评程度、人均价格等等,然后app会自动筛选出符合条件的店家。这个过程中,就有分支结构在起作用,将符合条件的分支展示出来,不符合条件的分支展示
已经开学了,挂科了的孩子要补考,那么今天代码就拿考试分数举几颗栗子。
及格or不及格
分数嘛,大致分为及格和不及格两种,60分万岁~
没到60分怎么办?补考啊!
补考还没到60分呢?重修啊!
现在有8个童鞋的考试成绩如图示,当然,我们扫一眼就能知道需不需要补考了,用函数也是很方便的,,不过既然讲VBA,所以来看看用程序怎么实现吧
首先捋捋逻辑
一、判断成绩是否大于等于60,如果及格了,就不需要补考了,如果没及格,就需要补考
二、需要补考,在C列填是,不需要补考,在C列填否
判断,最简单的,用IF就可以了,Excel里也有相应的函数,应该不陌生了,在VBA里的IF语句与Excel的函数略有不同,不过与其他编程语言是一致的,结构是这样的
'第一种结构,只在条件成立的情况下有操作
if <判断条件成立> then
<执行过程>
end if
'第二种结构,不管条件成立不成立,有不同的操作
if <条件成立> then
<执行条件成立时的过程>
else
<执行条件不成立时的过程>
end if
用图表示就是这样子的
好了,然后开始码代码
Alt+F11打开VBE编辑器,插入模块
一般情况下打开之后显示的东西跟我的不一样,没有问题,继续看下去就行了
然后在模块中输入“sub 及格了没”然后按回车,VBE会自动帮你补充完整
然后开始判断B列的分数有没有及格,及格了在C列填否,不及格在C列填是,这时候要用到第二种if结构
if <成绩>=60> then '>=是≥号,VBA中用>=, <=, <>,分别表示≥, ≤, ≠
<是否补考=否>
else
<是否补考=是>
end if
Range(&quot;B2&quot;), Range(&quot;C2&quot;)代表B2单元格和C2单元格,Range是操作单元格用的
先按F5试验一下,结果出来了!
A童鞋分数很高,不需要补考,不错不错,接下来就把B-H七位童鞋的都补上吧,Ctrl C/V,相信你们~
很痛苦是不是,下次写个循环就可以一次性全搞定了←_←
结果就不放了,自己扫一眼就能知道程序结果对不对了,有问题再找找哪错了
优秀or良好or及格or不及格
我们读书时,有时候不仅仅只有及格和不及格两个等级,而是会分优秀、良好、及格、不及格等等的等级的,那么这又该如何实现呢
这就需要多分支了,多分支可以用上面的IF实现,还可以用Select Case实现,结构如下
'if结构
if <满足条件1> then
<执行过程1>
elseif <满足条件2> then
<执行条件2>
else
<执行条件3>
end if
'select case结构
select case <变量>
case <条件1>
<过程1>
case <条件2>
<过程2>
case <条件3>
<过程3>
(case else
<过程4>)
end select
画图表示就是这样的
暂时先不管我为什么这样画,我们回到成绩上来
现在假定,90分以上(包括90分,下同)为优秀,80分以上为良好,60分以上为合格,不到60分为不合格,成绩还是用上次的成绩
If range("B2")>=90 then
range("C2")="优秀"
elseif range("B2")>=80 then
range("C2")="良好"
elseif range("B2")>=60 then
range("C2")="及格"
else
range("C2")="不及格"
end if
按F5运行一下,再把剩下几位童鞋的成绩等级补充完整
如果我们把上面的顺序掉换一下,会发生什么呢
If range("B2")>=60 then
range("C2")="及格"
elseif range("B2")>=80 then
range("C2")="良好"
elseif range("B2")>=90 then
range("C2")="优秀"
else
range("C2")="不及格"
end if
发生了什么!怎么变化那么大!
为什么仅改变一下顺序就有这么大的变化呢,回头看看我画的图
最开始的时候,条件1是大于等于90分,满足的进入过程1,不满足的进入下一个判断,,而掉换了顺序之后,条件1是大于等于60分,A童鞋89分满足条件,进入过程1,不再进入下一个判断了,所以在用IF Elseif做分支的时候一定要注意分支的顺序啊
*************************(假装有分割线)*************************
上面画了两个图,另一个Select Case怎么实现呢,分数有那么多,总不可能一个一个列出来吧,,那么想一想,优秀的分数是不是90+,也就是说十位数为9或者10,良好的分数十位数为8,依次类推,我们只需要知道这个分数里面十位数是多少就可以了。那么怎么得到一个数的十位数呢
我们知道98÷10=9……8
VBA里,可以用 9810 来取得9(注意,是不是/,/就是普通的除法,98/10=9.8,9810=9),可以用 98 MOD 10 来取得8
所以,写成代码就是,自己Ctrl C/V补充后面的啊,下次分享完循环就没有那么累了←_←
Select Case Range("B2") 10 '求十位数
Case 10
Range("C2") = "优秀"
Case 9
Range("C2") = "优秀"
Case 8
Range("C2") = "良好"
Case 7
Range("C2") = "及格"
Case 6
Range("C2") = "及格"
Case Else
Range("C2") = "不及格"
End Select
然后F5运行一下,嗯,不错,结果都出来了
不死心,掉换一下Case的顺序,结果还是一样的(不过Case Else千万不要换地方啊,因为是前面的所有条件都尝试了不对才去尝试Case Else的,如果条件没有尝试完就出现Case Else了,程序会默认你剩下的所有条件都在Case Else里面,不会再去尝试,所以Case Else只能放在最后)
这下明白我为什么把IF和Select Case画得不一样了吧
如果不出现Case Else的话,分支里面就不会进行任何操作,直接到下一步
总结一下,分支结构有If语句和Select Case语句两种,If语句可以按范围选择,Select Case可以按区间选择,If语句需要注意顺序,是层层递进的,Select Case可以不注意顺序,是平行的