EP03. “Volatile Functions 易变函数”
🔒 登录后可标记已读- 自定义函数默认是「非易变(non-volatile)」的,只有它自己的参数变动时才会重新计算
- 讲怎么用
Application.Volatile让自定义函数变成「易变(volatile)」 - 易变函数只要工作表里任何一个单元格发生计算,它就会跟着重新算一次
- 前置知识:EP01 的自定义函数写法
重点内容
适用版本
桌面版通用(Excel 365 / 2021 / 2019 等)。
非易变函数(默认行为)
Function MYFUNCTION(cell As Range)
MYFUNCTION = cell.Value + cell.Offset(1, 0).Value
End Function
这个函数把传进来的单元格跟它下面那一格加起来。默认情况下,只有 cell 这个参数指到的内容变了,函数才会重新计算;工作表上其他不相关的单元格变动,不会触发它重算。
改成易变函数
Function MYFUNCTION(cell As Range)
Application.Volatile
MYFUNCTION = cell.Value + cell.Offset(1, 0).Value
End Function
加了 Application.Volatile 之后,只要工作表上任何一处发生重新计算,这个函数就会跟着重算一次,不管改动的单元格跟它有没有关系。
📌 改完代码后,要回到工作表重新输入一次这条函数公式,易变行为才会生效。
非易变 vs 易变怎么选
| 类型 | 重算时机 | 适合场景 |
|---|---|---|
| 非易变(默认) | 只有自己的参数变动才重算 | 大部分自定义函数,运算效率较好 |
易变(加 Application.Volatile) | 工作表任何变动都重算 | 函数结果依赖参数以外的内容(例如时间、其他不相关单元格) |
学完你会
- ✅ 分辨自定义函数默认的「非易变」重算规则
- ✅ 用
Application.Volatile把函数改成「易变」 - ✅ 知道易变函数用多了会拖慢整份工作簿的运算速度,不要滥用
常见错误
- 改完代码却没有回到工作表重新输入公式,还在用旧的、非易变版本的计算结果
- 不必要地把很多函数都设成易变,导致每次任何单元格变动都要重算一大堆函数,拖慢整份工作簿的运算速度
- 誤以为「易变」代表函数会自动侦测到它「应该」依赖的单元格,实际上易变函数是「工作表任何变动都触发重算」,不是精准依赖侦测
Sources
Blog / Website: