一 理解循环
1.1 初学者看起来好理解,但不好使用
其实很多人都讲过了,代码的三种执行方式,就是顺序执行,条件分支和循环,这3种。而循环应该是对新手来说,刚入门最难使用的。对一个新手来说,比如我,循环真的是我开始学习时的第1个难点,难在哪儿?不在理解,而在使用。
使用循环的经验
- 多使用,多练习,多试错,多查错,多思考
- 重要的是试错,看看循环体放在不同位置有什么影响,用debug.print看看
1.2 具体的点
- 循环体(自变量)
- 理解循环体的自变量放的位置,影响范围完全不同,差别很大
- 如果可以分为主循环体,和其他跟随循环体的话,还要理解非循环体的其他变量放不同位置的影响
- 多层循环
- 理解1层循环,或2层和多层循环里,哪些变量需要独立,需要独立于 自变量?
- 1层循环里,多个变量,是否要独立于循环体自变量,还是用同一个?
- 多层循环里,哪些地方需要多个自变量?为什么不用同一个变量
- 循环体什么时候开始变化
- 循环block的末尾,next i
- 循环体的变量什么时候需要用独立的变量?
- 比如在一个sub中,循环体的变量和其他变量,独立开?
- 比如在不同的sub中,有没必要考虑循环体的变量和其他sub内的,独立开?
- 其他
1.3 举例:思考自变量a放在不同的循环内外的差别
- a处于循环体内,a如果不被重置,会一直在循环里累计
- a=1 放在最外层 j外循环 ,会获得 7 8 9,因为单元格被重写了3次,第3次是7,8,9
- a=1 放在内层循环 i 外 ,会获得 1 2 3,每次 j 的循环开始,a被重置为1,所以三次覆写都是1,2,3
- a=1 放在最内层循环 i 里 ,会获得 1 1 1,因为每次 i 循环开始,a都被重置为1,所以每个单元格覆写3次都是1
Sub a1_test()
For j = 1 To 3 Step 1
a = 1
For i = 1 To 3 Step 1
Range("a" & i) = a
a = a + 1
Next i
Next j
End Sub
2 循环高级功能
2.1 循环配套使用的continue 和break
- 循环里需要使用 continue 但是好像VBA里没有这样的?
- 循环需要使用的 break 但是VBA里没有,有类似的 exit for / exit do
如python里 for continue '结束本此循环,开始下次循环 break '跳出循环,直接到循环末尾下一句 next
2.2 变相实现循环内的 continue 功能
- 可以用 goto 和 label 实现 continue的作用,调整回开头
- goto 和label 标号,语句跳转
:label1
for i = 1 to 3
if i>2 then
goto label1
end if
next
另外和DOS不同的是: dos的goto语法 是 :在前面,VBA里 : 在label后,为label:
2.3 实现循环内的break 功能
- exit for (针对 for)
- exit do (针对 do while)
这样跳出循环
do whlie
exit do
loop
2.4 exit 的各种用法: 可以跳出各种过程,函数,或循环
- exit do
- exit for
- exit function
- exit sub
3 for---无条件(范围内)循环
3.1 为什么说for循环是无条件的循环?
- 无条件,没有判断
- 只有起止范围
3.2 for 循环的基础语法结构
- for
- exit for
- next
- for each a in selection
- For 循环变量=初值 to 终值 step 步长。
- for i = 1 to 10 step 1
- for i = 5 to 1 step -1
基本语法1:
for each i in range
exit for
next i
基本语法2:
for i = 10 to 1 step -1
exit for
next i
3.3 for each i in 集合
- 特点1:在集合里进行循环
- 特点2:不需要指定具体循环次数,可以说是循环次数不确定,根据 集合的元素来确定
- 基础语法
- 集合可以是 range 等对象集合,也可以是VBA里的 array dictionary
Sub t7()
Dim arr1(5)
For Each i In Range("a1:a13")
Debug.Print i
Next
arr1(0) = 1
arr1(1) = 2
arr1(2) = 3
For Each j In arr1()
Debug.Print j
Next
End Sub
3.4 for循环和 range(a1) cells(r1c1) 几种不同的形式应用
- range() 只支持 a1形式表示单元格,所以最多带1个参数
- 所以 range(1,2) 会报错,因为range不能用r1c1格式
- 但是 range(a1,c2) 不报错,因为这是引用了多个单元格
- range(a1:c2) 也不报错,因为这是引用了一个区域
- range(cells(),cells()) 所以用逗号模式,必须是 i , j分别代表单元格,而不只是1个变量
Sub a1_test()
For j = 1 To 3 Step 1
a = 1
For i = 1 To 3 Step 1
Range("a" & i, "c" & j) = a
a = a + 1
Next i
Next j
End Sub
- range() 不可以用r1c1格式
- range() 可以用逗号分隔,多个A1格式的单元格
Sub test202()
For j = 1 To 3 Step 1
a = 1
For i = 1 To 3 Step 1
Range("a" & i, "c" & j) = a
a = a + 1
Next i
Next j
'Range(e2) = 123
Range("e2") = 123
'Range("e5c7") = 12345
Range("e5, c7") = 12345
End Sub
- 或者下面这种,等很多种,注意 : 两边的引号要和: 之间有空格!!!
Sub a1_test()
For j = 1 To 3 Step 1
a = 1
For i = 1 To 3 Step 1
Range("a" & i & ":" & "c" & j) = a
a = a + 1
Next i
Next j
End Sub
- cells 没有a1引用模式
- cells 可以用 r1c1形式引用,所以可以2个都是参数
- 理解,为什么两层循环不用2个一样的循环变量i ?
Sub a1_test()
For j = 1 To 3 Step 1
a = 1
For i = 1 To 3 Step 1
Cells(i, j) = a
a = a + 1
Next i
Next j
End Sub
3.5 无条件循环 for循环,一般会和if 等组合使用,弥补缺少判断条件的问题
- 同时也会需要 exit for等语句
4 有条件循环
do (while/until) ... loop (while/until)
- 基础语法
- do while/ until 一定是接在了 do 或者while 后面,不能单独成行!!!
- loop
- do while 语句 可以有2种先后模式,先 判断while再do 或反过来
- 语法结构1:先循环后 do
- do while
- loop
- 语法结构2:先 do 后循环
- do
- loop whlie 或者 loop until
- 记住 while / until 一定是接在了 do 或者while 后面,不能单独成行!!!
Sub t7()
i = 10
Do
i = i - 1
Debug.Print i
Loop While i > 0
End Sub
Sub t8()
i = 99
Do
i = i + 1
Debug.Print i
Loop Until i >= 110
End Sub
- do while while条件满足,就继续循环
- do until until 条件满足,就不再继续循环,停止循环
- 语法结构
- do
- whlie/until
- loop
Sub t7()
i = 10
Do While i > 0
i = i - 1
Debug.Print i
Loop
End Sub
Sub t8()
i = 10
Do Until i <= 0
i = i - 1
Debug.Print i
Loop
End Sub
5 有条件循环
while ... wend
- 基本语法
- while
- wend
Sub t7()
i = 15
While i > 0
i = i - 1
Debug.Print i
Wend
End Sub
参考和继续
http://www.cnblogs.com/wuzhiblog/p/vba_four.html