学习VBA
之  循环语句
循环语句,顾名思义,就是让某一段语句反复运行,直到满足了某个条件时,才终止这段语句的运行,循环语句是各种编程语言中不可或缺的语句,它不但能简化程序语言,有时不用循环语句,就无法完成某些工作。在编程语言的编写过程中,它和判断语句一样重要,只有懂得了它的精髓,我们才能让计算机像我们的佣人一样为我们服务,我觉得驾驭计算机,其实是一种乐趣。
一.DO….LOOP循环语句
1. do …… loop 循环语句
  格式:do
        <执行语句>
        [执行语句]
        ……
        <if 逻辑表达式 then Exit do >
        Loop
例:dim a%
    Do
    A=a+1
    If a>10 then exit do
    Loop
    Msgbox “现在变量a的值是:” & a
在这个例子里,dim语句和msgbox语句不是循环语句里的,dim语句是定义了一个变量a,msgbox是在循环完成后,弹出个窗口显示循环完成后a的值。
Do 是循环的开头,loop 是循环的结尾,do 和 loop 之间是需要执行的循环语句,中间的if判断语句为当条件为真时,退出循环。在这种循环语句中,循环之初do并不给退出循环的条件,所以循环中间的通过判断语句退出循环必不可少,缺少了判断语句,那就是一个失败的循环,即死循环。在这个循环之中的判断语句,并不一定固定是if…end if这种,它可以是那六种判断语句里的任何一种,但必须得有可行的条件,如果条件不可能实现,就算有判断语句也只能算是失败的循环。如在这个例子中的条件为a<0,就不行。
在这个循环一开始,我并没有对变量a进行赋值,它在未赋值的情况下,默认值是0。第一次循环,a=a+1,运行这句后变量a的值就变成了1,然后执行判断语句,这时a的值不符合条件a>10,执行到loop后,程序会自动将运行顺序调到do处,接着执行do下面的语句,直到a的值为11时,条件a>10为真,才会退出循环。
有时我们执行循环后,需要得到变量的值,执行语句的顺序不一样,得到的值就不一样,同样是这个例子中
    Do
    A=a+1
    If a>10 then exit do
    Loop
    Do
    If a>10 then exit do
    A=a+1
    Loop
循环结束后,变量a的值是不一样的,想一想 为什么?
现在你也许会问,这样的程序有什么用呢?现在我来举个实用的例子:假设现在已打开一个工作簿,当前活动区域为工作表1,内容如下图
A
B
C
1
姓名
成绩
2
A1
90
3
A2
54
4
A3
66
5
A4
87
6
A5
98
我们要将B列成绩为81-90的,在相对应的C列写上”良”,实例如下:
Sub aa()
  Dim a%
  A=1
  Do
    A=a+1
    If a > 6 then
      Exit do
    Else
      If cells(a,2) >80 and cells(a,2) <= 90 then cells(a,3)=”良”
  End if
  Loop
  End sub
建一个上面的工作表,运行以上代码,分析每一句运行的作用及含义,自己换一种条件再试,直到理解代码的含义为止。
2. DO WHILE …..LOOP循环语句
  格式:do while <逻辑表达式>
        <执行语句>
        [执行语句]
        ……
        Loop
这个循环语句比上面的那个循环语句多了个逻辑表达式,这个逻辑表达式的值就是退出循环
的判断,当这个逻辑表达式的值为真时循环,为假时就退出循环。用这个循环语句就可以省去上面那个循环语句中的退出循环判断语句,达到简化程序的作用。
这个循环语句只是比上面的那个循环多了个WHILE<逻辑表达式>,运行的原理还是和上面的循环语句一样的,同样是DO是循环的开头,每循环一次都从DO下面的语句开始,最后以LOOP结束,直到退出循环。
同样是上面的工作表,我们用这个DO WHILE…..LOOP语句再做一次:
A
B
C
1
姓名
成绩
2
A1
90
3
A2
54
4
A3
66
5
A4
87
6
A5
98
我们要将B列成绩为81-90的,在相对应的C列写上”良”,实例如下:
  Sub aa()
    Dim a%
    A=2
    Do while cells(a,2) <>””
      If cells(a,2) > 80 and cells(a,2) <= 90 then cells(a,3) =”良”
      A=a+1
    Loop
  End sub
这样写是不是要比上面的那种循环要简化一些?
3. DO UNTIL…..LOOP循环语句
  格式:do until <逻辑表达式>
          <执行语句>
          [执行语句]
          ……
        Loop
