我可以从Visual Basic中定义的Public Sub外部调用变量吗?
答案 0 :(得分:1)
这是基本级别的东西,但是如果您不知道要搜索什么,可能很难知道如何查找信息。这应该可以帮助您入门。
您不“调用”变量,您“调用”过程。在过程作用域内用Dim
关键字声明的变量在声明的作用域内是 local ,所以不是。
最好在指定Option Explicit
的情况下观察。
Option Explicit
Public Sub Test1()
Dim foo As Long
End Sub
Public Sub Test2()
foo = 42 ' illegal: variable is not declared / not accessible in this scope
End Sub
这里要理解的概念是作用域。使用Dim
声明局部变量。顾名思义,此类变量仅在声明它们的范围内存在。
接下来,您将拥有模块作用域。为此,您可以在模块顶部的过程范围之外使用Dim
关键字,但是为了保持一致性,最好使用Private
关键字。
Option Explicit
Private foo As Long
Public Sub Test1()
foo = 42
End Sub
Public Sub Test2()
MsgBox foo
End Sub
该代码将编译,如果在Test1
之前调用Test2
,则Test2
调用将在消息框中弹出42
。
然后您具有公共范围,又称“全局”。您可以为这些关键字使用过时的Global
关键字,但是为了保持一致性,最好使用Public
关键字。
Option Explicit
Public foo As Long
Public Sub Test1()
foo = 42
End Sub
Option Explicit
Public Sub Test2()
MsgBox foo
End Sub
上面的代码与上一代码段完全相同,只是现在我们在单独的模块( standard 模块-这很重要)中有两个过程。然后代码将编译并运行。
经验法则,您无需声明全局变量。
变量应始终尽可能缩小范围,并按参数传递。可以按值(ByVal
)或按引用(ByRef
)传递参数。如果未指定,则ByRef
为默认值。
Option Explicit
Public Sub Test()
Dim foo As Long
Assign foo
MsgBox foo
End Sub
Private Sub Assign(ByVal bar As Long)
bar = 42
End Sub
运行Test
将弹出一个消息框,提示0
,因为ByVal
传递了该值的副本(或 pointer指针的副本) (当我们谈论对象时)。
对比:
Option Explicit
Public Sub Test()
Dim foo As Long
Assign foo
MsgBox foo
End Sub
Private Sub Assign(ByRef bar As Long) ' or implicit: (bar As Long)
bar = 42
End Sub
这将弹出一个消息框,提示42
,因为ByRef
将指针传递给该值(或者在对象引用的情况下,指针本身)。请注意,这通常不是您要允许的行为,因此大多数参数应按值传递。