调用变量

时间:2019-03-05 19:49:09

标签: vba variables

我可以从Visual Basic中定义的Public Sub外部调用变量吗?

1 个答案:

答案 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将指针传递给该值(或者在对象引用的情况下,指针本身)。请注意,这通常不是您要允许的行为,因此大多数参数应按值传递。