循环的作用
那么循环有什么用呢?
我举个例子。
如上图所示,是一张成绩表,需要在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 i
End Sub
For i = 2 To 10000
循环的种类
For Next 语句
For 变量 = 起始值 To 终止值 [Step步长]
[任意代码]
[Exit For]
[任意代码]
Next [变量]
Sub test3()
Dim i As Long
For i = 1 To 100 Step 1
Cells(i, 'A') = i
Next i
End 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 '省略 i
End Sub
……
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
Next
End Sub
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
Next
End Sub
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
Next
End Sub
Sub test9()
Dim i As Long
For i = 2 To 10
If Cells(i, 'A') = '看见星光' Then '判断A列人名是否是看见星光
MsgBox '看见星光的成绩是:' & Cells(i, 'C')
End If
Next
End Sub
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
Next
End Sub
For Each 变量 In 对象集合/数组
[任意代码]
[Exit For]
[任意代码]
Next [变量]
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灵活。
……
练手题
联系客服