前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VBA新手教程:工欲善其事必先利其器(2)

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

作者头像
可以叫我才哥
发布2021-08-05 11:15:21
8740
发布2021-08-05 11:15:21
举报
文章被收录于专栏:可以叫我才哥

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

在对程序一窍不通的人眼中,程序仿佛是一种意念一样的存在:你给我写个程序很简单,输入这个输出那个,你们用程序一下就搞定了!

没错大哥,你看到的是输入个这、输出个那,那中间你看不到的逻辑都是我想想就好的吗?真的不用敲代码不用反复验证吗?

还有大哥说:你要是用VBA写麻烦,我听说那个Python贼好用,你会吗?不然你用那个试试? ……… 所以我今天想片面的说的是,不同程序语言之间可能语法不一样,内部封装的函数和方法也不一样,但只是为了适应该程序语言在某种特定编写环境中图方便而为之。若想用不同语言实现同一个功能,其实现逻辑可以说99%都没有区别!

所以掌握算法(逻辑)才是最牛逼的!

复习一下

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

小学及以下

代码语言:javascript
复制
Sub 三角形的面积()
    Dim 面积 As Single
    Dim 高 As Single
    Dim 底边 As Single
    高 = Cells(1, 2)
    底 = Cells(2, 2)
    面积 = 1 / 2 * 底 * 高
    Cells(3, 2) = 面积
End Sub

变量用汉字看着是不是很low,但是不是很好看很容易辨认!那就这么用!

读入高,读入底,然后利用小学公式求面积,再输出!

题目没什么难点,估计能会有同学定义了integer整数型导致了小数点后面丢失。下次注意!

初中及以上

代码语言:javascript
复制
Sub 球的体积()
    Dim R As Integer
    R = Cells(Cells(1, 3), 1)
    Dim V As Single
    V = 4 / 3 * 3.14 * R ^ 3
    Cells(2, 3) = V
End 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老公短路的脑子:

代码语言:javascript
复制
Sub 下班买菜()
    Dim 预购清单 As 各种菜
    预购清单 = 土豆 * 10
    If 看到卖西红柿的 Then
        预购清单 = 土豆 * 2
    End If
End 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值,就是满足条件(真)!

代码语言:javascript
复制
Sub 奇怪逻辑()
    If -1 Then
        MsgBox ("满足条件")
    Else
        MsgBox ("不满足条件")
    End If
End Sub

以上输出结果一定是满足条件,因为-1不等于0。 这种奇怪的逻辑建议不要直接使用,所以不建议记!但是大约要知道这么个事儿! 所以建议你只需要用逻辑关系符号判断条件是否满足!

Select语句(别记)

所有的If语句,都可以用Select Case改写。 但别学那么多会放弃的!你只需要会一种方法就可以! 所以我Select我讲都不会讲的(手动微笑)

举个例子

做个最简单的题! 输入一个人的年龄,告诉我他属于什么年龄段。

假定2岁及以下属于婴幼儿,10岁及以下属于儿童,20岁及以下属于青年,50岁及以下属于中年,50岁以上属于老年。

来中年人,咱们试着写一下,写之前,这个函数我们会用到:

Inputbox(),输入盒子。这个函数可以弹出一个弹框,输入一个赋值给一个变量。

代码:

代码语言:javascript
复制
Sub 输入年龄返回所属年龄段()
    Dim Age As Integer
    Dim AgeType As String
    Age = InputBox("请输入整数年龄")
    If Age <= 2 Then
        AgeType = "婴幼儿"
    ElseIf Age <= 10 Then
        AgeType = "儿童"
    ElseIf Age <= 20 Then
        AgeType = "青年"
    ElseIf Age <= 50 Then
        AgeType = "中年"
    Else
        AgeType = "老年"
    End If
    MsgBox (Age & "岁属于" & AgeType)
End 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!

代码语言:javascript
复制
Sub 求和()
    Dim sum As Integer
    For i = 1 To 100
        sum = sum + i
    Next
    MsgBox ("1加到100等于" & sum)
End Sub

有些具有批(gang)判(jing)精神的同学会说:“切,这高端什么,还比不上普通青年呢!”

是么?那我改成68加到792,麻烦你算下(手动狗头)

此时213青年已倒地吐白沫,普通青年也慌了,因为如此高位的乘法已经不能口算了,然而高端青年只需小小的改动一下代码:

代码语言:javascript
复制
Sub 求和2()
    Dim sum As long
    For i = 68 To 792
        sum = sum + i
    Next
    MsgBox ("68加到792等于" & sum)
End Sub

注意,此时sum需要更改类型,因为最后结果在3万以上,整型会溢出,所以改成long型。

至此,高端青年完胜。

在这里也想强调一点,程序更多的是解决一类问题,所以能灵活配置是你在写代码时需要考虑的问题。

For语法

For 变量 = 开始值 to 结束值 …… Next

For,循环开始的标志,第一次循环,变量最初会被赋值为“开始值”;从第二次开始,变量每次会被+1,然后与结束值比较,若变量值<=结束值,则继续循环;如果变量值>结束值(这有个伏笔),则跳出循环。

Next,循环结束的标志。运行到这步时变量+1。

举例

我们还是来看“1加到100”这个例子 …… 算了,不看了,简单到不知道怎么讲,自己领悟!不会的话留言!我把你T了!

特殊的语法——倒序

还记得刚才的伏笔吗? “如果变量值>结束值,则跳出循环” 这个表述上是非常不准确的。

语法

For 变量 = 起始值 to 结束值 step 步长 Next

步长是什么意思呢?

以“求1到100所有奇数的和”为例:

代码语言:javascript
复制
Sub 求奇数和()
    Dim sum As Long
    For i = 1 To 100 Step 2
        sum = sum + i
    Next
    MsgBox ("1加到100的奇数和" & sum)
End 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所有偶数的和”为例:

代码语言:javascript
复制
Sub 反向求偶数和()
    Dim sum As Long
    For i = 100 To 1 Step -2
        sum = sum + i
    Next
    MsgBox ("1加到100的偶数和" & sum)
End 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循环的嵌套

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

代码语言:javascript
复制
Sub 循环嵌套()
    Dim sum As Long
    For i = 1 To 100
        For j = 1 To 100
            sum = sum + j
        Next
    Next
    MsgBox (sum)
End 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的!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 可以叫我才哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 复习一下
    • 变量
      • 单元格
      • 正经的教程开始
        • If条件判断
          • 语法
          • 极简版
          • 逻辑
          • 特殊逻辑(别记)
          • Select语句(别记)
          • 举个例子
        • For循环
          • 213青年
          • 普通青年
          • 高端青年
          • For语法
          • 举例
          • 特殊的语法——倒序
          • 总结
          • For循环的嵌套
          • 注意
      • 今日作业
      • 下期不定期更新预告
      • 今日毒奶
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档