vba语言中变量作用域的类型

时间:2012-01-06 08:49:08

标签: vb.net variables vba scoping

我尝试理解VBA范围类型,在VBA中不可能做到这一点,但是在其他语言(java,scala等)中它是可能的:

public sub try()

    dim myVar as String
    myvar = "hello world" 

    Call displayVar()

end sub

public sub displayVar()
   msgbox (myvar)
end sub

您能否提供一些有关此类限制范围的信息?它是动态的或词汇的,我真的不明白其中的区别:/

2 个答案:

答案 0 :(得分:3)

Franck Leveque对本地和全球声明之间的区别进行了清晰而简单的演示。

但是,与大多数语言一样,VBA允许您将参数传递给子例程。有时全局变量是唯一的选择或唯一明智的选择。但通常最好在myVar中声明try并将其作为参数传递给displayVar。这可以防止displayVar意外更改myVar,因为默认情况下,参数会作为值传递。如果希望子例程更改参数的值,则必须显式传递参数作为参考。大多数现代编程语言都是如此。

另请注意,Public表示这些子例程对其他模块中的子例程可见。如果PublicPrivate省略或被try替换,则displayVarmyVar只会在其模块中显示。

在下面的代码中,我已将displayVar的值作为参数传递给Public Sub try() Dim myVar As String myvar = "hello world" Call displayVar(myVar) End Sub Public Sub displayVar(Stg As String) Call Msgbox(Stg, VBOKOnly) End Sub

{{1}}

答案 1 :(得分:1)

变量myVar在函数try()

中声明

因此,您只能在try()函数范围内使用它。

通过try()函数作用域,我的意思是在public sub try()和end sub之间写的所有指令。

您尝试从另一个函数(displayVar)调用您的变量。它定义了它自己的范围,不在try函数范围内。

如果你想要这个,你必须在全局范围内声明你的变量(在任何函数之外)

例如:

dim myVar as String

public sub try()

    myvar = "hello world" 

    Call displayVar()

end sub

public sub displayVar()
   msgbox (myvar)
end sub