VBA 变量作用域

VBA 中,变量的作用域决定变量在哪里能被获取和使用。根据变量的声明位置和声明方式,变量的作用域有以下 3 种:

  1. 过程作用域
  2. 模块作用域
  3. 工程作用域

下面将逐一介绍每一种作用域对应的变量的声明方法以及使用方法。

1.过程作用域

过程函数内部声明的变量,只有在当前过程或函数内被使用。例如:

Sub Test()

    Dim name As String
    Dim age As Integer
    
    name = "张三"
    age = 35

End Sub

以上代码中,变量 nameageTest 过程声明,因此它们只能在该过程中内使用,包括赋值和读取。如果尝试在外部和其他过程中直接使用它们,VBA 会提示变量未定义错误

2.模块作用域

一个模块中,在任何一个过程和函数外面,使用关键词 PrivateDim 声明的变量,称之为模块变量,其作用域是当前模块。例如,

Dim guest As String

Sub Test()

    Dim message As String
    
    guest = "张三"
    message = "你好"
    
    MsgBox message & "! " & guest

End Sub

以上代码中,变量 guest 是在过程 Test 外面,使用 Dim 关键词声明的,称之为模块变量。模块变量的作用域是当前模块,在模块里面任何过程和函数内均可以使用

如前文所述,使用关键词 PrivateDim 声明的变量,都是模块变量,因此以下两种声明方式是等效的。

Dim guest As String
Private guest As String

3.工程作用域

Excel VBA 中,一个 Excel 工作簿是一个 VBA 工程。与之对应,工程作用域表示变量在当前工程中的模块、Excel 对象、用户窗体、类模块中均可以被使用。

工程级别变量,在所在模块顶部声明 Option Private Module 修饰语句前提下,在过程或函数外面,使用关键词 Public 声明的变量,其作用域是当前工程。例如,

Option Private Module

Public guest As String

Sub Test()

    Dim message As String
    
    guest = "张三"
    message = "你好"
    
    MsgBox message & "! " & guest

End Sub

以上例子中,变量 guest 是使用 Public 关键词声明,是工程级别变量。它在当前工程中其他的模块中也能被使用。

 

作用域冲突

当相同名称的变量,多次以不同的作用域声明时,出现作用域冲突。这种情况,VBA 会自动以就近原则使用变量,即优先使用最近定义的变量。例如,

Dim name As String

Sub Test()

    Dim name As String
    
    name = "李四"

End Sub

以上例子中,两次声明 name 变量,分别是模块变量和过程变量。根据就近原则,在过程内部使用时,将使用过程变量。

 

转载注明:文章转载自「懒人Excel - www.lanrenexcel.com
本文链接:VBA 变量作用域
订阅评论
提醒
15 评论
最新
最旧 最多投票
内联反馈
查看所有评论
arcan
2 月 前

变量的作用域有以下 4 种:

  1. 过程作用域
  2. 模块作用域
  3. 工程作用域

hah

freesky
3 月 前

24年打卡

小菜鸟
1 年 前

23年 打卡报到

CCCC
1 年 前

不使用 Option Private Module 的 public也不能跨工程吧? 测试了下,应该不能

xyz
1 年 前

您好!工程作用域和全局作用域在实质上是没有啥区别的是不,就只是修饰语的有无。

海棠*
1 年 前

博主,还有多少篇没写啊。
感觉到目前还没能看懂之前使用宏录制得到的代码呢。

克洛伊木马
1 年 前
回复给  懒人Excel

博主加油更新啊

Nana
2 年 前

作用域冲突的例子,如果在同一模块,另一个过程要用name变量(不声明),可以用那个模块变量吗?

yaya
3 年 前

感谢博主!

https://www.lanrenexcel.com/excel-vba-tutorial/
此篇及后一篇未在大纲中设定导航链接哦

15
0
希望看到您的想法,请您发表评论x