TOP

VBA-第 7.1 课。条件 (Conditions)

条件在编程中非常有用,因为它们允许我们根据设定的条件执行操作(与 IF 函数 Excel 中使用相同的原理)。

VBA If...Then...Else 语句根据指定条件是否为真执行一组语句。如果满足条件(逻辑测试),则执行一组操作。但是,如果条件为假,则执行一组替代操作。

但是,为了提高可读性,您可以使用 Select Case 语句来代替多层嵌套的 If...Then...Else 语句。


如果...那么...否则

因此,设置条件的最重要的函数是 IF,现在我们将了解它是如何工作的:

  1. If [此处术语] Then '=> IF 条件为 true THEN  
  2.    '如果“true”则说明  
  3. Else '=> 否则  
  4.    '如果“说谎”的指示  
  5. End If  

让我们实际一点,回到我们在变量课程中使用的示例。此过程的目的是显示一个对话框,其中显示单元格 F5 中指定的字符串的值:

如果在 F5 单元格中键入字母,将会导致错误。我们想防止这种情况发生。

  1. Sub variables()  
  2.    '变量声明  
  3.    Dim last_name As String, first_name As String, age As Integer, row_number As Integer  
  4.          
  5.    '给变量赋值  
  6.    row_number = Range("F5") + 1  
  7.      
  8.    last_name  = Cells(row_number, 1)  
  9.    first_name = Cells(row_number, 2)  
  10.    age        = Cells(row_number, 3)  
  11.      
  12.    '对话框  
  13.    MsgBox last_name & " " & first_name & ", " & age & "年"  
  14. End Sub  

让我们添加一个条件,在执行代码之前检查单元格 F5 中输入的值是否为数字。

我们将使用 IsNumeric 函数来测试条件:

  1. Sub variables()  
  2.   '如果括号中的值(单元格 F5)是数字(因此 IF CONDITION 为 TRUE),则  
  3.   '执行 THEN 之后的指令  
  4.    If IsNumeric(Range("F5")) Then  
  5.      
  6.        '变量声明  
  7.        Dim last_name As String, first_name As String, age As Integer, row_number As Integer  
  8.          
  9.        '给变量赋值  
  10.        row_number = Range("F5") + 1  
  11.          
  12.        last_name  = Cells(row_number, 1)  
  13.        first_name = Cells(row_number, 2)  
  14.        age        = Cells(row_number, 3)  
  15.          
  16.        '对话框  
  17.        MsgBox last_name & " " & first_name & ", " & age & "年"  
  18.     End If  
  19. End Sub  

如果不满足我们设定的条件,我们还需要编写指令:

  1. Sub variables()  
  2.     If IsNumeric(Range("F5")) Then '如果满足条件  
  3.      
  4.        '变量声明  
  5.        Dim last_name As String, first_name As String, age As Integer, row_number As Integer  
  6.          
  7.        '给变量赋值  
  8.        row_number = Range("F5") + 1  
  9.          
  10.        last_name  = Cells(row_number, 1)  
  11.        first_name = Cells(row_number, 2)  
  12.        age        = Cells(row_number, 3)  
  13.          
  14.        '对话框  
  15.        MsgBox last_name & " " & first_name & ", " & age & "年"  
  16.          
  17.     Else '如果不满足条件  
  18.      
  19.        '对话框:警告  
  20.        MsgBox "输入值" & Range("F5") & "不是真的!"  
  21.          
  22.        '删除F5单元格的内容  
  23.        Range("F5").ClearContents  
  24.     End If  
  25. End Sub  

现在非数字值不会引起任何问题。

使用包含 16 行数据的数组,下一步将检查 row_number 变量是否为:“大于或等于 2”和“小于或等于 17”。

但首先,让我们看一下比较运算符:

= 确切地
<> 不完全是
< 少于
<= 小于或等于
> 多于
>= 大于或等于

以及这些有用的运算符:

AND [条件1] AND [条件2] 必须满足两个条件
OR[条件1] OR [条件2] 必须满足 2 个条件中的至少 1 个
NOTNOT [条件1] 条件必须不满足

现在让我们在比较运算符之间添加上述 AND 条件之一:

  1. Sub variables()  
  2.     If IsNumeric(Range("F5")) Then '如果一个数值  
  3.       
  4.         Dim last_name As String, first_name As String, age As Integer, row_number As Integer  
  5.           
  6.         row_number = Range("F5") + 1  
  7.   
  8.         If row_number >= 2 And row_number <= 17 Then '如果数字正确  
  9.           
  10.             last_name  = Cells(row_number, 1)  
  11.             first_name = Cells(row_number, 2)  
  12.             age        = Cells(row_number, 3)  
  13.               
  14.             MsgBox last_name & " " & first_name & ", " & age & "年"  
  15.               
  16.         Else '如果号码不正确  
  17.             MsgBox "输入的号码" & Range("F5") & "是不正确的!"  
  18.             Range("F5").ClearContents  
  19.         End If  
  20.          
  21.     Else '如果不是数值  
  22.         MsgBox "输入值" & Range("F5") & "不是真的!"  
  23.         Range("F5").ClearContents  
  24.     End If  
  25. End Sub  

如果我们想让我们的宏更实用,我们可以用一个保存行数的变量替换 17。这将允许我们在数组中添加和删除行,而不必每次都更改此限制。

为此,我们需要创建一个变量 nb_rows 并添加此函数。

在本例中,我们将使用 WorksheetFunction.CountA 函数,该函数类似于 Excel 本身中的 COUNTA 函数。

我们希望该函数计算第一列中非空单元格的数量,并将结果值写入 nb_rows 变量:

  1. Sub variables()  
  2.     If IsNumeric(Range("F5")) Then '如果号码  
  3.       
  4.         Dim last_name As String, first_name As String, age As Integer, row_number As Integer  
  5.         Dim nb_rows As Integer  
  6.          
  7.         row_number = Range("F5") + 1  
  8.         nb_rows    = WorksheetFunction.CountA(Range("A:A")) '统计行数的功能  
  9.          
  10.         If row_number >= 2 And row_number <= nb_rows Then '如果号码有效  
  11.           
  12.             last_name  = Cells(row_number, 1)  
  13.             first_name = Cells(row_number, 2)  
  14.             age        = Cells(row_number, 3)  
  15.               
  16.             MsgBox last_name & " " & first_name & ", " & age & "年"  
  17.               
  18.         Else '如果号码不正确  
  19.             MsgBox "输入的号码" & Range("F5") & "是不正确的!"  
  20.             Range("F5").ClearContents  
  21.         End If  
  22.   
  23.     Else '如果不是数字  
  24.         MsgBox "输入值" & Range("F5") & "不是真的!"  
  25.         Range("F5").ClearContents  
  26.     End If  
  27. End Sub  

否则如果

ElseIf 可以在 IF 命令后添加附加条件:

  1. If [条件1] Then '=> IF 条件 1 为真 THEN  
  2.    '使用说明1  
  3. ElseIf [条件2] Then '=> IF 条件 1 为假,但条件 2 为真 THEN  
  4.    '说明2  
  5. Else '=> 否则  
  6.    '说明 3  
  7. End If  

如果条件 1 为 true,则语句 1 将执行并退出 IF 语句(以 IF 开头,以 End If 结束)。如果 CONDITION 2 返回 false,则将执行语句 2,如果返回 false,则将执行语句 3(在 Else 下)。

以下是单元格 A1 中包含 1 到 6 级的示例,以及单元格 B1 中对这些等级的注释:

  1. Sub scores_comment()  
  2.     '变量  
  3.     Dim note As Integer, score_comment As String  
  4.       
  5.     note = Range("A1")  
  6.      
  7.     '根据收到的分数发表评论  
  8.     If note = 6 Then  
  9.         score_comment = "好成绩!"  
  10.     ElseIf note = 5 Then  
  11.         score_comment = "好点子"  
  12.     ElseIf note = 4 Then  
  13.         score_comment = "满意分数"  
  14.     ElseIf note = 3 Then  
  15.         score_comment = "分数不理想"  
  16.     ElseIf note = 2 Then  
  17.         score_comment = "成绩不好"  
  18.     ElseIf note = 1 Then  
  19.         score_comment = "糟糕的成绩"  
  20.     Else  
  21.         score_comment = "零分"  
  22.     End If  
  23.      
  24.     '在单元格 B1 中发表评论  
  25.     Range("B1") = score_comment  
  26. End Sub  

Select Case

有一个替代方法可以将 If 与许多 ElseIf 语句一起使用,即 Select Case 命令,它更适合这种情况。

考虑一个带有运算符 Select Case 的宏示例:

  1. Sub scores_comment()  
  2.     '变量  
  3.     Dim note As Integer, score_comment As String  
  4.       
  5.     note = Range("A1")  
  6.      
  7.     '根据收到的分数发表评论  
  8.     Select Case note    '=> 测试成绩(分)  
  9.         Case Is = 6         '=> 如果值 = 6  
  10.            score_comment = "好成绩!"  
  11.         Case Is = 5         '=> 如果值 = 5  
  12.            score_comment = "好点子"  
  13.         Case Is = 4         '=> 如果值 = 4  
  14.            score_comment = "满意分数"  
  15.         Case Is = 3         '=> 如果值 = 3  
  16.            score_comment = "分数不理想"  
  17.         Case Is = 2         '=> 如果值 = 2  
  18.            score_comment = "成绩不好"  
  19.         Case Is = 1         '=> 如果值 = 1  
  20.            score_comment = "糟糕的成绩"  
  21.         Case Else           '=> 如果该值不等于以上任何一个  
  22.            score_comment = "零分"  
  23.     End Select  
  24.      
  25.     '在单元格 B1 中发表评论  
  26.     Range("B1") = score_comment  
  27. End Sub  

值得注意的是,我们还可以使用其他比较运算符:

  1. Case Is >= 6         '如果值 >= 6  

不同含义的例子:

  1. Case Is = 6, 7       '如果值 = 6 或 7  
  2. Case Is <> 6, 7      '如果该值不等于 6 或 7  
  1. Case 6 To 10         '如果值 = 6 到 10 之间的任意数字