VBA 程序选择结构

VBA 程序执行三大结构中,选择结构(判断)用于选择性地执行代码。选择结构与 Excel 的 IF 函数类似,也是以 IF 为关键词,按照判断条件的真假,执行不同的操作。但是 VBA 中的 IF比 Excel 中的 IF 函数更强大。

今天的文章,我们将学习 VBA 中选择结构的基本语法,并且结合实际的例子,介绍多种选择结构的形式。通过今天的学习,你将学会以下几种选择结构的语法和使用方式:

  • If … Then 结构
  • If … Else 结构
  • If ElseIf Else 结构
  • Select Case 结构

选择结构基础

选择结构,根据提供的条件表达式的值,如果为真(True),则执行选择结构的主体代码,否则跳过。

选择结构的核心是判断条件表达式的真假,这一步理解了,也就理解了选择结构的多种形式。

选择结构的基本执行方式如下:

选择结构执行方式

 

示例数据

本篇我们使用一个班级的考试成绩作为示例数据。代码中如何与 Excel 中的数据交互,不需要看懂,这部分在 Excel 对象模型中详细介绍。

 

If Then 结构

选择结构中,If Then 结构是最基础的一个。它只有条件表达式真时,执行的代码。

If Then结构基本语法如下,其中 End If是选择结构的结束标志。

If 条件表达式 Then
    '表达式为真时,执行的代码
End If

现在我们看实际的例子,判断学生是否及格,及格条件是成绩 ≥60。如果及格,在C列对应单元格填写“及格”。具体代码如下:

Sub MyCode()

    Dim i As Integer
    
    For i = 2 To 10
    
        If Cells(i, "B").Value >= 60 Then
            Cells(i, "C") = "及格"
        End If
        
    Next i

End Sub

我们可以看到,我们使用 B 列中的学生成绩与 60 分比较,如果≥60分,就在 C 列填写及格。

条件表达式是 Cells(i, "B").Value >= 60,选择性执行的代码部分是 Cells(i, "C") = "及格"

其中,For 语句是表示循环结构,这里只需知道程序从第一个学生循环到最后一个学生,依次判断每个学生的成绩。循环结构将在下一篇中做详细介绍。

将以上代码运行后,可以看到运行结果如下:

If Then 结构

 

If Else 结构

很多时候,我们根据表达式的真假,真时执行一块代码,假时执行另一块代码。这种需求可以使用 If Else结构实现。

If Else结构中,条件表达式在真时,执行Then后的代码;条件表达式为假时,执行 Else后的代码。基本语法如下:

If 条件表达式 Then
    '真时执行的代码
Else
    '假时执行的代码
End If

我们继续看实际的例子。在上一个例子的基础上,这次对不及格的学生,在C列填入不及格。代码如下:

Sub MyCode()

    Dim i As Integer
    
    For i = 2 To 10
    
        If Cells(i, "B").Value >= 60 Then
            Cells(i, "C") = "及格"
        Else
            Cells(i, "C") = "不及格"
        End If
        
    Next i

End Sub

在这个例子中,条件表达式 Cells(i, "B").Value >= 60为假时,表示学生成绩低于60分,即不及格。这时就执行 Else后的代码。

程序运行结果如下:

If Else 结构

 

If ElseIf Else 结构

前面两种结构中,最多有两种选择,即 ≥ 60 和 < 60。有时针对同一个变量,可能存在多种判断标准。例如,对及格的学生,继续评级及格、良和优。

选择结构中,可以使用 If ElseIf Else结构,对同一个变量进行多次判断,并且为每一个判断结果编写不同的代码块,达到执行式 n 选 1 的效果。

If ElseIf Else结构的基本语法如下:

If 条件表达式1 Then
    '表达式1真时,执行的代码
ElseIf 条件表达式2 Then
    '表达式2真时,执行的代码
ElseIf 条件表达式3 Then
    '表达式3真时,执行的代码
    ...
ElseIf 条件表达式n Then
    '表达式n真时,执行的代码
