1、循环的作用和原理
作用:用来有效地重复执行相同或者相似的操作。Sub vv()
Dim i As Long
i = 0
i = i + 1
i = i + 1
i = i + 1
i = i + 1
i = i + 1
MsgBox i
End Sub
上面代码,每句 i=i+1执行后,i 都在原来的基础上加上 1。因此最后 i=5。
显然,i=i+1这5句代码都是重复的操作。假如要执行 【 i=i+1】 100次、1000次,那代码得需要写多长?
于是,就有了循环。For循环是一个结构,For开始,Next结尾。Dim i As Long
Dim x As Long '循环次数
i = 0
For x = 1 To 5
i = i + 1
Next
如上面的代码,For x = 1 To 5 表示循环是从1-5执行5次,表示执行了5次 i=i+1 这样的操作。
For循环的原理:For循环实际上是内置了一个看不到的计数器,当x=1时,执行 i=i+1 完毕后,Next会自动进入下一次循环(内置计数器计数记录),下一次 x=2 ,执行 i=i+1 完毕后,再下一次 x=3.....如此循环重复,直到循环结束,就是x=6(超过5)的时候结束。如下面的gif图。
2、For循环的步长。
步长就是我们军训排队时,教官号令报数,单数出列。单数1、3、5、7.....之间都相差 2,这就是步长。
如,现在我们要在A1:A10单元格区域,依次选择单数A1、A3、A5......A9。步长是使用要在For语句后面写上
Step 步长值。Dim i As Long
For i = 1 To 10 Step 2 '步长为2
Cells(i, 1).Select
Next
上面代码 i 的值变化依次是1、3、5、7、9。
实际上 For x = 1 To 5 是省略了步长 Step 1 的,默认步长是1的情况下可省略。
3、For循环的方向
一般循环的方向是从上到下的,但也可以从下到上。VBA删除行就是一个典型的例子。
下面例子,删除A1:A12中空单元格所在的行。
如果需要从下到上循环,注意两点:
1、For i = 12 To 1 而不是 For i = 1 To 12
2、Step -1声明方向,不可以省略。-1 是反方向的步长值,可以更改,但必须负整数。Sub gggg()
Dim i As Long
For i = 12 To 1 Step -1 '注意方向
If Range("a" & i) = "" Then
Range("a" & i).EntireRow.Delete '删除整行
End If
Next
End Sub
4、循环的嵌套
正如 if结构可以嵌套,循环也可以。下面例子用两个循环,一次填充数字1-10。
该代码,先开始执行外循环(不执行完,一次一次来),然后执行完内循环(执行完5次),再进入下一次外循环,重复执行内循环.....
5、退出For循环
下面例子,H1:H6有6个姓名。我们需要在其中寻找“小乔”,一般情况下,找到小乔了,我们就会停止寻找动作,是不是?所以这里的循环次数并不是6次,而是4次,我们找到小乔后提前退出了。
if结构常常用来配合退出循环。退出循环的语句是Exit For。
Dim i As Long
For i = 1 To 6
If Cells(i, "h") = "小乔" Then
Cells(i, "h").Interior.ColorIndex = 3 '设置背景颜色
Exit For '退出循环
End If
Next
李白和百里玄策不管啦!
6、另一个For循环:For each.....Next
For each.....Next循环常常用来遍历集合对象。Dim Sht As Worksheet
For Each Sht In Worksheets
Debug.Print Sht.Name
Next
代码遍历工作表集合,依次打印工作簿中每个工作表的名称。
【小结】
这是简单系列的第8篇文章,现在开始我们的VBA编程之旅了。
在现学到的知识范围内,我们可以尝试解决3个实际问题。
VBA其实真的很简单!
例子1:高级筛选
代码如下,仅供参考:Sub bb()
Range("a1:c1").Copy Range("j1") '复制标题
k = 1 '记录行号
For i = 2 To 13 '循环遍历数据
'如果部门是A且销售额大于等于1500
If Cells(i, 1) = "A" And Cells(i, 3) >= 1500 Then
k = k + 1 '计数,辅助输出数据到 j 列的单元格区域
'表格整行数据复制到 j 列相应单元格
Range(Cells(i, 1), Cells(i, 3)).Copy Cells(k, "j")
End If
Next
End Sub
筛选结果
例子2:简易工资条制作
参考代码:Sub vvvv()
Dim i As Long
Dim k As Long
k = 1 '行号计数
Range("j1:n100").Clear '清楚内容,方便更新数据
For i = 2 To 7 '遍历工资表
Range("a1:e1").Copy Cells(k, "j") '标题
Range(Cells(i, 1), Cells(i, 5)).Copy Cells(k + 1, "j") '复制工资数据
k = k + 3 '工资条间隔
Next
End Sub
例子3:复杂一点的高级筛选(循环嵌套)
要求:提取部门为A且销售额大于等于1500的数据+部门为C且销售额大于等于3000的数据。
参考代码:Sub bb()
Range("a1:c1").Copy Range("j1") '复制标题
k = 1 '记录行号
For x = 2 To 3 '遍历筛选条件要求的部门
'//先提取A部门符合要求的数据,再提取C部门符合要求的数据
For y = 2 To 13 '循环遍历表格数据
'Cells(x, "f") 为筛选条件的部门,Cells(x, "g")为筛选条件的销售额
If Cells(y, 1) = Cells(x, "f") And Cells(y, 3) >= Cells(x, "g") Then
k = k + 1 '计数,辅助输出数据到 j 列的单元格区域
'表格整行数据复制到 j 列相应单元格
Range(Cells(y, 1), Cells(y, 3)).Copy Cells(k, "j")
End If
Next
Next
End Sub
结果
希望大家可以愉快的入门VBA!