EP02. “Variable Scope 变量作用域”
🔒 登录后可标记已读- 变量的作用域(Scope)决定了这个变量能在哪些地方被用到
- VBA 里分成三个层级:程序层级、模块层级、公开模块层级
- 这篇讲这三层怎么声明、差别在哪
- 前置知识:基本的
Sub/Dim用法 - 学完能避免「明明声明过的变量,换一个 Sub 却读不到」这类困惑
重点内容
适用版本
桌面版通用(Excel 365 / 2021 / 2019 等)。
程序层级(只在这个 Sub 内有效)
在 Sub 和 End Sub 之间声明的变量,只能在这个程序内使用:
Sub sub1()
Dim txt As String
txt = "hello"
End Sub
Sub sub2()
MsgBox txt ' 这里会报错,sub2 看不到 sub1 里的 txt
End Sub
模块层级(同一个模块内的所有 Sub 都能用)
把 Dim 声明写在模块最上方(General Declarations 区域,任何 Sub 之外),这个变量就能被同一模块里的所有程序共用:
Dim txt As String
Sub sub1()
txt = "hello"
End Sub
Sub sub2()
MsgBox txt ' 可以正常读到,因为 txt 是模块层级变量
End Sub
📌 用 Dim 在模块最上方声明,默认只在这一个模块里有效,其他模块看不到。
公开模块层级(整份工作簿的所有模块都能用)
把 Dim 换成 Public,变量就能被整份工作簿里所有模块的所有程序共用:
Public txt As String
方法怎么选
| 作用域 | 怎么声明 | 适合场景 |
|---|---|---|
| 程序层级 | Sub 内用 Dim | 只有这一个 Sub 自己用得到的临时变量 |
| 模块层级 | 模块最上方(General Declarations)用 Dim | 同一模块里好几个 Sub 要共用 |
| 公开模块层级 | 模块最上方用 Public | 整份工作簿、跨模块都要共用 |
学完你会
- ✅ 看懂程序层级、模块层级、公开模块层级三种变量作用域的差别
- ✅ 需要跨 Sub 共用变量时,知道要把
Dim搬到模块最上方 - ✅ 需要跨模块共用变量时,知道要用
Public而不是Dim
常见错误
- 在某个 Sub 里声明的变量,换一个 Sub 就读不到,忘记这是「程序层级」的正常行为,不是 bug
- 想要好几个模块共用一个变量,却只用
Dim声明在模块顶端,其实要改用Public才能跨模块使用 - 变量层级设得太宽(动不动就用
Public),导致不同程序之间互相污染彼此的变量值,难以排查
Sources
Blog / Website: