MICROSOFT

EP03. “Volatile Functions 易变函数”

首页 Microsoft 工具 Excel · VBA · Function and Sub · EP03
约 4 分钟· #EP03#Excel#Function and Sub
🔒 登录后可标记已读
  • 自定义函数默认是「非易变(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:

  1. Volatile Functions