【原创】VBA学习笔记(10)新手学习VBA的循环

一 理解循环

1.1 初学者看起来好理解,但不好使用

其实很多人都讲过了,代码的三种执行方式,就是顺序执行,条件分支和循环,这3种。而循环应该是对新手来说,刚入门最难使用的。对一个新手来说,比如我,循环真的是我开始学习时的第1个难点,难在哪儿?不在理解,而在使用。

使用循环的经验

  • 多使用,多练习,多试错,多查错,多思考
  • 重要的是试错,看看循环体放在不同位置有什么影响,用debug.print看看

 

1.2 具体的点

  • 循环体(自变量)
  1. 理解循环体的自变量放的位置,影响范围完全不同,差别很大
  2. 如果可以分为主循环体,和其他跟随循环体的话,还要理解非循环体的其他变量放不同位置的影响
  • 多层循环
  1. 理解1层循环,或2层和多层循环里,哪些变量需要独立,需要独立于 自变量?
  2. 1层循环里,多个变量,是否要独立于循环体自变量,还是用同一个?
  3. 多层循环里,哪些地方需要多个自变量?为什么不用同一个变量
  • 循环体什么时候开始变化
  1. 循环block的末尾,next i
  • 循环体的变量什么时候需要用独立的变量?
  1. 比如在一个sub中,循环体的变量和其他变量,独立开?
  2. 比如在不同的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


 

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值