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 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 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
代码运行结果如下:
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
语句后的条件。
代码运行结构如下:
总结
以上就是选择结构的基本用法,以及 4 种选择结构。选择结构的核心是判断条件表达式的真假,从另一个角度看,核心是如何写条件表达式。这一步写好了,下一步就是根据判断结果执行不同的代码块。
i 我知道为变量,但是不是指行也 Dim i As Integer
For i = 2 To 10
If Cells(i, “B‘’).Value >= 60 Then
在的,Cells 的第一个参数就是行。
Sub MyCode()
Dim i As Integer
For i = 1 To 10
If Cells(i, “B”).Value >= 60 Then
Cells(i, “C”) = “及格”
Else
Cells(i, 3) = “不及格”
End If
If Cells(i, 2).Value >= 80 Then
Cells(i, 4) = “优秀”
ElseIf Cells(i, 2).Value >= 60 Then
Cells(i, 4) = “良好”
Else
Cells(i, 4) = “差”
End If
Next i
End Sub
真的太好了:) 第一次看到这么好的教学网站 干净好用 博主也非常有耐心 只要有人提问都会回复 祝博主越来越好
您好,我想问问,关于VBA中的缩进的问题,譬如说上述这段代码中,End select这里需不需要缩进,我测试的结果是这里缩进和不缩进的结果是一样的。(缩进即和CASE ELSE一致,不缩进即和SELECT CASE保持一致)但是具体这里其实不是很明白,所以想问问关于缩进VBA中具体有什么规定?
缩进本身,无论如何缩进,对代码运行没有影响。
代码根据一个代码块的开始关键字和结束关键字判断逻辑区域。
缩进更多是为了提升代码的可读性,进而提升效率,减少一些错误。
用vba执行命令后,回到excel表格是没有办法撤销刚才执行的程序的是吗?如果我误执行了代码想要撤销怎么办呢?按ctrl+z也没有效果,有其他的办法吗?
没有内置的功能提供撤销的操作,但是可以自己编写撤销的宏,并通过Application.OnUndo来执行,具体看官方文档。
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会报错,是什么原因?
cells里面写C2,C3干嘛,写行列就行啊
Cells 属性 c2 变量是什么?对应单元格是不是数字格式?没有对应数据,只能这么判断了。
求教大神,为什么代码第十行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
首先第一个,BEV变量是否已定义?
第二个,ElseIf Cells(i, “T”) = 0& & Cells(i, “Q”) <> 0 Then 这里,如要表示「与」条件,应使用 AND 关键字;
第三个,最后一个Else,我看有除法,会不会有一个Cells(i, “U”)为零呢?
版主好,为什么Cells(i, “D”) = “不及格”后面不加.value就可以直接把字符写入单元格,数值也可以这样直接写入单元格吗?谢谢
根据官方文档,Cells返回的是Range对象,而Range对象的默认属性就是 Value,因此写与不写 Value,效果都相同。
求教大神,这是我写的,一运行就只能显示及格或者不及格,没有良好什么的
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
顺序结构啊,认真学习
Select结构判断时,多个判断条件依次进行,只要其中符合条件返回true,则执行完其代码后,select结构就停止继续判断了。
因此,只要成绩大于60,第一个判断就符合预期值,写完“及格”或,就停止了。所以,应从小于60分开始判断。
点赞 一看就会
看完这章,我兴冲冲的去做实验,把vba测试好,把If ElseIf Else应用到我现在的表格里,结果直接卡死了QAQ;请问大佬是不是在大量数据下,直接使用excel函数比用VBA判断后打印出来更快;我现在使用的是单元格函数if判断然后用vba做公式下拉
如果选择的区域是一列全部单元格,则循环时间肯定会花很长时间。因此,一般循环时会指定开始单元格和结束单元格,这样处理时间很快。
具体到你的情况,可以贴一下你的原始代码吗,我看一下问题出在哪里了。
一模一样的代码,如下
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
结果得到的结果和逻辑不一致,不知道哪里出了问题?
返回结果应该是C或者D,你直接返回到原数值了
1、判断单元格 Cells(i, “B”).value 和写入单元格 Cells(i, “B”),最好分开列。
2、分开以后,我这里测试正确,你说的不一致,具体可以举个例子吗?
点赞
为什么Case后要加Is,我看到有一些范例Case后没有Is而是直接接上判断条件。感谢大神解答!
这里是case后接比较判断,因此按VBA语法,需要加 IS 关键字。
case判断分为三种:
1、是否相同判断,case [值];
2、数值范围判断,case [开始] to [结束];
3、比较判断, case [比较运算符][比较值]
大神有没有课本推荐,小白想系统的学习一下VBA
我们即将推出系统学习课程,欢迎关注
什么时候呢??可以告知一下吗?
2月底前上线发布,欢迎届时关注并提意见
谢谢大神!
通俗易懂,谢谢楼主
Case Is >= 85,这里的is为什么可以代替Cells(i, “B”).Value呢?
这里就是 Select Case 结构的特点。不用像IF结构一样重复写判断的变量
提问:
Select Case结构中,判断条件为什么不是一个区间?例如为什么不是大于等于75且小于85?
Select Case 结构中,程序从第一个条件开始判断,如果符合,运行改条的主体代码,然后退出 select case 结构。这是前提。
像示例中的例子,如果程序运行到第二个条件,表示变量已经不符合第一个 ≥85 的条件,那么第二个条件的实际判断结构是 【大于等于75且小于85】。
综上,第二个条件就没有必要写成区间表达式。
疑问
If Cells(i, “B”).Value >= 60 Then
Cells(i, “C”) = “及格”
中的“.Value”是什么意思啊,是指单元格值吗
是的,cells对象value属性是取值操作
请问cells()后面加上.value和不加有什么说法?好像运行都一样。
常用情景下是表现方式是一致的,具体差异会单独写一篇文章
小白请教
我有三个工作表,在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 呢?
麻烦讲解下,谢谢
这里有一个默认执行环境的问题。当把这段代码放在 sheet3 的模块里,那么没有明确指定的情况下,Cells 对象指的就是 sheet3 表的单元格区域。当然,这里还有当前激活的工作表的问题,这部分默认环境的概念,会写一篇文章详细介绍一下
明白了,非常感谢!
我的代码也没有放在sheet3里面 ,是我单独建立了一个模块,
我这种应该是针对激活表里面的对象,我做了激活另外一个工作表的测试,再次感谢
写得太好了,简单易懂,感谢为我们这些小白辛勤付出!
CASE 后面的IS什么时候要,什么时候不要
判断条件可以是以下 3 种形式之一,或者是它们的组合(不同形式以 , 号分开):
1、确切相同的值:[值];
2、数值范围:[开始] To [结束];
3、比较值:Is [比较运算符] [比较值]。