MICROSOFT

EP02. “Variable Scope 变量作用域”

首页 Microsoft 工具 Excel · VBA · Variables · EP02
约 4 分钟· #EP02#Excel#Variables
🔒 登录后可标记已读
  • 变量的作用域(Scope)决定了这个变量能在哪些地方被用到
  • VBA 里分成三个层级:程序层级、模块层级、公开模块层级
  • 这篇讲这三层怎么声明、差别在哪
  • 前置知识:基本的 Sub/Dim 用法
  • 学完能避免「明明声明过的变量,换一个 Sub 却读不到」这类困惑

重点内容


适用版本

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


程序层级(只在这个 Sub 内有效)

SubEnd 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:

  1. Variable Scope