这个循环语句和第二个循环语句的用法是一样的,只不过第二个循环语句的逻辑表达式为真时执行循环里的执行语句,而这个刚好相反,当这个语句的逻辑表达式的值为真时,退出循环。怎么样?是不是觉得很神奇,或者也可以说是无聊。不过存在就有意义,有时就会有用到它的时候,只不过你还没有发现。
  如果用这个循环语句再做一次上面的作业,其实就是把逻辑表达式的运算符换一下而已:
  Sub aa()
    Dim a%
    A=2
    Do until cells(a,2) = ””
      If cells(a,2) > 80 and cells(a,2) <= 90 then cells(a,3) =”良”
      A=a+1
    Loop
  End sub
趣味小例-隔行填
  Sub aa()
      Dim a%
      A=2
      Do until sheet1.range(“a” & a) = “”
        Range.range(“a” & a & ”:g” & a).lorindex=7
      A=a+1
      Loop
      End sub
        这段程序里,interior为这个单元格的底,color是颜的意思,index为设置成,7是颜的代码,这里7是紫,这段意思是将选定的区域底设置成紫。
小结:以上三种循环语句,称为DO….LOOP循环语句,实事上,VBA的编写具有很大的灵活性,如第二种循环里的while<逻辑表达式>和第三种循环语句里的until<逻辑表达式>,不仅可以放在DO的后面,它还可以放在LOOP的后面。例:
Sub aa()
Dim a$
Do
    A = inputbox(“请输入密码:”)
Loop until a=”123”
End sub
上面这段代码运行后,会弹出一个可输入数据的对话框,你只有在对话框里输入了”123”(引号不用输入),才会退出循环,那么until放在DO后和放在LOOP有什么区别呢?它的区别在于放在LOOP后的循环次次要比放在DO后少循环一次。这里如果把until换成while会怎么样呢?意思刚好相反,只有输入”123”才循环,输入错误就退出循环。
如果在运行后,而你忘了或不知道密码是多少,这又会成了死循环,我们还可以限制一下次数:
Sub aa()
Dim a$ b!
Do
B=b+1
If b > 3 then exit do
    A = inputbox(“请输入密码(最多输入三次):”)
Loop until a=”123”
End sub
从上面这些就可以看出,其实上面三种循环语句其实可以统称为DO…..LOOP循环语句,它的完整格式是这样的:
Do [{while | until}<逻辑表达式>]
<执行语句>
[执行语句]
[exit do ]
[执行语句]
Loop
或者:
Do<执行语句>
[执行语句]
[exit do ]
[执行语句]
Loop [{while | until}<逻辑表达式>]
do while语句怎么用注:1.用while时,逻辑表达式为真就循环,用until时,逻辑表达式为真时退出循环。
    2.while或until即可以放在DO的后面,也可以放在LOOP的后面,区别在于放在DO的后面是先判断再循环,而放在LOOP的后面是先循环再判断。
    3. DO….LOOP通常和判断语句 + EXIT DO结合使用,在一个循环里面还可以放置多个判断语句 + EXIT DO以便能随时退出循环。
    4.exit do的意思是退出循环。但它只能退出所在循环内的循环,在以后还会用到多层循环套用,在那种情况下,如果执行到exit do,程序只能退出它所在的循环,再次进入到离它最近的外循环里去。
    5.如果出现死循环,可以按ctrl+break组合键来结束运行。
二.FOR…..NEXT循环语句
1.For each…….next循环语句
  格式:for each <对象> in <集合>
        <执行语句>
        [执行语句]
        …..
        Next
    这个循环语句,同样需要有条件才能退出,但却没有用到逻辑表达式,在这个循环语句里的循环条件就是<集合>里的所有<对象>,从第一个对象开始,循环一遍后再指向下一个对象,直到最后个对象执行完成后,退出循环。例:
A
B
C
1
姓名
成绩
2
A1
90
3
A2
54
4
A1
66
5
A1
87
6
A5
98
上面这个表格假定为我们当前打开的工作簿的工作表1,我们要让姓名为A1的单元格变成红,代码如下:
Sub aa()
Dim a as range
For each a in sheet1.range(“a2:a6”)
  If a = “A1” then lorindex = 3
Next
End sub
在这个程序里,我来逐句解释一下
1.首先我们定义了一个对象a,range是对象型数据,不同于以前的数据类型,在这里也可以把它理解为把变量a定义成一个单元格型数据。
2.在第二句里,a就是这个语句里的<对象>,sheet1.range(“a2:a6”)是一个集合,在这里它代表一个区域,就是指从A1到A6的这块单元格区域,循环的条件就是从A列的第一个单元格到
A列的第六个单元格。这里也可以理解为在从A1到A6这个区域里取出每个单元格,直到取完为止,也就是说这个区域里有多少个单元格就循环多少次。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。