乐于分享
好东西不私藏

Excel VBA判断语句

Excel VBA判断语句

先把这句话记住:If 就是在处理“分情况办事”

日常做表的时候,经常会遇到这种需求:

客户金额达到某个标准,就标记重点。回访天数太久,就提醒优先联系。满足条件的员工,结果列写“通过”;不满足的,写“复核”。

这些事说白了,都是一句话:

同一张表,不同情况,处理方式不一样。

这就是判断结构要解决的问题。在 VBA 里,最基础的写法就是:

  • 1
  • 2
  • 3
If 条件 Then    条件成立时执行的代码EndIf

这个结构的意思非常直接:

如果条件成立,那么执行中间这段代码;如果不成立,就跳过去。IfThenEnd If 这些关键字都得写对,尤其 End If 中间那个空格不能丢。


一、最基础的 If:满足条件才执行

先看一个很常见的客户跟进表。

示例表格

A
B
C
D
E
1
客户编号
客户名称
跟进人
累计成交额
重点客户标记
2
C001
华腾科技
小林
6800
3
C002
云鼎贸易
小周
15200
4
C003
星海设备
阿杰
9100
5
C004
远川信息
小许
23600
6
C005
嘉禾电子
小吴
4800

现在需求很简单:

如果 D 列累计成交额大于等于 10000,就在 E 列写“重点客户”。

这种就用最基础的 If。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
Sub MarkVipCustomer()Dim i AsLongFor i = 2To6'从第 2 行扫到第 6 行IfCells(i,4)>=10000Then'如果 D 列累计成交额大于等于 10000   Cells(i,5)="重点客户"'就在 E 列写入“重点客户”EndIfNext iEndSub

这一段最适合刚入门时建立感觉。

因为它只处理一件事:满足条件就做,不满足就先什么都不做。

很多人第一次学 If,容易急着往里面塞很多分支。其实没必要。先把这种最基础的单分支判断写顺,后面再加 Else 才不会乱。


二、关系运算符先认熟,不然后面条件写不明白

If 结构看着像是在学语法,实际上你最常写的是判断条件。而判断条件,离不开关系运算符。

VBA 里最常见的就是这 6 个:

运算符
含义
示例
=
等于
If a = b Then
<>
不等于
If a <> b Then
>
大于
If a > b Then
<
小于
If a < b Then
>=
大于等于
If a >= b Then
<=
小于等于
If a <= b Then

这些本身不难,真正容易绕一下的是 =

因为 = 在 VBA 里有两种用法:

一种是比较是否相等,比如:

  • 1
If Cells(i, 4) = 10000Then

另一种是赋值,比如:

  • 1
Cells(i, 5) = "重点客户"

同样一个等号,前者是在判断,后者是在写入结果。刚开始读代码时,脑子里最好把这两个动作分开。这个点其实挺重要,不然很多人一看到等号就容易发懵。


三、If…Else:两种结果,别让单元格空着

上面那个例子有个问题。

如果成交额没到 10000,E 列就会留空。但实际工作里,留空不一定是好事。别人一看这列,可能分不清你是“没处理”,还是“本来就不是重点客户”。

这时候就该加 Else 了。

还是用刚才那张表,这次规则改一下:

如果成交额大于等于 10000,就写“重点跟进”;否则写“常规维护”。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
Sub MarkCustomerLevel()Dim i AsLongFor i = 2To6'逐行检查客户数据IfCells(i,4)>=10000Then'如果 D 列金额达到 10000   Cells(i,5)="重点跟进"'E 列写“重点跟进”Else'否则   Cells(i,5)="常规维护"'E 列写“常规维护”EndIfNext iEndSub

Else 的意思其实就是“否则”。

也就是说,程序在每一轮判断里,只会二选一:

  • 要么走 Then 后面的分支
  • 要么走 Else 后面的分支

这个结构特别适合那种“不是 A,就是 B”的规则。比如:

  • 通过 / 不通过
  • 已完成 / 未完成
  • 高风险 / 正常
  • 重点跟进 / 常规维护

我自己平时写教程时,也会提醒一句:一个 If 结构里只能有一个 Else。因为 Else 本来就是“前面都不成立,那就走这里”,它只能是最后那个兜底分支。


四、If…ElseIf:不止两种情况的时候,就别硬写多个 Else

再往后一点,很多规则就不是两种结果了,而是分档处理。

比如客户回访表。

示例表格

A
B
C
D
E
1
客户编号
客户名称
跟进人
未回访天数
跟进级别
2
C101
华信科技
小唐
3
3
C102
云帆制造
小顾
8
4
C103
北辰设备
阿凯
16
5
C104
星河软件
小许
6
6
C105
卓远贸易
小林
12

规则是:

  • 大于等于 14 天:高优先级
  • 大于等于 7 天:中优先级
  • 其他:正常跟进

