打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
零基础学习VBA:什么是循环?
哈罗,大家好,我是看见星光。今天给大家聊一下循环,什么是循环?它有什么用?又该怎么用?

打个响指,其实说起来循环这家伙大家并不陌生。往大了说,天地玄黄,宇宙洪荒,地球围绕太阳公转,一年转365圈,是一种循环;往小了说,日常作息,衣食住行,你上班、下班、上班、下班……也是一种循环;你恋爱了,又失恋了,你又恋爱了,又失恋了,你又恋爱了……还是一种循环(严肃声明,您这都是纯洁的恋爱,连牵手都没有的那种)。

摊手,你看,循环无处不在,所谓循环,其实就是一种重复。

在编程上也是一样。循环是指执行重复的指令,直至过程结束的一种程序结构。


循环的作用


那么循环有什么用呢?

我举个例子。


如上图所示,是一张成绩表,需要在C列计算是否需要补考;小于60分返回'是',否则返回'否'。

如果不用循环,代码是这样的。老老实实用9条If语句判断每一个成绩,然后在C列返回结果。

代码如看不全可以左右拖动..▼

Sub test1() If Range('b2') < 60 Then Range('c2') = '是' Else Range('c2') = '否' If Range('b3') < 60 Then Range('c3') = '是' Else Range('c3') = '否' If Range('b4') < 60 Then Range('c4') = '是' Else Range('c4') = '否' If Range('b5') < 60 Then Range('c5') = '是' Else Range('c5') = '否' If Range('b6') < 60 Then Range('c6') = '是' Else Range('c6') = '否' If Range('b7') < 60 Then Range('c7') = '是' Else Range('c7') = '否' If Range('b8') < 60 Then Range('c8') = '是' Else Range('c8') = '否' If Range('b9') < 60 Then Range('c9') = '是' Else Range('c9') = '否' If Range('b10') < 60 Then Range('c10') = '是' Else Range('c10') = '否'End Sub


还好只是9条成绩,如果上万条,岂不是要敲上万行代码?我有个朋友VBA代码按行收费,假设一行代码5块钱,那就是……所以是谁说VBA不赚钱的?决斗吧!


思考一下问题处理过程,我们需要对多个成绩进行条件判断,假如将成绩设置为一个变量,那就需要重复判断9次——在编程的世界里,重复执行的指令就应该交给循环来处理。

使用循环的代码如下。

代码如看不全可以左右拖动..▼
Sub test2()    Dim i As Long    For i = 2 To 9        If Range('b' & i) < 60 Then Range('c' & i) = '是' Else Range('c' & i) = '否'    Next iEnd Sub

第3行至第5行代码是一个循环体。如果需要判断的成绩有1万个,只需要将其中的9修改为10000就可以了。也就是说,只需要修改一句代码,就可以做完成千上万倍的工作。酷不酷?
不用上优酷。

    For i = 2 To 10000

那么这个循环体是怎么工作的?为什么代码要这么写?

请向下看。

循环的种类


循环通常有两种形式,一种是计数循环,通过次数来控制;另一种是条件循环,通过环境来控制。

计数循环又被称为For循环,这是因为绝大部分编程语言的计数循环都使用了关键字For。

条件循环又被称为While循环,原因嘛……您猜一下……嗯,您不但人长的好看,心也很聪明,确实是因为条件循环大都使用了关键字While。

两种循环结构中,最被频繁使用的是计数循环;我们就来先聊它。


For Next 语句


如前所述,计数循环又被称为For循环,它可以通过次数来控制;在VBA中,通常使用For To语句来实现。
其语法结构如下。
For 变量 = 起始值 To 终止值 [Step步长][任意代码][Exit For][任意代码]Next [变量]
中括号部分都是可选的。

……

我举个简单的例子。

以下代码可以在当前工作表的A列输入1~100递增的序列号。
Sub test3() Dim i As Long For i = 1 To 100 Step 1 Cells(i, 'A') = i Next iEnd Sub

代码运行效果如下。

代码解析▼

第2行代码声明变量,其名为i,其类为long,其之大,庄周他老人家不知道。

第3行到第5行代码是For Next 语句搭建的循环体。

第3行代码指定了循环变量的起始值为1~终止值为100(1 To 100),步长为1(Step 1),作用是将第4行代码循环执行100遍不许变。其中Step 1是可以省略的,如果省略,则默认步长为1。

第4行代码在A列单元格输入变量i。Cells(i,1)是单元格对象的一种表达方式,i是指行,A是指列。Cells(1,'A')也就是A1单元格,Cells(2,'A')也就是A2单元格,其余以此类推……

第5行代码Next i,i是可以省略的。在这里变量i将会按步长递增(Step为正数时),或递减(Step为负数时)。比如本例,第1次循环,变量i为初始值1,Next语句将会使其递增1(Step 1);则下一次(第2次)循环则更新变量i为2……直至变量i为100,到达终止值,退出循环。


将代码省略掉可以省略的部分,结果如下。

代码如看不全可以左右拖动..▼
Sub test4()    Dim i As Long    For i = 1 To 100 '省略Step,则默认Step 1        Cells(i, 'A') = i    Next '省略 iEnd Sub

……


再举个步长不为1的例子。

在A列列举出1~100之间的奇数,代码如下。

Sub test5() Dim i As Long Columns(1).ClearContents '清空A列内容 For i = 1 To 100 Step 2 '步长为2 Cells(i / 2 + 0.5, 'A') = i NextEnd Sub

代码解析▼

第3行代码清空当前工作表A列的内容。

第4行代码设置循环变量起始值为1;终止值为100,
步长为2.

第5行代码将变量i的值写入当前工作表A列单元格。

