从0学Excel VBA编程 第7篇:条件判断 If 语句——让代码学会做选择
每天10分钟,今天开始,你的代码将拥有"思考"能力——能根据不同情况做不同的事。
学习目标
学会用 If...Then做单分支判断(满足条件才执行)学会用 If...Then...Else做双分支判断(满足和不满足执行不同操作)学会用 If...ElseIf做多分支判断(多种情况,对应不同结果)
知识点精讲
什么是条件判断?
生活里我们天天都在做"判断":
如果今天下雨 → 带伞;否则 → 不带伞 如果分数 ≥ 60 → 及格;否则 → 不及格 如果分数 ≥ 90 → 优秀;80 89 → 良好;7079 → 中等;否则 → 待加强
在 VBA 里,把这些"如果"翻译成代码,就是 If 语句。代码的执行流程不再是"从头到尾顺一遍",而是可以"拐弯"。
1. 单分支:If...Then...End If
场景:只有"满足"才做事,不满足就跳过。
语法:
If 条件 Then ' 条件满足时执行的代码End If举个例子——判断 A1 是否大于 100:
If Range("A1").Value > 100 Then MsgBox "A1 超过 100 了!"End If意思是:如果 A1 的值大于 100,就弹窗提醒。A1 小于等于 100 时,什么都不发生。
注意三点:
条件必须能得出True或False(比如> 100、<> "OK"、= "是")If和End If是成对出现的,别漏了End If只有一行代码时,可以简写为: If 条件 Then 一行代码(可以省略 End If),但新手建议老实写完整
2. 双分支:If...Then...Else...End If
场景:满足和不满足,要做两件不同的事。
语法:
If 条件 Then ' 条件满足时执行Else ' 条件不满足时执行End If举个例子——判断成绩是否及格:
If Range("A1").Value >= 60 Then MsgBox "及格啦!"Else MsgBox "没及格,要加油!"End If分数 ≥ 60 弹"及格",否则弹"没及格"。两条路二选一。
3. 多分支:If...ElseIf...Else...End If
场景:情况不止两种,需要分门别类处理。
语法:
If 条件1 Then ' 条件1满足时执行ElseIf 条件2 Then ' 条件2满足时执行(条件1不满足时才会检查这里)ElseIf 条件3 Then ' 条件3满足时执行Else ' 以上条件都不满足时执行End If举个例子——根据分数给出等级:
Dim 分数 As Integer分数 = Range("A1").ValueIf 分数 >= 90 Then Range("B1").Value = "优秀"ElseIf 分数 >= 80 Then Range("B1").Value = "良好"ElseIf 分数 >= 70 Then Range("B1").Value = "中等"ElseIf 分数 >= 60 Then Range("B1").Value = "及格"Else Range("B1").Value = "待加强"End If执行流程:从第一个条件开始检查,遇到第一个满足的就执行对应代码块,然后跳出整个 If;都不满足才执行 Else 部分。
重要细节:
ElseIf是一个词,不能写成Else If(中间加空格就是错的,新手常踩的坑)条件的顺序很关键。判断"≥90"必须放在"≥80"前面,否则 90 分也会被分到"良好" Else结尾是兜底用的,可省略
比较运算符速查
= | A1 = 100 | |
<> | A1 <> 0 | |
> | A1 > 60 | |
< | A1 < 60 | |
>= | A1 >= 60 | |
<= | A1 <= 60 |
文字比较时用 =:姓名 = "张三" 表示姓名等于"张三"。
【SVG 示意图】
实战案例
案例1:判断成绩是否及格(简单)
功能说明:在 A1 写入一个分数(70),用 If 单分支判断"是否及格(≥60)",及格就写入 B1 显示"✓",否则显示"✗"。
操作步骤:
按 Alt + F11打开 VBA 编辑器插入"模块",粘贴以下代码:
' =================================' 案例1:单分支 If 判断是否及格' =================================Sub 判断是否及格() ' 先在 A1 写一个分数 Range("A1").Value = 70 ' 用 If 单分支判断是否及格 If Range("A1").Value >= 60 Then Range("B1").Value = "✓ 及格" Range("B1").Font.Color = RGB(0, 176, 80) ' 绿色 Else Range("B1").Value = "✗ 待加强" Range("B1").Font.Color = RGB(255, 0, 0) ' 红色 End If MsgBox "A1 分数:" & Range("A1").Value & vbCrLf & _ "判定结果:" & Range("B1").Value, vbInformation, "完成"End Sub把光标放在代码中,按 F5运行
结果:A1 显示 70,B1 显示"✓ 及格"(绿色),弹窗提示"判定结果:✓ 及格"。
代码讲解:
这里用了双分支 If:及格和不及格要写不同的字、染不同的颜色 >= 60这个判断条件,70 >= 60为True,执行Then后面的代码块颜色用 RGB(0, 176, 80)是 Excel 的"标准绿",RGB(255, 0, 0)是纯红
💡 小练习:把 A1 的分数改成 50 再运行一次,会看到 B1 显示"✗ 待加强"(红色)。
案例2:根据分数评定等级(中等)
功能说明:在 A1 写入分数 85,用多分支 If 判断等级(优秀 ≥90 / 良好 8089 / 中等 7079 / 及格 60~69 / 待加强 <60),把等级写入 B1 并上色。
操作步骤:
在同一模块下方继续粘贴:
' =================================' 案例2:多分支 If 评定等级' =================================Sub 根据分数定等级() Dim 分数 As Integer Dim 等级 As String Dim 颜色 As Long ' 准备分数 Range("A1").Value = 85 分数 = Range("A1").Value ' 用多分支 If 判断等级 If 分数 >= 90 Then 等级 = "优秀" 颜色 = RGB(255, 87, 34) ' 橙色 ElseIf 分数 >= 80 Then 等级 = "良好" 颜色 = RGB(0, 176, 80) ' 绿色 ElseIf 分数 >= 70 Then 等级 = "中等" 颜色 = RGB(33, 150, 243) ' 蓝色 ElseIf 分数 >= 60 Then 等级 = "及格" 颜色 = RGB(158, 158, 158) ' 灰色 Else 等级 = "待加强" 颜色 = RGB(255, 0, 0) ' 红色 End If ' 把结果写入 B1 Range("B1").Value = 等级 Range("B1").Font.Color = 颜色 Range("B1").Font.Bold = True Range("B1").Font.Size = 14 ' 美化单元格 Range("B1").Interior.Color = RGB(255, 255, 200) ' 浅黄背景 Range("B1").HorizontalAlignment = xlCenter Range("A1:B1").EntireColumn.AutoFit MsgBox "分数 " & 分数 & " 分 → 等级:" & 等级, vbInformation, "评定完成"End Sub按 F5运行
结果:A1 显示 85,B1 显示绿色加粗"良好",浅黄底+居中,弹窗提示"85 分 → 良好"。
代码讲解:
这里用了 4 个 ElseIf加 1 个Else,把情况分得清清楚楚条件顺序很关键: ≥90必须放在最前,≥80放在第二。如果颠倒,85 分也会被判到"优秀"分支(因为85 >= 80也成立)这种"区间判断"模式以后工作里天天用:评定绩效、判定等级、计算提成……全都可以套这个结构 用变量 等级和颜色中转,最后统一写入单元格,代码更整洁易读
💡 小练习:把分数改成 95、72、58 各运行一次,看看 B1 分别显示什么。
案例3:批量标记异常数据(实用)
功能说明:在 A1 到 A10 写一组销售数据,B1 到 B10 写对应目标(500)。用 For 循环逐行判断:每行 A 列实际值若低于目标值 80%,就在 C 列写"⚠ 异常"标红;否则写"✓ 正常"标绿。这是日常数据质检的高频小工具。
注:循环还没学到,这里先用最简形式
For i = 1 To 10跑一遍,第8篇会专门讲。
操作步骤:
打开一个新工作表,在 VBA 编辑器粘贴:
' =================================' 案例3:批量标记异常数据' =================================Sub 批量标记异常数据() Dim i As Integer Dim 实际值 As Double Dim 目标值 As Double ' 第一步:写入示例数据(A列实际销售,B列目标) Range("A1").Value = "实际销售" Range("B1").Value = "目标" Range("C1").Value = "状态" Range("A2").Value = 520 Range("A3").Value = 380 Range("A4").Value = 450 Range("A5").Value = 610 Range("A6").Value = 290 Range("A7").Value = 555 Range("A8").Value = 470 Range("A9").Value = 100 Range("A10").Value = 600 Range("B2:B10").Value = 500 ' 目标值都是 500 ' 第二步:逐行判断并标记 For i = 2 To 10 实际值 = Range("A" & i).Value 目标值 = Range("B" & i).Value ' 用 If 双分支判断是否达到目标的 80% If 实际值 < 目标值 * 0.8 Then Range("C" & i).Value = "⚠ 异常" Range("C" & i).Font.Color = RGB(255, 0, 0) ' 红色字体 Range("C" & i).Font.Bold = True Range("A" & i).Interior.Color = RGB(255, 235, 235) ' 浅红背景 Else Range("C" & i).Value = "✓ 正常" Range("C" & i).Font.Color = RGB(0, 150, 0) ' 绿色字体 End If Next i ' 第三步:美化表头 With Range("A1:C1") .Font.Bold = True .Font.Color = RGB(255, 255, 255) .Interior.Color = RGB(0, 112, 192) .HorizontalAlignment = xlCenter End With Range("A1:C10").EntireColumn.AutoFit MsgBox "质检完成!低于目标 80% 的数据已被标红异常" & vbCrLf & _ "查看 C 列即可快速识别问题行", vbInformation, "完成"End Sub按 F5运行
结果:A列显示10组销售数据,B列都是目标500,C列用"⚠ 异常"标红了 A3(380)、A6(290)、A9(100)三行——这三行的 A 列单元格还自动填充了浅红色背景。其余7行 C 列写"✓ 正常"绿色字体。
代码讲解:
循环里套 If 是最常见的代码组合:先把循环走一遍(第8篇细讲),每个格子再做一次判断 "A" & i是把字母 A 和数字 i 拼起来变成单元格地址:i=2时是"A2",i=3时是"A3"——这是单元格的"动态写法"实际值 < 目标值 * 0.8这个判断,相当于"达成率低于 80% 就报警",可以直接改成其他阈值:0.9、1.0这套"循环 + 判断"模式适用于所有批量数据筛查场景:成绩合格率、库存预警、对账差异……思路完全一样
本篇小结
单分支: If 条件 Then ... End If,满足才执行,不满足跳过双分支: If 条件 Then ... Else ... End If,二选一多分支: If 条件1 Then ... ElseIf 条件2 Then ... Else ... End If,多选一比较运算符: =、<>、>、<、>=、<=写 If 必须成对: If和End If一一对应,缩进对齐更清晰小心 ElseIf:中间不能加空格,写成Else If就会出错条件顺序:"区间判断"要从大到小(≥90 在前,≥80 在后),不然会判错分支
今天只需要记住一件事:
If = 让代码"拐弯"。满足条件走一条路,不满足走另一条路。
下一篇内容预告
第8篇:循环 For 语句——让代码重复干活不嫌累
学会 For...Next基础循环学会用 Step控制步长(每次加几)学会 Exit For提前退出循环下一篇开始,代码将替你"批量干活",100 行、1000 行数据全自动处理!
小贴士:写 If 时记得先写完整结构(If...Then...End If),再在中间填条件。这样能避免漏写
End If导致代码变红报错。
夜雨聆风