【问题标题】:Type of variable scoping in vba languagevba 语言中变量作用域的类型
【发布时间】:2012-01-06 08:49:07
【问题描述】:

我尝试理解 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

你能给我一些关于这种有限范围的信息吗?它是动态的还是词法的,我不太明白其中的区别:/

【问题讨论】:

  • 好的,所以只有在课堂上才能做到这一点,我明白。谢谢!
  • 您发布的代码无法使用option explicit on 编译,我建议您打开它,因为这可能会掩盖您认为正在发生的事情
  • 附注 - 每当您在方法调用之后和第一个括号之前看到空格时,这意味着您正在传递参数 ByVal 在大多数情况下您不希望这样,因此您需要添加Call 或删除括号,例如Call MsgBox(myvar) 或 MsgBox myvar
  • @reyman64,VBA 绝对使用词法作用域,而不是动态的。您的困惑可能源于 VBA 确实允许 implicit 变量声明这一事实。因此,在您的示例中,第二个 myvar 对其例程是本地的。它在此处隐式声明,与第一个无关,它也是其自身例程的本地。 @Matt 建议您查看 VBA Option Explicit 的评论是了解正在发生的事情的关键。

标签: vb.net variables vba scoping


【解决方案1】:

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

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

还要注意Public 表示这些子程序对其他模块中的子程序可见。如果 Public 被省略或替换为 Private,try 和 displayVar 将仅在其模块中可见。

在下面的代码中,我将myVar 的值作为参数传递给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

【讨论】:

  • 嗯,我对这一切都很好,除了在 vba 中参数默认通过引用传递
  • @reyman64。感谢您指出我的错误。 VBA 不是我的主要编程语言,因为我更喜欢显式声明 ByRef 和 ByVal,所以我没有注意到 ByRef 是默认值。我喜欢这个网站,因为无论您认为自己知道多少,您仍然每天都能学到一些东西。再次感谢。
【解决方案2】:

变量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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多