Else
    '以上表达式都不为真时,执行的代码
End If

这种选择结构需要注意的是:

  • 条件表达式是从第一个开始判断。
  • 判断过程中,只要有一个表达式结果为真,那么执行对应的代码块,然后退出选择结构,不再继续判断剩下的表达式。
  • 当所有的表达式都不为真时,执行 Else后的代码块。

根据以上规律,我们写一下判断学生成绩评级的代码。思路是,拿学生成绩,分别于85、75、60分比较,在 D 列填写对应的评级。

Sub MyCode()

    Dim i As Integer
    
    For i = 2 To 10
    
        If Cells(i, "B").Value >= 85 Then
            Cells(i, "D") = "优"
        ElseIf Cells(i, "B").Value >= 75 Then
            Cells(i, "D") = "良"
        ElseIf Cells(i, "B").Value >= 60 Then
            Cells(i, "D") = "及格"
        Else
            Cells(i, "D") = "不及格"
        End If
        
    Next i

End Sub

代码运行结果如下:

If ElseIf Else 结构

 

Select Case 结构

Select Case结构是对同一个变量进行多次判断的另一种方式。相对于If ElseIf Else结构,它把条件表达式中的变量提取出来,使得代码结构更简洁,也更易于阅读。

Select Case结构的基本语法如下:

Select Case 变量
	Case 判断条件 1
    	'条件 1 真时,执行的代码
	Case 判断条件 2
    	'条件 2 真时,执行的代码
	Case 判断条件 3
    	'条件 3 真时,执行的代码
    Case Else
    	'之前的所有条件都不为真时,执行的代码
End Select

可以看到,Select Case结构把 If结构中的条件表达式拆分了,即把变量和判断条件分开了。

我们看前一个例子,使用Select Case结构,代码如下:

Sub MyCode()

    Dim i As Integer
    
    For i = 2 To 10
    
        Select Case Cells(i, "B").Value
            Case Is >= 85
                Cells(i, "D") = "优"
            Case Is >= 75
                Cells(i, "D") = "良"
            Case Is >= 60
                Cells(i, "D") = "及格"
            Case Else
                Cells(i, "D") = "不及格"
        End Select
        
    Next i

End Sub

这一例子中,学生成绩是变量,即 Cells(i, "B").Value,判断条件是每个 Case 语句后的条件。

代码运行结构如下:

Select Case 结构

 

总结

以上就是选择结构的基本用法,以及 4 种选择结构。选择结构的核心是判断条件表达式的真假,从另一个角度看,核心是如何写条件表达式。这一步写好了,下一步就是根据判断结果执行不同的代码块。

转载注明:文章转载自「懒人Excel - www.lanrenexcel.com
本文链接:VBA 程序选择结构
订阅评论
提醒
39 评论
最新
最旧 最多投票
内联反馈
查看所有评论
小熊踩背
11 月 前

用vba执行命令后,回到excel表格是没有办法撤销刚才执行的程序的是吗?如果我误执行了代码想要撤销怎么办呢?按ctrl+z也没有效果,有其他的办法吗?

最后由小熊踩背编辑于11 月 前
oyc
1 年 前

D = Cells(i, c2).Value /2
  H = Cells(i, c3).Value
If Cells(i, c).Value = “圆管” Then
  V = (WorksheetFunction.Acos((D – H) / D) * D * D – VBA.Sqr(D * D – (D – H) * (D – H)) * (D – H)) * L
End If
求教第一行除以2会报错,是什么原因?

777
1 年 前

求教大神,为什么代码第十行Else处报错,要如何解决呢,感谢!~
Sub DBC()
Dim i As Integer
For i = 3 To 531
  If Cells(i, “M”).Value = BEV Then
   Cells(i, “W”) = “100%”
  ElseIf Cells(i, “Q”) > Cells(i, “U”) Then
   Cells(i, “W”) = “100%”
  ElseIf Cells(i, “T”) = 0& & Cells(i, “Q”) <> 0 Then
   Cells(i, “W”) = Cells(i, “Q”) / 31
  Else: Cells(i, “W”) = Cells(i, “Q”) / Cells(i, “U”)
  End If
