变量与函数
在 Excel 中,传统公式并不能像编程语言那样显式声明变量,这导致复杂公式常常需要多次重复相同的计算片段,既影响性能又降低可读性。LET 函数的出现彻底改变了这一局面,它允许我们在一个公式内部定义和使用变量,把原本冗长、嵌套的表达式梳理得层次分明。
以下是对 Excel 中“变量”概念及 LET 函数的全面解析,结合你之前关注过的查找、筛选、类型判断与字符串操作,给出实战级的用法。
一、Excel 中“变量”的演进
在 LET 问世之前,Excel 主要有三种方式模拟变量:
| 方式 | 原理 | 缺点 |
|---|---|---|
| 辅助单元格 | 把中间结果写在额外单元格中,再在主公式中引用 | 占用工作表空间,可读性差,数据源变动时代码散乱 |
| 名称管理器 | 将某个计算表达式定义为名称(如“税率”),再在公式中用名称调用 | 名称是工作簿级或工作表级,修改不便,且不易传递参数 |
| 公式内重复计算 | 直接在同一公式中多次复制相同的子表达式 | 增加计算负担,复杂公式极难维护 |
LET 函数(Excel 2021 / Microsoft 365)可以让你在 一个公式内部 用类似 变量 = 值 的方式定义命名变量,然后在后续计算中反复引用该变量。变量的值只会被计算一次,之后都使用缓存结果。
二、LET 函数语法详解
=LET(name1, value1, calculation_or_name2, [value2, ...], calculation)| 参数 | 说明 |
|---|---|
name1 | 第一个变量的名称,不需要引号,不能是单元格引用或数字开头(如 x, myVal) |
value1 | 第一个变量的值(可以是常量、引用、表达式) |
name2, value2... | (可选)最多可定义 126 个变量,成对出现 |
calculation | 最终返回的计算表达式,必须位于最后一参数,可以使用前面定义的所有变量 |
基本执行逻辑:
- 从左到右依次计算
value1,value2, …,并把结果赋给对应的名称。 - 执行最后的
calculation,返回其结果到单元格。 - 所有变量只在当前 LET 公式内有效,无法跨单元格引用。
三、经典应用实例
假设仍沿用之前的员工数据 A1:D9(员工ID、姓名、部门、工资)。
1. 消除重复计算,提升性能
传统写法如果要根据“张三”的工资计算提成和税后金额,工资查找会计算两次:
=XLOOKUP("张三", B2:B9, D2:D9)*0.1 + XLOOKUP("张三", B2:B9, D2:D9)*0.85使用 LET 后,只计算一次:
=LET(
salary, XLOOKUP("张三", B2:B9, D2:D9),
salary*0.1 + salary*0.85
)如果 XLOOKUP 需要遍历大量数据,性能提升明显。
2. 分步计算,彻底提高可读性
计算员工“王五”的实发工资(基本工资+绩效-社保),绩效根据工资分段:
=LET(
base, XLOOKUP("王五", B2:B9, D2:D9),
perf, IF(base>6000, base*0.15, base*0.1),
insurance, 500,
base + perf - insurance
)变量名让逻辑一目了然,后期修改也只需调整对应的变量定义。
3. 与 FILTER 结合,构建动态汇总
筛选“销售部”员工,计算该部门工资总额与平均工资,并一次性返回多个结果(通过 HSTACK 或数组常量):
=LET(
sales, FILTER(A2:D9, C2:C9="销售部"),
total, SUM(INDEX(sales, , 4)),
avg, AVERAGE(INDEX(sales, , 4)),
HSTACK("总工资", total, "平均工资", avg)
)输出两列结果,无需重复执行 FILTER。
4. 字符串处理中的变量妙用
前面你已经掌握了大量字符串函数,用 LET 可以轻松解开多层嵌套。
示例:提取邮箱中 @ 前后的用户名和域名,并组合成“用户名[at]域名”
=LET(
email, A2,
pos, FIND("@", email),
user, LEFT(email, pos-1),
domain, RIGHT(email, LEN(email)-pos),
user & "[at]" & domain
)如果不使用 LET,FIND 和 LEN 的重复会使公式难以阅读。
5. 处理错误与类型判断
结合 ISNUMBER、TYPE 等判断数据类型,并给出安全输出。
示例:判断 B 列是否为合法的文本型日期(如 “2023-12-25”),若合法则转为真日期,否则返回“无效”
=LET(
txt, B2,
dateVal, DATEVALUE(txt),
IF(ISNUMBER(dateVal), dateVal, "无效")
)更复杂的场景可嵌套多个变量,将检测逻辑拆分。
6. 多层变量嵌套与顺序依赖
变量可以基于前面已定义的变量计算,形成推导链。
示例:已知半径,计算圆的周长、面积及球体积(π 用常量定义)
=LET(
r, 5,
pi, 3.14159265358979,
circumference, 2*pi*r,
area, pi*r^2,
volume, (4/3)*pi*r^3,
"周长:" & TEXT(circumference,"0.00") & ",面积:" & TEXT(area,"0.00") & ",体积:" & TEXT(volume,"0.00")
)四、LET + LAMBDA:迈向自定义函数
LAMBDA 函数允许将一段计算逻辑封装成可调用的自定义函数,其参数本身就是变量。将 LET 与 LAMBDA 结合,可以构建结构清晰、无副作用的函数库。
示例:创建一个名为 TAX 的函数,根据收入计算个税(采用简易规则:5000 以下免税,超过部分 10%)
- 定义名称(公式 → 名称管理器):
名称: TAX
引用位置: =LAMBDA(income, LET(excess, income-5000, IF(excess<=0, 0, excess*0.1)))- 工作表中直接使用:
=TAX(D2) // D2 为工资LAMBDA 的 income 作为外部变量传入,内部 LET 再用它计算超额部分,结构干净。
如果没有 LET,LAMBDA 内部往往需要重复计算 income-5000,现在一次定义即可。
五、LET 与其他“变量”方式的对比
| 特性 | 辅助单元格/列 | 名称管理器 | LET 函数 |
|---|---|---|---|
| 作用域 | 工作表全局 | 工作簿/工作表级 | 当前公式内部 |
| 是否动态传参 | 否 | 否(只能引用固定单元格) | 是(在公式内可以按需构建) |
| 是否会占据单元格 | 是 | 否 | 否 |
| 可复用性 | 弱 | 中等 | 低(仅单个公式内),但与 LAMBDA 结合可复用 |
| 性能影响 | 可能有大量中间单元格 | 很好 | 优秀(减少重复计算) |
| 调试友好度 | 需查看中间单元格 | 需去名称管理器查看 | 可在公式栏直接阅读,但内部变量无法直接追踪 |
推荐原则:
- 仅在单个单元格计算中间步骤使用 → LET
- 需要全局常量或通用计算且不传递参数 → 名称管理器
- 需要多次调用同一逻辑并传入不同参数 → LAMBDA 自定义函数
- 需要跨公式共享中间结果且数据量不大 → 辅助列仍是最简单的选择
六、性能与最佳实践
- 优先用 LET 消除重复计算:尤其涉及 XLOOKUP、FILTER、SUMIF 等扫描大范围的操作,定义一次变量可让公式快一个数量级。
- 变量命名要有意义:别用
a,b,c,推荐用totalSales、taxRate这类能说明用途的名称(支持中文命名,如工资,税率)。 - 注意顺序:后续变量只能使用之前定义的变量,不能向前引用。
- 错误处理提前:可在第一个变量中就用 IFERROR 包裹可能出错的查找,避免整个公式崩溃。
- 避免过度嵌套:虽然可定义 126 个变量,但超过 5~10 个应考虑拆分为 LAMBDA 或辅助列,以保持维护性。
- 版本兼容:保存为
.xlsx并确保接收方使用 Excel 2021 或 365,否则公式显示#NAME?。
七、完整示例:综合查找、筛选与字符串格式化
假设你需要一个单元格完成:根据部门(放在 F1)筛选该部门所有员工的姓名和格式化工资,并连接成一个摘要字符串。
传统方法可能需要数个辅助列,用 LET 可以一气呵成:
=LET(
dept, F1,
filtered, FILTER(B2:D9, C2:C9=dept),
names, INDEX(filtered, , 1),
salaries, INDEX(filtered, , 3),
formatted, names & "(" & TEXT(salaries,"¥#,##0") & ")",
TEXTJOIN(", ", TRUE, formatted)
)如果 F1 为“销售部”,将显示类似:张三(¥6,000), 王五(¥5,500)。
这里 filtered 只执行一次,后续多次取列、格式化均使用缓存,简洁高效。
八、速查总结
| 场景 | LET 解决方案 |
|---|---|
| 减少重复计算 | 将重复部分定义为变量,末尾引用 |
| 提升公式可读性 | 用变量名替代嵌套表达式 |
| 构建中间逻辑 | 分步定义,逐步推导到最终结果 |
| 与 FILTER/XLOOKUP 配合 | 将查找或筛选结果存入变量,再加工 |
| 复杂字符串处理 | 提取位置、分割、替换等每一步都存为变量 |
| 创建自定义函数 | 结合 LAMBDA,在名称管理器中封装逻辑 |
LET 函数让你在 Excel 公式中拥有了真正的局部变量能力,把过去需要多个辅助列或庞大嵌套公式才能完成的任务,压缩在一个单元格内,同时保持清晰和高效。掌握 LET,是迈向 Excel 高级公式自动化的重要一步。