条件在编程中非常有用,因为它们允许我们根据设定的条件执行操作(与 IF 函数 Excel 中使用相同的原理)。
VBA If...Then...Else 语句根据指定条件是否为真执行一组语句。如果满足条件(逻辑测试),则执行一组操作。但是,如果条件为假,则执行一组替代操作。
但是,为了提高可读性,您可以使用 Select Case 语句来代替多层嵌套的 If...Then...Else 语句。
因此,设置条件的最重要的函数是 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
让我们添加一个条件,在执行代码之前检查单元格 F5 中输入的值是否为数字。
我们将使用 IsNumeric 函数来测试条件:
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") & "不是真的!" '删除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
如果我们想让我们的宏更实用,我们可以用一个保存行数的变量替换 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
ElseIf 可以在 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 '在单元格 B1 中发表评论 Range("B1") = score_comment End Sub
有一个替代方法可以将 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 '=> 如果值 = 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 '如果值 = 6 或 7 Case Is <> 6, 7 '如果该值不等于 6 或 7
Case 6 To 10 '如果值 = 6 到 10 之间的任意数字