首页 > 数据库 > 数据库开发技术 > VBA新手教程:工欲善其事必先利其器(2)
点击蓝字关注我们
VBA新手教程系列查阅:
《VBA新手教程:从入门到放弃(0)》
《VBA新手教程:没放弃咱就开整(1)》
先来看看上次的作业吧!请依据文化水平对号入座。
小学及以下
1Sub 三角形的面积()
2 Dim 面积 As Single
3 Dim 高 As Single
4 Dim 底边 As Single
5 高 = Cells(1, 2)
6 底 = Cells(2, 2)
7 面积 = 1 / 2 * 底 * 高
8 Cells(3, 2) = 面积
9End Sub
变量用汉字看着是不是很low,但是不是很好看很容易辨认!那就这么用!
读入高,读入底,然后利用小学公式求面积,再输出!
题目没什么难点,估计能会有同学定义了integer整数型导致了小数点后面丢失。下次注意!
初中及以上
1Sub 球的体积()
2 Dim R As Integer
3 R = Cells(Cells(1, 3), 1)
4 Dim V As Single
5 V = 4 / 3 * 3.14 * R ^ 3
6 Cells(2, 3) = V
7End Sub
这题难点难道在求球体体积的公式?!
真正难的或许在cells的嵌套吧!
没错,Cells(1,3)是我们输入的行值,所以它本身也是一个“数”,既然是数就可以表示行数,所以这么嵌套是OK啦!
另外啰嗦几句上期有关内容
常用几个类型一定记清楚!integer整数!string字符串!single小数!
一定注意变量的类型,常见的有把小数赋值给整型会丢失精度,把整数赋值给字符串类型,在比较大小时会出错等等。
有些系统的“违禁词”不可以被当做变量名,比如Name、As、Stop等等,就像我们给游戏ID起名时,要避开敏感词汇表里面的内容一样。同样,这些词也不用特意记,你一声明系统就崩溃起火冒烟记得打119……
表述得越详细越好,比如Worksheets(“Sheet1”).Cells(1,1)就比Cells(1,1)要好。有时候指向不明在工作表或者工作簿之间来回跳转时会出错。就像你同时跟张三李四对话,瞅着他俩中间说:“你是智障吗?”俩人都假装没听到一样。
今天的小目标
1、整几个特别low的变量;
2、用for循环偷懒;
3、用if告诉程序怎么做是对的;
4、从单元格读取内容,经过一番折腾再放回去。
(能改绝对不写新的)
曾经的一个笑话给程序猿黑惨了啊哈哈哈哈哈哈哈哈。
小sei的老公是一个程序猿,小sei给他打电话:“下班回来买10个土豆,如果看到了卖西红柿的,买2个。”结果小sei的老公下班回家拎着2个土豆,小sei问他为啥就买这点?“因为我看见卖西红柿的了(手动微笑)”
我们用伪代码(假程序)来回放一下小sei老公短路的脑子:
1Sub 下班买菜()
2 Dim 预购清单 As 各种菜
3 预购清单 = 土豆 * 10
4 If 看到卖西红柿的 Then
5 预购清单 = 土豆 * 2
6 End If
7End Sub
这还好是预购,要是已购还得去退8个土豆……
这回有没有理解赋值的覆盖性!
逻辑其实非常简单,我直接讲解一下结构。
If 逻辑 then
……
Elseif 逻辑 then
……
Elseif 逻辑 then
……
Else
……
End If
IF,如果;Then,那么。像不像小时候的造句!如果今天下雨,我就不去上学了!像不像你!
ElseIf,其他情况的话,如果;Then那么。其他情况的话,如果(今天确定不下雨,找其他借口)我吃撑了,就不去上学了!
Else,其他。啥借口都没有了,我只能去上学了。
End If,结束标志。代表整个If判断的结构体结束。
只有开头结尾是必须的,其他都是非必须的。
If 逻辑 then
……
End If
一堆比较关系,等于=,大于>,大于等于>=,小于<,小于等于<,不等于<>。所有的逻辑关系就都在这儿了,已经全了!
有小伙伴可能另(tai)辟蹊(gang)径:“哎,劳斯,补对啊,包含啥的咋没说?”
就不说气死你!以后再讲!而且可以提前告诉你包含已经被包含了!
这里不提真假值,我们就说条件满足不满足,通俗易懂!
系统认为,只要是0,就是不满足条件(假);只要是非0值,就是满足条件(真)!
1Sub 奇怪逻辑()
2 If -1 Then
3 MsgBox ("满足条件")
4 Else
5 MsgBox ("不满足条件")
6 End If
7End Sub
以上输出结果一定是满足条件,因为-1不等于0。
这种奇怪的逻辑建议不要直接使用,所以不建议记!但是大约要知道这么个事儿!
所以建议你只需要用逻辑关系符号判断条件是否满足!
所有的If语句,都可以用Select Case改写。
但别学那么多会放弃的!你只需要会一种方法就可以!
所以我Select我讲都不会讲的(手动微笑)
做个最简单的题!
输入一个人的年龄,告诉我他属于什么年龄段。
假定2岁及以下属于婴幼儿,10岁及以下属于儿童,20岁及以下属于青年,50岁及以下属于中年,50岁以上属于老年。
来中年人,咱们试着写一下,写之前,这个函数我们会用到:
Inputbox(),输入盒子。这个函数可以弹出一个弹框,输入一个赋值给一个变量。
代码:
1Sub 输入年龄返回所属年龄段()
2 Dim Age As Integer
3 Dim AgeType As String
4 Age = InputBox("请输入整数年龄")
5 If Age <= 2 Then
6 AgeType = "婴幼儿"
7 ElseIf Age <= 10 Then
8 AgeType = "儿童"
9 ElseIf Age <= 20 Then
10 AgeType = "青年"
11 ElseIf Age <= 50 Then
12 AgeType = "中年"
13 Else
14 AgeType = "老年"
15 End If
16 MsgBox (Age & "岁属于" & AgeType)
17End Sub