Next i
End Sub

506
1 年 前

版主好,为什么Cells(i, “D”) = “不及格”后面不加.value就可以直接把字符写入单元格,数值也可以这样直接写入单元格吗?谢谢

123
2 年 前

求教大神,这是我写的,一运行就只能显示及格或者不及格,没有良好什么的
Sub selectcase()
Dim a As Integer
For a = 2 To 10
Select Case Cells(a, 2)

Case Is > 60

  Cells(a, 4) = “及格”
Case Is > 80
  Cells(a, 4) = “良好”
Case Else
  Cells(a, 4) = “不及格”
   
End Select
Next a

End Sub

飘乐儿
2 年 前

点赞 一看就会

网友A
2 年 前

看完这章,我兴冲冲的去做实验,把vba测试好,把If ElseIf Else应用到我现在的表格里,结果直接卡死了QAQ;请问大佬是不是在大量数据下,直接使用excel函数比用VBA判断后打印出来更快;我现在使用的是单元格函数if判断然后用vba做公式下拉

Jack
2 年 前

一模一样的代码,如下
Option Explicit
Sub codetest()
  Dim i As Integer
  For i = 2 To 10
    Select Case Cells(i, “B”).Value
      Case Is >= 85
       Cells(i, “B”) = “very good”
      Case Is >= 75
        Cells(i, “B”) = “good”
      Case Is >= 60
        Cells(i, “B”) = “not bad”
      Case Else
        Cells(i, “B”) = “bad”
    End Select
  Next i                                  
End Sub
结果得到的结果和逻辑不一致,不知道哪里出了问题?

123
2 年 前
回复给  Jack

返回结果应该是C或者D,你直接返回到原数值了

VBA小白白
2 年 前

点赞

小陈啊
2 年 前

为什么Case后要加Is,我看到有一些范例Case后没有Is而是直接接上判断条件。感谢大神解答!

小陈啊
2 年 前
回复给  懒人Excel

大神有没有课本推荐,小白想系统的学习一下VBA

Sean
2 年 前
回复给  懒人Excel

什么时候呢??可以告知一下吗?

小陈啊
2 年 前
回复给  懒人Excel

谢谢大神!

坦然春
2 年 前

通俗易懂,谢谢楼主

sssa
2 年 前

Case Is >= 85,这里的is为什么可以代替Cells(i, “B”).Value呢?

Ziyan
2 年 前

提问:
Select Case结构中,判断条件为什么不是一个区间?例如为什么不是大于等于75且小于85?

最后由Ziyan编辑于2 年 前
student
2 年 前

疑问
If Cells(i, “B”).Value >= 60 Then
Cells(i, “C”) = “及格”
中的“.Value”是什么意思啊,是指单元格值吗

小学生
2 年 前

请问cells()后面加上.value和不加有什么说法?好像运行都一样。

student
2 年 前

小白请教
我有三个工作表,在sheet3里面做了一个和你一样的成绩单,
使用代码:
Sub MyCode()

Dim i As Integer

For i = 2 To 10

If Cells(i, “B”).Value >= 60 Then
Cells(i, “C”) = “及格”
End If

Next i

End Sub
我在这里没有看出来代码是针对我Sheet3里面的数据进行判断的(实际sheet3里面内容根据代码变了),那为什么不是针对我的sheet1 或者sheet2 呢?
麻烦讲解下,谢谢

student
2 年 前
回复给  懒人Excel

明白了,非常感谢!
我的代码也没有放在sheet3里面 ,是我单独建立了一个模块,
我这种应该是针对激活表里面的对象,我做了激活另外一个工作表的测试,再次感谢

sunshine
3 年 前

写得太好了,简单易懂,感谢为我们这些小白辛勤付出!

@SUNSHINE
1 年 前
回复给  sunshine

CASE 后面的IS什么时候要,什么时候不要

39
0
希望看到您的想法,请您发表评论x