Excel VBA判断语句
先把这句话记住:If 就是在处理“分情况办事”
日常做表的时候,经常会遇到这种需求:
客户金额达到某个标准,就标记重点。回访天数太久,就提醒优先联系。满足条件的员工,结果列写“通过”;不满足的,写“复核”。
这些事说白了,都是一句话:
同一张表,不同情况,处理方式不一样。
这就是判断结构要解决的问题。在 VBA 里,最基础的写法就是:
-
1 -
2 -
3
If 条件 Then条件成立时执行的代码EndIf
这个结构的意思非常直接:
如果条件成立,那么执行中间这段代码;如果不成立,就跳过去。If、Then、End If 这些关键字都得写对,尤其 End If 中间那个空格不能丢。
一、最基础的 If:满足条件才执行
先看一个很常见的客户跟进表。
示例表格
|
|
|
|
|
|
|
|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
现在需求很简单:
如果 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 列累计成交额大于等于 10000Cells(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 列金额达到 10000Cells(i,5)="重点跟进"'E 列写“重点跟进”Else'否则Cells(i,5)="常规维护"'E 列写“常规维护”EndIfNext iEndSub
Else 的意思其实就是“否则”。
也就是说,程序在每一轮判断里,只会二选一:
-
要么走 Then后面的分支 -
要么走 Else后面的分支
这个结构特别适合那种“不是 A,就是 B”的规则。比如:
-
通过 / 不通过 -
已完成 / 未完成 -
高风险 / 正常 -
重点跟进 / 常规维护
我自己平时写教程时,也会提醒一句:一个 If 结构里只能有一个 Else。因为 Else 本来就是“前面都不成立,那就走这里”,它只能是最后那个兜底分支。
四、If…ElseIf:不止两种情况的时候,就别硬写多个 Else
再往后一点,很多规则就不是两种结果了,而是分档处理。
比如客户回访表。
示例表格
|
|
|
|
|
|
|
|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
规则是:
-
大于等于 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 列未回访天数大于等于 14Cells(i,5)="高优先级"'E 列写“高优先级”ElseIfCells(i,4)>=7Then'否则如果 D 列未回访天数大于等于 7Cells(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,适合那种“同一个指标分成几档”的情况。但有些业务规则不是平铺开的,而是一步一步往下走的。
比如绩效审批表。
示例表格
|
|
|
|
|
|
|
|
|---|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
||
|
|
|
|
|
|
||
|
|
|
|
|
|
规则我改成这样,更像真实一点:
-
先判断回款完成率是否达到 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档ElseCells(i,6)="B档"'没达到 100000,F 列写 B档EndIfElseCells(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 种结构写明白,已经很够用了。
夜雨聆风