讲解
我们定义两个变量,一个是整数型年龄(Age),一个是字符串型的年龄所属区间(AgeType),我们用Inputbox函数给Age赋值,然后通过判断Age的所属区间确定AgeType的值。最后以“X岁属于X”用Msgbox函数输出。逻辑非常简单。
注意一点,最后的else是可以用elseif改写的,应该怎么写呢?
(留作思考题)
(永久尘封的那种)
OK!If条件判断已经学完了,看下一个内容!
这个真的是程序的精髓,程序擅长解决的就是逻辑重复不需要创造性思维的问题。
比如,每个孩子从小被考:从1加到100,得多少?
所有的父母都希望自己是高斯的父母,但基本希望都落空了……
(欲知什么梗,请移步百度:高斯1加到100故事)
1+2=3
3+3=6
6+4=4
……
5085+99 = 5120
5120+100=5220
(算完当场就哭出了声)
利用高中学习的等比数列前N项和,(首项+末项)*项数/2 = (1+100)*100/2=5050。
至少算对了。
当然是用VBA!
1Sub 求和()
2 Dim sum As Integer
3 For i = 1 To 100
4 sum = sum + i
5 Next
6 MsgBox ("1加到100等于" & sum)
7End Sub

有些具有批(gang)判(jing)精神的同学会说:“切,这高端什么,还比不上普通青年呢!”
是么?那我改成68加到792,麻烦你算下(手动狗头)
此时213青年已倒地吐白沫,普通青年也慌了,因为如此高位的乘法已经不能口算了,然而高端青年只需小小的改动一下代码:
1Sub 求和2()
2 Dim sum As long
3 For i = 68 To 792
4 sum = sum + i
5 Next
6 MsgBox ("68加到792等于" & sum)
7End Sub

注意,此时sum需要更改类型,因为最后结果在3万以上,整型会溢出,所以改成long型。
至此,高端青年完胜。
在这里也想强调一点,程序更多的是解决一类问题,所以能灵活配置是你在写代码时需要考虑的问题。
For 变量 = 开始值 to 结束值
……
Next
For,循环开始的标志,第一次循环,变量最初会被赋值为“开始值”;从第二次开始,变量每次会被+1,然后与结束值比较,若变量值<=结束值,则继续循环;如果变量值>结束值(这有个伏笔),则跳出循环。
Next,循环结束的标志。运行到这步时变量+1。
我们还是来看“1加到100”这个例子
……
算了,不看了,简单到不知道怎么讲,自己领悟!不会的话留言!我把你T了!
还记得刚才的伏笔吗?
“如果变量值>结束值,则跳出循环”
这个表述上是非常不准确的。
语法
For 变量 = 起始值 to 结束值 step 步长
Next
步长是什么意思呢?
以“求1到100所有奇数的和”为例:
1Sub 求奇数和()
2 Dim sum As Long
3 For i = 1 To 100 Step 2
4 sum = sum + i
5 Next
6 MsgBox ("1加到100的奇数和" & sum)
7End Sub
Step 2,理解为步长为2,即变量每次+2,所以i的值就变为了1,3,5,7,9,11……97,99
当i到达99时,下一次循环,i变为了101,超过了100,所以跳出了循环。

所以当step 的步长填写为-1时,会发生什么效果!
没错!变量i的值,每下一次循环,就比当前值减少1。
以“反向求1到100所有偶数的和”为例:
1Sub 反向求偶数和()
2 Dim sum As Long
3 For i = 100 To 1 Step -2
4 sum = sum + i
5 Next
6 MsgBox ("1加到100的偶数和" & sum)
7End Sub
Step -2,步长为-2,即变量每次-2,所以i的值就变为了100,98,96……4,2。
当i为2时,下一次循环,i变为了0,小于结束值1,所以跳出了循环。

1、在step省略不写时,默认缺省为step 1;
2、在step后值为正时,结束标志为大于结束值;
3、在step后值为负时,结束标志为小于结束值。
当然不用记!你写的代码一定是在这个区间,理解就好了!
各种结构都是可以嵌套的,那么下面这个问题,你能理解吗?
1Sub 循环嵌套()
2 Dim sum As Long
3 For i = 1 To 100
4 For j = 1 To 100
5 sum = sum + j
6 Next
7 Next
8 MsgBox (sum)
9End Sub
讲解
先看最内层的循环,是不就是一个1加到100的和!
那外面i循环,循环了100次,是不就是将1加到100的和乘以了100!

1、每一个For,对应一个Next。
2、嵌套关系的For之间,不能用相同的变量,会报错!
3、但是并列关系的For,可以用相同变量,一般常用的是i,j,k,也可以自己随意定义。
1、新建一个工作表,在A列的第1至第100行,分别输出1至100。
2、但如果这个数是7的整数倍,则不输出。
3、禁止用mod函数!(不用知道这个是啥,我还没讲到)。
1、再讲一个While循环,这个真是没办法确实不能完全被For循环替代。
2、写了一堆Bug,咋整?我自己看着都懵!(没错,讲解一下调试方法。)
说VBA弱鸡的多半都是不会VBA的!
欢迎在下方留言与我们一起探讨学习营造河蟹氛围。
讲解错误、疏漏、难于理解的地方不欢迎批评指正!生气!
你就留言指责吧,不会让你上墙的!
就这样再见!

扫描二维码
关注我们
微信号 :AlphaGame
原文作者:可以叫我才哥;如有侵权,请联系管理员删除。