在 Excel 当中自定义公式,分为两类,一类是普通自定义计算公式,也就是自己组合运算符和内置函数,在单元格直接编写运算表达式,另一类是自定义函数 UDF,通过 VBA 编写全新函数,供全表调用,普通自定义公式不需要编程,是日常办公最常用方式,以等号作为开头,搭配加减乘除,引用单元格,嵌套 SUM IF VLOOKUP 等内置函数,按照业务逻辑组合运算,自定义函数 UDF 适合内置函数无法满足的特殊计算,需要进入 VBA 编辑器编写代码,文件需要保存为启用宏的 xlsm 格式,很多新手混淆这两种自定义公式,普通公式只在单个单元格生效,下拉填充可以批量计算,自定义函数可以像 MAX SUM 一样反复调用。
普通自定义公式编写步骤
1 点击需要输出结果的单元格
2 输入等号,等号是 Excel 识别公式的标志,没有等号会变成纯文本
3 编写运算表达式,可以引用单元格,加入内置函数,例如 =(A2+B2)C2
4 编辑的时候可以点击单元格来选择引用区域,也可以手动输入单元格编号
5 按下回车键,单元格输出计算结果
6 需要批量计算,选中单元格,拖动填充柄或者使用 Ctrl 加 D 向下填充,公式会按照相对引用自动更新行号
VBA 自定义函数 UDF 创建步骤
1 按下 Alt 加 F11,打开 VBA 编辑器
2 右键点击当前工作簿,插入,选择模块
3 在模块代码窗口,编写 Function 自定义函数代码,例如 Function 计算总价 (单价,数量)
4 编写运算代码,给函数赋值返回结果
5 关闭 VBA 编辑器,回到工作表
6 在单元格就可以像内置函数一样调用这个自定义函数,例如 = 计算总价 (A2,B2)
7 文件保存类型选择 xlsm 启用宏的工作簿,普通 xlsx 格式保存之后宏会丢失
两种自定义公式对比表格
| 类型 | 实现方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 单元格自定义计算公式 | 运算符加内置函数组合 | 无需编程,上手简单 | 复杂逻辑代码较长,复用性弱 | 日常业务加减乘除嵌套计算 |
| VBA 自定义函数 UDF | VBA 代码新建函数 | 可以反复调用,实现特殊计算 | 需要基础 VBA 知识,文件要 xlsm 启用宏 | 内置函数无法实现的特殊计算 |
进阶深度要点
编写自定义公式的时候,重点掌握三种引用方式,相对引用 A2,下拉填充会自动改变行号,绝对引用 $A$2,填充之后单元格固定不变,混合引用 $A2 或者 A$2,锁定列或者锁定行,这个是自定义公式批量计算的核心知识点。
运算符优先级,乘除高于加减,逻辑运算比较运算有固定顺序,如果业务运算顺序和默认优先级不一样,必须增加括号,括号里面的内容优先计算,否则自定义公式结果会出错。
如果自定义公式报错 NAME,代表函数名称写错,或者 VBA 自定义函数没有启用宏,VALUE 代表参数类型错误,传入文本但是公式需要数值,DIV/0 代表除数为零,可以搭配 IFERROR 对自定义公式做容错,遇到错误返回空白或者自定义提示。
普通自定义公式可以多层嵌套函数,例如 IF 嵌套,SUMIF 嵌套,实现复杂业务判断,但是嵌套层数过多会让公式可读性变差,后期维护困难。
VBA 自定义函数如果打开文件提示宏被禁用,需要在信任中心启用宏,否则工作表调用这个自定义公式会提示 NAME 错误,其他电脑打开这个文件,同样需要开启宏才可以正常运行 UDF。
如果不需要编程,只是自己组合计算,优先使用单元格自定义公式,只有反复多次使用相同特殊运算,才考虑制作 VBA 自定义函数 UDF。
完成自定义公式之后,检查运算符优先级和单元格引用类型,批量填充之前确认绝对引用设置正确,VBA 自定义函数注意保存格式和宏启用状态。
【常见问题】
问题 1 excel 自定义公式输入之后变成文本是什么原因
回答 1 excel 自定义公式变成文本,是开头没有输入等号,Excel 识别成普通文字,重新编辑单元格,在最前面添加等号,回车之后就会识别为自定义公式并计算结果。
问题 2 excel 自定义公式下拉之后引用单元格错位怎么办
回答 2 excel 自定义公式下拉引用错位,是使用相对引用,需要固定的单元格添加 $ 符号改成绝对引用,再执行下拉填充,自定义公式里面固定单元格就不会跟着行号偏移。
问题 3 excel 自定义公式使用 VBA 函数打开提示 NAME 怎么办
回答 3 excel 自定义公式使用 VBA 自定义函数出现 NAME,一般是宏被系统禁用,或者文件保存成 xlsx 格式丢失宏代码,需要保存为 xlsm 启用宏格式,并且在信任中心启用宏,自定义函数才可以正常调用。
【免责申明】
本文内容基于 Excel 常规版本操作编写,不同版本界面细节可能存在差异,操作仅供学习参考,重要业务表格请提前备份,因操作失误造成的数据损失,由使用者自行承担。