第6行代码使变量i按步长2递增,比如第一次循环为1,第二次循环为3……即产生1~100之间的所有奇数:1、3、5、7……

代码运行结果如下。


……

再举个步长为负数的例子。

如下图所示的数据表,需要删除C列成绩为空白的记录。


代码如下。

Sub test6() '删除B列空格所在行    Dim i As Long    For i = 10 To 2 Step -1 '从后向前遍历,步长为负一        If Cells(i, 'C') = '' Then '如果单元格为空            Cells(i, 'C').EntireRow.Delete '则整行删除        End If    NextEnd Sub

代码解析▼

第3行代码设置循环变量的
初始值为10,终止值为2,步长为负一。第一轮循环时变量i值为10,第二轮为9……依次类推,也就是从后向前遍历B2:B10单元格区域,并删除空白单元格所在行。

想一下,为什么不能使用以下代码
从前向后遍历B2:B10区域,并删除空白单元格所在行?

Sub test7()  Dim i As Long    For i = 2 To 10 Step 1 '从后向前遍历,步长为负一 If Cells(i, 'C') = '' Then '如果单元格为空 Cells(i, 'C').EntireRow.Delete '则整行删除 End If NextEnd Sub

……

打个响指,提个问题,For循环是不是只能一条道走到黑呢?设定循环多少次就一定得执行多少次呢?

譬如说罢(不知道为啥,我总觉得这个词特别有气势),如下图所示的数据表,如果使用VBA代码查询'看见星光'的成绩,可以计数循环遍历B2:B10区域的人名,找到'看见星光',然后获取对应的C列成


代码如下:

代码如看不全可以左右拖动..▼

Sub test9()    Dim i As Long    For i = 2 To 10        If Cells(i, 'A') = '看见星光' Then '判断A列人名是否是看见星光            MsgBox '看见星光的成绩是:' & Cells(i, 'C')        End If    NextEnd Sub

以上代码确实能获取正确的查询结果,但问题是,'看见星光'就
坐趴在A2单元格,第一次循环时,咱们就可以发现了他,完全没有必要再进行第3、4……9次循环,对不对?

严肃脸:作为共产主义接班人,咱们从小就明白浪费是可耻的,效率低下是绝不能代表先进生产力前进方向的,我们怎么才能避免这种浪费的行为呢?

可以使用Exit For语句,在指定条件下,退出循环体。

代码如下。

Sub test10() Dim i As Long For i = 2 To 10 If Cells(i, 'A') = '看见星光' Then '判断A列人名是否是看见星光 MsgBox '看见星光的成绩是:' & Cells(i, 'C') Exit For End If NextEnd Sub

代码解析▼

第4行代码判断A列的值是否为'看见星光',如果符合条件,则第5行代码显示'看见星光'的成绩,然后第6行代码退出循环体,也就不再进行剩下次数的循环。

对于新手朋友来说,需要注意的是,Exit For语句处在If条件语句内,而不是外。If条件不为真,则不会运行该代码……直至条件为真,或循环变量到达终止值,结束循环。


For Each…Next 语句


最后说下For Each...Next语句,这货比较简单。

在VBA中该语句也可以执行循环运算,
但它只能作用于对象集合或数组,它会自动按照从左向右、从前向后的顺序遍历对象集合或数组中的每一个元素。它的语法和For Next语句十分相近,不同的只有第一句。

For Each 变量 In 对象集合/数组[任意代码][Exit For][任意代码]Next [变量]

需要强调的有两点……

首先
For Each 变量 In 对象集合/数组。这里的变量必须是对象或变体类型。

另外,该语句只作用于对象集合或数组。什么是数组?数组是元素的有序集合,具体而言后面章节咱们再讲。什么是对象集合?在前面第4课什么是对象里咱们讲过了,如果你忘记了……微微笑,嗯,那真好,你又可以温故而知新了。

举个例子。

如下图所示的数据表,需要统计C列成绩大于80分的个数。


代码如下:

代码如看不全可以左右拖动..▼
Sub test11() Dim rng As Range, k As Long For Each rng In Range('c2:c10') '遍历c2:c10区域内的单元格 If rng.Value > 80 Then k = k + 1 '累加个数 Next rng MsgBox '大于80的成绩有:' & k & '个'End Sub


代码解析▼

第2行代码声明变量。其中变量rng为单元格对象。

第3行至第5行代码是For循环体。第3行代码指定了循环的变量是rng,目标是单元格
对象集合C2:C10区域。第4行代码判断变量rng的值是否大于80,如果为真,则累加变量k——关于如何理解k=k+1,在前面第6课什么是变量,咱们又讲过了,注视你,你还记得吗?

第5行代码
Next rng,变量rng是可以省略的,意思是下一轮循环将变量rng更新为对象集合中的下一个元素,直至用完最后一个元素,则退出循环。

……

For Each...Next语句也支持使用Exit For退出循环体。你可以尝试使用该语句解决查找'看见星光'成绩的问题。

和For Next语句相比,不同的只是For Each...Next语句不用指定循环次数,它默认遍历对象集合中的每一个元素,而且听说速度比For Next稍快,但明显没有For Next灵活。

……


练手题


最后留下一道练手题……从A列数据中获取爱好,结果参见C列。


下期再贱。

……


《VBA经典代码应用大全》
当当、天猫、京东均有销售~

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
从九九乘法表的代码中学习FOR NEXT中的嵌套!
Excel
第四讲 Excel vba 程序及常用语句
完全手册Excel VBA典型实例大全:通过368个例子掌握
第一章、Excel VBA基础知识
3段VBA代码,从此不再「复制-粘贴」
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服