这时候再用 If...Else 就不够了,因为它只能处理两种结果。这类多分支情况,就该写 ElseIf

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
Sub MarkFollowLevel()Dim i AsLongFor i = 2To6'按行检查客户回访情况IfCells(i,4)>=14Then'如果 D 列未回访天数大于等于 14   Cells(i,5)="高优先级"'E 列写“高优先级”ElseIfCells(i,4)>=7Then'否则如果 D 列未回访天数大于等于 7   Cells(i,5)="中优先级"'E 列写“中优先级”Else'其余情况   Cells(i,5)="正常跟进"'E 列写“正常跟进”EndIfNext iEndSub

这里有两个地方我建议一定要注意。

1)ElseIf 是一个单词

很多人会手滑写成 Else If在 VBA 里,这两个不是一回事。写多分支判断时,要写成连着的 ElseIf

2)判断顺序要从严到松

上面这段代码里,先判断 >=14,再判断 >=7这个顺序不能反。

因为如果你先写:

  • 1
ElseIf Cells(i, 4) >= 7Then

那像 16 这种值,在这里就已经满足条件了,后面的 >=14 根本轮不到。

这也是 ElseIf 最容易出错的地方之一。不是语法错,而是顺序错


五、嵌套 If:不是并排分档,而是层层往下判断

前面的 ElseIf,适合那种“同一个指标分成几档”的情况。但有些业务规则不是平铺开的,而是一步一步往下走的。

比如绩效审批表。

示例表格

A
B
C
D
E
F
1
姓名
部门
月销售额
回款完成率
审批结果
奖励档位
2
林然
华东区
126000
96%
3
周可
华南区
88000
94%
4
孙琪
华北区
142000
87%
5
唐杰
华中区
103000
91%

规则我改成这样,更像真实一点:

  • 先判断回款完成率是否达到 90%
  • 如果没达到,审批结果写“未通过”,奖励档位写“不发放”
  • 如果达到了,再继续判断销售额
  • 销售额大于等于 100000,奖励档位写“A档”
  • 否则写“B档”

这种结构就不是“并列分支”了,而是“先过第一关,再看第二关”,所以更适合写成嵌套 If。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
Sub CheckBonusLevel()Dim i AsLongFor i = 2To5'处理第 2 行到第 5 行的绩效数据IfCells(i,4)>=0.9Then'先判断 D 列回款完成率是否达到 90%   Cells(i,5)="通过"'E 列写审批结果IfCells(i,3)>=100000Then'通过后,再判断 C 列月销售额   Cells(i,6)="A档"'达到 100000,F 列写 A档Else   Cells(i,6)="B档"'没达到 100000,F 列写 B档EndIfElse   Cells(i,5)="未通过"'没通过审批   Cells(i,6)="不发放"'奖励档位写“不发放”EndIfNext iEndSub

这里的重点,不是“代码套了几层”,而是你要先想清楚业务关系。

什么时候该用 ElseIf?

当你的判断是并排的,比如:

  • 90 分以上
  • 80 分以上
  • 60 分以上

这种本质上是同一维度的分档。

什么时候该用嵌套 If?

当你的判断是递进的,比如:

  • 先看有没有资格
  • 有资格之后,再分等级

这种规则,用嵌套写会更顺。因为它和你脑子里真正处理这件事的顺序是一致的。关于嵌套结构,本来也是判断语句里一个单独的重要部分,尤其在多层条件递进时会比单纯平铺分支更贴近业务本身。


六、写 If 时,最容易踩的几个坑

我自己看初学者代码,这几个问题真的特别常见。

1)漏写 End If

只要你写的是多行 If 结构,就要记得收尾。尤其一旦开始嵌套,少一个 End If,后面排查起来会很烦。

2)ElseIf 写错

这个前面提过,但确实高频。多分支判断里,记住写成一个单词:ElseIf

3)缩进乱了,自己把自己看晕

VBA 对缩进没强制要求,缩不缩程序都能跑。但判断结构一旦多起来,不缩进基本就等于给自己挖坑。尤其嵌套 If,没有缩进的话,哪一层配哪一层,很快就会看花。这个在判断结构里算是非常实用的习惯,不是形式问题。

4)条件顺序写反

像 >=14>=7、其他 这种,一定从范围更严格的开始写。否则前面分支会把后面分支提前拦走。

5)把比较和赋值看混

这个坑很隐蔽。尤其是等号 =,一会儿在判断里用,一会儿在赋值里用。初学阶段,真得有意识地区分。


最后一句

If 结构这块,表面上是在学语法。

但我自己一直觉得,它其实是在练一件更底层的事:你能不能把表里的规则,拆成程序能执行的判断。

什么时候只判断一次就够了。什么时候需要“否则”。什么时候是多档分支。什么时候是先过第一关,再判断下一层。

这几种感觉一旦建立起来,后面写 VBA 会顺很多。

所以 If 这一篇,先别求快。把最基础的 4 种结构写明白,已经很够用了。