VBA:使用未声明的变量?

时间:2014-07-14 14:34:27

标签: vba declaration

录制 SAP GUI脚本时,代码的第一行始终相同:

If Not IsObject(app) Then
   Set SapGuiAuto = GetObject("SAPGUI")
   Set app = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(Connection) Then
   Set Connection = app.Children(0)
End If
If Not IsObject(session) Then
   Set session = Connection.Children(0)
End If
If IsObject(WScript) Then
   WScript.ConnectObject session, "on"
   WScript.ConnectObject app, "on"
End If

在此代码中,使用了四个变量:appSapGuiAutoConnectionsession为什么这些变量可以在没有声明的情况下使用?我已经基于此创建了无数的脚本,并且一切都一直有效。不过,我不喜欢不了解自己的代码的感觉。 : - )

2 个答案:

答案 0 :(得分:2)

有两种可能性(可能更多)

  1. 这些是代码中某处的全局变量,可能在其他模块页面上
  2. Option Explicit已关闭(或者更确切地说,未明确指定)。
  3. 如果是案例2,我可以编写诸如

    之类的代码
    Sub Test()
        a = a + 1
        MsgBox(a)
    End Sub
    

    得到结果' 1'因为在这种情况下,VBA会自动创建一个变量' a'并将其初始化为0。

    根据首次使用新变量的方式,VBA可以初始化它。因此,为了安全起见,最好将Option Explicit写为模块中的第一行,然后继续对其余部分进行编码。

    这样做需要在使用之前明确声明任何变量。从那时起,编译器始终是一个很好的编码实践,它将捕获任何未初始化的变量并防止令人讨厌的运行时意外。

答案 1 :(得分:2)

除非你在每个模块的开头添加Option Explicit,否则VB / VBA将允许你使用变量而不用DIM它们(它会自动将它们作为变体DIM)。大多数情况下,这不会导致任何问题。当它确实引起问题时,迟早会出现问题,这将很难弄明白。

最佳做法是将Option Explicit置于每个模块的顶部。 VB / VBA将强制您在使用它们之前显式声明变量,因为它们已被声明,它不会让您将不适当的数据放入变量中。

在IDE中,工具|选项|编辑器选项卡,选中标记需要变量声明。 IDE将自动为所有新模块添加Option Explicit。除非你在Mac上工作,否则这个功能就会崩溃。