ITPub博客

首页 > 数据库 > 数据库开发技术 > VBA新手教程:工欲善其事必先利其器(2)

VBA新手教程:工欲善其事必先利其器(2)

原创 数据库开发技术 作者:可以叫我才哥 时间:2020-04-20 19:46:24 0 删除 编辑

点击蓝字关注我们



VBA新手教程系列查阅:

《VBA新手教程:从入门到放弃(0)》
《VBA新手教程:没放弃咱就开整(1)》

不同程序语言,难易度差别大吗?

在对程序一窍不通的人眼中,程序仿佛是一种意念一样的存在:你给我写个程序很简单,输入这个输出那个,你们用程序一下就搞定了!
没错大哥,你看到的是输入个这、输出个那,那中间你看不到的逻辑都是我想想就好的吗?真的不用敲代码不用反复验证吗?
还有大哥说:你要是用VBA写麻烦,我听说那个Python贼好用,你会吗?不然你用那个试试?
   ………
所以我今天想片面的说的是,不同程序语言之间可能语法不一样,内部封装的函数和方法也不一样,但只是为了适应该程序语言在某种特定编写环境中图方便而为之。若想用不同语言实现同一个功能,其实现逻辑可以说99%都没有区别!
所以掌握算法(逻辑)才是最牛逼的!

复习一下

先来看看上次的作业吧!请依据文化水平对号入座。

小学及以下

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、从单元格读取内容,经过一番折腾再放回去。
(能改绝对不写新的)

正经的教程开始

If条件判断

曾经的一个笑话给程序猿黑惨了啊哈哈哈哈哈哈哈哈。

小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。
这种奇怪的逻辑建议不要直接使用,所以不建议记!但是大约要知道这么个事儿!
所以建议你只需要用逻辑关系符号判断条件是否满足!

Select语句(别记)

所有的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条件判断已经学完了,看下一个内容!

For循环

这个真的是程序的精髓,程序擅长解决的就是逻辑重复不需要创造性思维的问题。

比如,每个孩子从小被考:从1加到100,得多少?

所有的父母都希望自己是高斯的父母,但基本希望都落空了……
(欲知什么梗,请移步百度:高斯1加到100故事)

213青年

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语法

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后值为负时,结束标志为小于结束值。

当然不用记!你写的代码一定是在这个区间,理解就好了!

For循环的嵌套

各种结构都是可以嵌套的,那么下面这个问题,你能理解吗?

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



原文作者:可以叫我才哥;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2020-03-18

  • 博文量
    161
  • 访问量
    69018