所谓结构化编程,包含三种基本结构,即顺序结构、分支结构、循环结构。其中顺序结构就是一条语句接着一条语句执行,而分支结构则可以根据不同的条件,执行不同的语句,循环结构则是反复多次执行同一部分语句。在VBA里,分支结构主要包括两类,下面以Excel中的VBA为例,作简单介绍:
IF 分支
下面三段代码,A1只判断一次,A2判断两次,A3判断三次。
Public Sub A1()
If Cells(2,1)>=60 Then
Cells(2,2)="及格"
End If
End Sub
Public Sub A2()
If Cells(2,1)>=60 Then
Cells(2,2)="及格"
Else '否则
Cells(1,2)="不及格"
End If
End Sub
Public Sub A3()
If Cells(2,1)>=80 Then
Cells(2,2)="优秀"
ElseIf Cells(2,1)>=60 Then
Cells(2,2)="及格"
Else
Cells(2,2)="不及格"
End If
End Sub
分支语句可以“嵌套”,比如A3可以写成下面这样,功能不变,判断是否及格的部分处于外层,判断“及格”和“优秀”的部分处于内层:
Public Sub A4()
If Cells(2,1)>=60 Then
If Cells(2,1)>=80 Then
Cells(2,2)="优秀"
Else
Cells(2,2)="及格"
End If
Else
Cells(2,2)="不及格"
End If
End Sub
以上各分支语句要判断的都是同一内容(这里是针对同一单元格进行判断),但实际上If 语句可以针对不同内容作判断,比如下面的例子,先针对Cells(2,1)单元格进行判断,如果不满足条件,再针对Cells(2,2)单元格判断:
Public Sub A5()
If Cells(2,1)>=60 Then
Cells(2,3)="及格"
ElseIf Cells(2,2)="语文" Then
Cells(2,3)="语文不及格"
Else '以上两个条件都不满足
Cells(2,3)="其它不及格"
End If
End Sub
以上可以改写为:
Public Sub A6()
If Cells(2,1)>=60 Then
Cells(2,3)="及格"
Else
If Cells(2,2)="语文" Then
Cells(2,3)="语文不及格"
Else '以上两个条件都不满足
Cells(2,3)="其它不及格"
End If
End If
End Sub
Select Case 语句
如果我们始终是针对同一内容进行判断,那么使用If语句的时候,每个分支都实际都要计算一次。比如前面的A3程序,因为用到两次Cells(2,1),所以要对其计算两次,这样遇到大规模复杂问题时效率就比较低了。我们可以采用Select Case语句提高效率,该语句只针对同一内容计算一次:
Public Sub B1()
Select Case Cells(2,1)
Case 3,4,5 '五分制,成绩为3、4、5分时执行下面的分支
Cells(2,2)="及格"
End Select
End Sub
Public Sub B2()
Select Case Cells(2,1)
Case 3,4,5
Cells(2,2)="及格"
Case Else
Cells(2,2)="不及格"
End Select
End Sub
B2可以写成下面的样子:
Public Sub B3()
Select Case Cells(2,1)
Case 3 To 5 '一定要从小到大
Cells(2,2)="及格"
Case Else
Cells(2,2)="不及格"
End Select
End Sub
以下对同一内容作多次判断:
Public Sub B4()
Select Case Cells(2,1) '无论有多少分支,只在这里计算一次Cells(2,1)
Case 5
Cells(2,2)="满分"
Case 4
Cells(2,2)="优秀"
Case 3
Cells(2,2)="合格"
Case Else
Cells(2,2)="不及格"
End Select
End Sub
Select Case分支当然也可以嵌套,而且以上两种结构还可以互相嵌套,但是在嵌套的时候要注意,无论怎样嵌套,内层和外层不能混淆。下面的语句内层和外层混在了一起,因此是错误的:
Public Sub C()
If Cells(2,1)<60 Then
Select Case Cells(2,2)
Case "语文"
Cells(2,3)="语文不及格"
End If
Case Else
Cells(2,3)="其它不及格"
End Select
'应该把End If挪到这里
End Sub
在编程时,采取适当的缩进方式,有利于发现这类错误。
发表评论