大部分编程语言都具备基本的三种程序运行结构,分别是 顺序结构、 判断结构、 循环结构。 各种简单到复杂的算法,都是由这三种基本的结构,相互组合而完成。
顺序结构:我们以下面的Excel表为例,在B2单元格录入成绩:45,B3单元格录入成绩99等等。
sub 录入成绩的过程代码如下:
Sub 录入() Range("b2") = 45 Range("b3") = 99 End Sub |
同理如果要输入其他单元格的成绩,对应的代码如下: Sub 录入() Range("b2") = 45 Range("b3") = 99 Range("b4") = 50 Range("b5") = 63 Range("b6") = 78 Range("b7") = 71 Range("b8") = 91 Range("b9") = 69 Range("b10") = 47 End Sub
所谓的VBA顺序结构,就是从上到下,从左到右的顺序进行代码的运行。
判断结构如果现在需要对成绩进行判断,比如要对B2单元格的成绩进行及格的判断,大于等于60时,显示及格,否则显示不及格。
Sub 判断结构() If Range("b2") >= 60 Then Range("c2") = "及格" Else Range("c2") = "不及格" End If End Sub |
上面的第1个条件真是,执行Then后面的语句,如果不为真是,执行else语句,if和end if是成对出现。
这个例子是2个条件,如果是大于2个判断,应该如何写代码呢?
比如B3单元格的成绩,我们要求大于80分时,显示优秀,大于等于60时,显示及格,其他的显示不及格。
这就变成了3种状态,就需要配合elseif使用。
Sub 判断结构2() If Range("b3") >= 80 Then Range("c3") = "优秀" ElseIf Range("b3") >= 60 Then Range("c3") = "及格" Else Range("c3") = "不及格" End If end sub |
总结: if和end if成对出现,第1个条件执行if。。。then后的内容,第二个条件执行else。。。then后的内容,最后一个条件执行else后面的内容 对于Then这个词感觉就是一个鸡肋,不明白为什么非要加一个then。
循环结构。
VBA 中循环结构有 3 种类型,它们是:
- For 循环(For … Next 循环【数值循环】、For Each 循环【文本循环】)
- Do While 循环(Do While … Loop 循环【先判断,成立后循环】、Do … Loop While 循环【先执行一次后再进行判断成功后再循环】)
- Do Until 循环(Do Until … Loop 循环、Do … Loop Until 循环)
For [变量] = [初始值] To [结束值] Step [步长] '这里是循环执行的语句 Next |
[变量] 是一个数字类型变量,可在循环执行的语句里使用。
[初始值] 和 [结束值] 是给定的值;
[步长] 是每次循环时,变量的增量。如果为正值,变量增大;如果为负值,变量减小。
以一个小循环为例,i指定类型为整数,从1至10,每次增加1.实现1至10的累加。
Sub MyCode() Dim i As Integer Dim sum As Integer For i = 1 To 10 Step 1 sum = sum + i Next End Sub |
那我们以最开始的成绩为例,要对B列的所有成绩进行判断,填写至C列。
代码应该如何书写,先简单分析一下,第2行到第10行,第2列为判断的值,第3列为要填写的值,所以我们使用对象cells,
Sub 循环() For i = 2 To 10 Step 1 If Cells(i, 2) >= 60 Then Cells(i, 3) = "及格" Else Cells(i, 3) = "不及格" End If Next End Sub |
For Each [元素] In [元素集合] '循环执行的代码 Next [元素] |
下面来看一段实例代码,比如水果是一组数据,然后遍历打印在窗口中显示出来。
Private Sub Constant_demo_Click() 'fruits is an array fruits = Array("苹果", "橙子", "樱桃") 'Dim fruitnames As Variant
'iterating using For each loop. For Each a In fruits fruitnames = fruitnames & a & Chr(10) Next
MsgBox fruitnames End Sub |
同样的,如果要使用上面的例子,要求使用for each循环,代码如下:
Sub 循环2123() bc = Array(2, 3, 4, 5, 6, 7, 8, 9, 10) For Each abb In bc If Cells(abb, 2) >= 60 Then Cells(abb, 3) = "及格" Else Cells(abb, 3) = "不及格" End If Next End Sub |
先把一个序列定义为一个数组,再进行循环就可以了
Exit For 语句用于跳出循环过程,一般在提前结束循环时使用,均适用于 For Next 循环和 For Each 循环。
Do While … Loop 循环Do While … Loop 循环,根据 While 关键词后的条件表达式的值,真时执行,假时停止执行。基本语法如下:
Do While [条件表达式] '循环执行的代码 Loop |
其中,只要 [条件表达式] 为真,将一直循环执行。[条件表达式] 一旦为假,则停止循环,程序执行 Loop 关键词后的代码。
Do … Loop While 循环
与上一种 Do 循环不同的是,Do ... Loop While 循环至少循环执行代码一次后,再判断条件表达式的值。基本语法如下:
Do '循环执行的代码 Loop While [条件表达式] |
Exit Do 语句用于跳出 Do While 循环。
Do Until 循环
Do Until 循环与 Do While 循环类似。不同点在于,Do While 在条件表达式为真时,继续执行循环;而 Do Until 在条件表达式为真时,停止执行循环。
Do Until … Loop 循环
循环开始前判断 Until 后条件表达式的值,如果是真,停止循环;如果是假,继续执行循环。基本语法如下:
Do Until[条件表达式] '循环执行的代码 Loop |
Do … Loop Until 循环
先运行一次,再判断 Until 后条件表达式的值,如果是真,停止循环;如果是假,继续执行循环。基本语法如下:
Do '循环执行的代码 Loop Until [条件表达式] |
|