MICROSOFT

EP03. “Life of Variables 变量的存活时间”

首页 Microsoft 工具 Excel · VBA · Variables · EP03
约 3 分钟· #EP03#Excel#Variables
🔒 登录后可标记已读
  • Dim 声明的变量,程序(Sub)跑完就会被销毁,下次再执行又是从头开始
  • 这篇讲怎么用 Static 关键字,让变量的值在两次执行之间被保留下来
  • 前置知识:EP02 的变量作用域概念
  • 学完能做出「每按一次按钮,数字累加 1」这类需要记住上次结果的效果

重点内容


适用版本

桌面版通用(Excel 365 / 2021 / 2019 等)。


问题:用 Dim 每次都会重置

Sub Increment()
    Dim x As Integer
    x = x + 1
    MsgBox x
End Sub

在工作表上加一个按钮绑定这段代码,每次点击都会弹出 1——因为 Dim 声明的变量在 Sub 跑完就被销毁了,下次执行时 VBA 会重新建立变量 x,从 0 开始再加 1。


解法:把 Dim 换成 Static

Sub Increment()
    Static x As Integer
    x = x + 1
    MsgBox x
End Sub

改成 Static 之后,每次点击按钮,x 会记得上一次的值,弹出的数字变成 1、2、3……依序累加。

📌 Static 变量会在按下 Reset(停止)按钮,或关闭工作簿时被销毁——不是永久保存,只是「跨程序执行之间」保留。


方法怎么选

关键字变量值会不会保留适合场景
Dim每次执行都重置不需要记住上次结果的一般变量
Static保留到下次执行(关闭工作簿或按 Reset 才清空)需要累加、计数这类记住上次结果的场景

学完你会

  • ✅ 分清楚 DimStatic 声明的变量,值会不会保留到下一次执行
  • ✅ 用 Static 做出「每按一次按钮,数字累加 1」这类效果
  • ✅ 知道 Static 变量什么时候会被清空(Reset 或关闭工作簿)

常见错误

  • Dim 却期待变量的值能保留到下一次执行,结果每次都被重置成初始值
  • 以为 Static 变量关闭 Excel 后还会记得上次的值,实际上关闭工作簿或按 Reset 就会清空
  • Static 和 EP02 的 Public(跨模块共用)搞混——Static 管的是「跨执行保留值」,Public 管的是「跨模块能不能读到」,是两个不同的概念

Sources

Blog / Website:

  1. Life of Variables