TOP
VBA-第 7.1 课。条件 (Conditions)
条件在编程中非常有用,因为它们允许我们根据设定的条件执行操作(与 IF 函数 Excel 中使用相同的原理)。
VBA If...Then...Else 语句根据指定条件是否为真执行一组语句。如果满足条件(逻辑测试),则执行一组操作。但是,如果条件为假,则执行一组替代操作。
但是,为了提高可读性,您可以使用 Select Case 语句来代替多层嵌套的 If...Then...Else 语句。
如果...那么...否则
因此,设置条件的最重要的函数是 IF,现在我们将了解它是如何工作的:
- If [此处术语] Then
-
- Else
-
- End If
If [此处术语] Then '=> IF 条件为 true THEN
'如果“true”则说明
Else '=> 否则
'如果“说谎”的指示
End If
让我们实际一点,回到我们在变量课程中使用的示例。此过程的目的是显示一个对话框,其中显示单元格 F5 中指定的字符串的值:
如果在 F5 单元格中键入字母,将会导致错误。我们想防止这种情况发生。
- Sub variables()
-
- Dim last_name As String, first_name As String, age As Integer, row_number As Integer
-
-
- row_number = Range("F5") + 1
-
- last_name = Cells(row_number, 1)
- first_name = Cells(row_number, 2)
- age = Cells(row_number, 3)
-
-
- MsgBox last_name & " " & first_name & ", " & age & "年"
- End Sub
Sub variables()
'变量声明
Dim last_name As String, first_name As String, age As Integer, row_number As Integer
'给变量赋值
row_number = Range("F5") + 1
last_name = Cells(row_number, 1)
first_name = Cells(row_number, 2)
age = Cells(row_number, 3)
'对话框
MsgBox last_name & " " & first_name & ", " & age & "年"
End Sub
让我们添加一个条件,在执行代码之前检查单元格 F5 中输入的值是否为数字。
我们将使用 IsNumeric 函数来测试条件:
- Sub variables()
-
-
- If IsNumeric(Range("F5")) Then
-
-
- Dim last_name As String, first_name As String, age As Integer, row_number As Integer
-
-
- row_number = Range("F5") + 1
-
- last_name = Cells(row_number, 1)
- first_name = Cells(row_number, 2)
- age = Cells(row_number, 3)
-
-
- MsgBox last_name & " " & first_name & ", " & age & "年"
- End If
- End Sub
Sub variables()
'如果括号中的值(单元格 F5)是数字(因此 IF CONDITION 为 TRUE),则
'执行 THEN 之后的指令
If IsNumeric(Range("F5")) Then
'变量声明
Dim last_name As String, first_name As String, age As Integer, row_number As Integer
'给变量赋值
row_number = Range("F5") + 1
last_name = Cells(row_number, 1)
first_name = Cells(row_number, 2)
age = Cells(row_number, 3)
'对话框
MsgBox last_name & " " & first_name & ", " & age & "年"
End If
End Sub
如果不满足我们设定的条件,我们还需要编写指令:
- Sub variables()
- If IsNumeric(Range("F5")) Then
-
-
- Dim last_name As String, first_name As String, age As Integer, row_number As Integer
-
-
- row_number = Range("F5") + 1
-
- last_name = Cells(row_number, 1)
- first_name = Cells(row_number, 2)
- age = Cells(row_number, 3)
-
-
- MsgBox last_name & " " & first_name & ", " & age & "年"
-
- Else
-
-
- MsgBox "输入值" & Range("F5") & "不是真的!"
-
-
- Range("F5").ClearContents
- End If
- End Sub
Sub variables()
If IsNumeric(Range("F5")) Then '如果满足条件
'变量声明
Dim last_name As String, first_name As String, age As Integer, row_number As Integer
'给变量赋值
row_number = Range("F5") + 1
last_name = Cells(row_number, 1)
first_name = Cells(row_number, 2)
age = Cells(row_number, 3)
'对话框
MsgBox last_name & " " & first_name & ", " & age & "年"
Else '如果不满足条件
'对话框:警告
MsgBox "输入值" & Range("F5") & "不是真的!"
'删除F5单元格的内容
Range("F5").ClearContents
End If
End Sub
现在非数字值不会引起任何问题。
使用包含 16 行数据的数组,下一步将检查 row_number 变量是否为:“大于或等于 2”和“小于或等于 17”。
但首先,让我们看一下比较运算符:
= |
确切地 |
<> |
不完全是 |
< |
少于 |
<= |
小于或等于 |
> |
多于 |
>= |
大于或等于 |
以及这些有用的运算符:
AND |
[条件1] AND [条件2]
必须满足两个条件 |
OR | [条件1] OR [条件2]
必须满足 2 个条件中的至少 1 个 |
NOT | NOT [条件1]
条件必须不满足 |
现在让我们在比较运算符之间添加上述 AND 条件之一:
- Sub variables()
- If IsNumeric(Range("F5")) Then
-
- Dim last_name As String, first_name As String, age As Integer, row_number As Integer
-
- row_number = Range("F5") + 1
-
- If row_number >= 2 And row_number <= 17 Then
-
- last_name = Cells(row_number, 1)
- first_name = Cells(row_number, 2)
- age = Cells(row_number, 3)
-
- MsgBox last_name & " " & first_name & ", " & age & "年"
-
- Else
- MsgBox "输入的号码" & Range("F5") & "是不正确的!"
- Range("F5").ClearContents
- End If
-
- Else
- MsgBox "输入值" & Range("F5") & "不是真的!"
- Range("F5").ClearContents
- End If
- End Sub
Sub variables()
If IsNumeric(Range("F5")) Then '如果一个数值
Dim last_name As String, first_name As String, age As Integer, row_number As Integer
row_number = Range("F5") + 1
If row_number >= 2 And row_number <= 17 Then '如果数字正确
last_name = Cells(row_number, 1)
first_name = Cells(row_number, 2)
age = Cells(row_number, 3)
MsgBox last_name & " " & first_name & ", " & age & "年"
Else '如果号码不正确
MsgBox "输入的号码" & Range("F5") & "是不正确的!"
Range("F5").ClearContents
End If
Else '如果不是数值
MsgBox "输入值" & Range("F5") & "不是真的!"
Range("F5").ClearContents
End If
End Sub
如果我们想让我们的宏更实用,我们可以用一个保存行数的变量替换 17。这将允许我们在数组中添加和删除行,而不必每次都更改此限制。
为此,我们需要创建一个变量 nb_rows 并添加此函数。
在本例中,我们将使用 WorksheetFunction.CountA 函数,该函数类似于 Excel 本身中的 COUNTA 函数。
我们希望该函数计算第一列中非空单元格的数量,并将结果值写入 nb_rows 变量:
- Sub variables()
- If IsNumeric(Range("F5")) Then
-
- Dim last_name As String, first_name As String, age As Integer, row_number As Integer
- Dim nb_rows As Integer
-
- row_number = Range("F5") + 1
- nb_rows = WorksheetFunction.CountA(Range("A:A"))
-
- If row_number >= 2 And row_number <= nb_rows Then
-
- last_name = Cells(row_number, 1)
- first_name = Cells(row_number, 2)
- age = Cells(row_number, 3)
-
- MsgBox last_name & " " & first_name & ", " & age & "年"
-
- Else
- MsgBox "输入的号码" & Range("F5") & "是不正确的!"
- Range("F5").ClearContents
- End If
-
- Else
- MsgBox "输入值" & Range("F5") & "不是真的!"
- Range("F5").ClearContents
- End If
- End Sub
Sub variables()
If IsNumeric(Range("F5")) Then '如果号码
Dim last_name As String, first_name As String, age As Integer, row_number As Integer
Dim nb_rows As Integer
row_number = Range("F5") + 1
nb_rows = WorksheetFunction.CountA(Range("A:A")) '统计行数的功能
If row_number >= 2 And row_number <= nb_rows Then '如果号码有效
last_name = Cells(row_number, 1)
first_name = Cells(row_number, 2)
age = Cells(row_number, 3)
MsgBox last_name & " " & first_name & ", " & age & "年"
Else '如果号码不正确
MsgBox "输入的号码" & Range("F5") & "是不正确的!"
Range("F5").ClearContents
End If
Else '如果不是数字
MsgBox "输入值" & Range("F5") & "不是真的!"
Range("F5").ClearContents
End If
End Sub
否则如果
ElseIf 可以在 IF 命令后添加附加条件:
- If [条件1] Then
-
- ElseIf [条件2] Then
-
- Else
-
- End If
If [条件1] Then '=> IF 条件 1 为真 THEN
'使用说明1
ElseIf [条件2] Then '=> IF 条件 1 为假,但条件 2 为真 THEN
'说明2
Else '=> 否则
'说明 3
End If
如果条件 1 为 true,则语句 1 将执行并退出 IF 语句(以 IF 开头,以 End If 结束)。如果 CONDITION 2 返回 false,则将执行语句 2,如果返回 false,则将执行语句 3(在 Else 下)。
以下是单元格 A1 中包含 1 到 6 级的示例,以及单元格 B1 中对这些等级的注释:
- Sub scores_comment()
-
- Dim note As Integer, score_comment As String
-
- note = Range("A1")
-
-
- If note = 6 Then
- score_comment = "好成绩!"
- ElseIf note = 5 Then
- score_comment = "好点子"
- ElseIf note = 4 Then
- score_comment = "满意分数"
- ElseIf note = 3 Then
- score_comment = "分数不理想"
- ElseIf note = 2 Then
- score_comment = "成绩不好"
- ElseIf note = 1 Then
- score_comment = "糟糕的成绩"
- Else
- score_comment = "零分"
- End If
-
-
- Range("B1") = score_comment
- End Sub
Sub scores_comment()
'变量
Dim note As Integer, score_comment As String
note = Range("A1")
'根据收到的分数发表评论
If note = 6 Then
score_comment = "好成绩!"
ElseIf note = 5 Then
score_comment = "好点子"
ElseIf note = 4 Then
score_comment = "满意分数"
ElseIf note = 3 Then
score_comment = "分数不理想"
ElseIf note = 2 Then
score_comment = "成绩不好"
ElseIf note = 1 Then
score_comment = "糟糕的成绩"
Else
score_comment = "零分"
End If
'在单元格 B1 中发表评论
Range("B1") = score_comment
End Sub
Select Case
有一个替代方法可以将 If 与许多 ElseIf 语句一起使用,即 Select Case 命令,它更适合这种情况。
考虑一个带有运算符 Select Case 的宏示例:
- Sub scores_comment()
-
- Dim note As Integer, score_comment As String
-
- note = Range("A1")
-
-
- Select Case note
- Case Is = 6
- score_comment = "好成绩!"
- Case Is = 5
- score_comment = "好点子"
- Case Is = 4
- score_comment = "满意分数"
- Case Is = 3
- score_comment = "分数不理想"
- Case Is = 2
- score_comment = "成绩不好"
- Case Is = 1
- score_comment = "糟糕的成绩"
- Case Else
- score_comment = "零分"
- End Select
-
-
- Range("B1") = score_comment
- End Sub
Sub scores_comment()
'变量
Dim note As Integer, score_comment As String
note = Range("A1")
'根据收到的分数发表评论
Select Case note '=> 测试成绩(分)
Case Is = 6 '=> 如果值 = 6
score_comment = "好成绩!"
Case Is = 5 '=> 如果值 = 5
score_comment = "好点子"
Case Is = 4 '=> 如果值 = 4
score_comment = "满意分数"
Case Is = 3 '=> 如果值 = 3
score_comment = "分数不理想"
Case Is = 2 '=> 如果值 = 2
score_comment = "成绩不好"
Case Is = 1 '=> 如果值 = 1
score_comment = "糟糕的成绩"
Case Else '=> 如果该值不等于以上任何一个
score_comment = "零分"
End Select
'在单元格 B1 中发表评论
Range("B1") = score_comment
End Sub
值得注意的是,我们还可以使用其他比较运算符:
Case Is >= 6 '如果值 >= 6
不同含义的例子:
- Case Is = 6, 7
- Case Is <> 6, 7
Case Is = 6, 7 '如果值 = 6 或 7
Case Is <> 6, 7 '如果该值不等于 6 或 7
Case 6 To 10 '如果值 = 6 到 10 之间的任意数字