TOP

VBA-第 7.1 课。条件 (Conditions)

条件在编程中非常有用,因为它们允许我们根据设定的条件执行操作(与 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 个
NOTNOT [条件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

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         '=> 如果值 = 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 之间的任意数字