VBA:使用未声明的变量?
录制SAP GUI脚本时,代码的前几行始终相同:VBA:使用未声明的变量?,vba,declaration,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
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
在此代码中,使用了四个变量:
app
、SapGuiAuto
、Connection
和session
为什么不用声明就可以使用这些变量?我已经在此基础上编写了无数脚本,而且一切都一直有效。但是,我不喜欢不理解自己代码的感觉。:-) 有两种可能性(可能更多)
选项Explicit
已关闭(或者未明确指定)Sub Test()
a = a + 1
MsgBox(a)
End Sub
并获取结果“1”,因为在这种情况下,VBA会自动创建变量“a”,并将其初始化为0
根据新变量首次使用的方式,VBA可以对其进行初始化。因此,为了安全起见,最好将Option Explicit
作为模块的第一行,然后继续编写其余的代码
这样做需要在使用任何变量之前显式声明它们。从那时起,编译器将捕获任何未初始化的变量并防止令人不快的运行时意外事件,这始终是一种良好的编码实践。有两种可能性(可能更多)
选项Explicit
已关闭(或者未明确指定)Sub Test()
a = a + 1
MsgBox(a)
End Sub
并获取结果“1”,因为在这种情况下,VBA会自动创建变量“a”,并将其初始化为0
根据新变量首次使用的方式,VBA可以对其进行初始化。因此,为了安全起见,最好将Option Explicit
作为模块的第一行,然后继续编写其余的代码
这样做需要在使用任何变量之前显式声明它们。从那时起,这一直是一种很好的编码实践,编译器将捕获任何未初始化的变量,并防止令人讨厌的运行时意外事件。除非在每个模块的开头添加Option Explicit,否则VB/VBA将允许您使用变量,而不会使它们变暗(它会自动将它们变暗为变量)。大多数情况下,这不会导致任何问题。当它真的引起了问题,而且迟早会引起问题时,就很难弄清楚了 最佳实践是将选项显式放在每个模块的顶部。然后,VB/VBA将强制您在使用变量之前显式声明变量,因为它们已声明,所以它不会让您将不适当的数据放入变量中
在IDE的“工具|选项|编辑器”选项卡中,选中标记需要变量声明。IDE将自动为您的所有新模块添加显式选项。除非您使用的是Mac电脑,而Mac电脑的这一功能已经失效。除非您在每个模块的开头添加了Option Explicit,否则VB/VBA将允许您使用变量,而不会使变量变暗(它会自动将变量变暗)。大多数情况下,这不会导致任何问题。当它真的引起了问题,而且迟早会引起问题时,就很难弄清楚了 最佳实践是将选项显式放在每个模块的顶部。然后,VB/VBA将强制您在使用变量之前显式声明变量,因为它们已声明,所以它不会让您将不适当的数据放入变量中
在IDE的“工具|选项|编辑器”选项卡中,选中标记需要变量声明。IDE将自动为您的所有新模块添加显式选项。除非您在Mac电脑上工作,否则此功能已损坏。从您显示的代码片段很难判断。但可能未设置显式选项。这是唯一的代码@0xA3。将其放入
子文件,它将像一个好孩子一样连接到您的SAP。@Leewite,答案对您有用吗?从您显示的代码片段很难判断。但可能未设置显式
选项。这是唯一的代码@0xA3。将其放入子文件,它将像一个好孩子一样连接到您的SAP。@leewite,答案对您有用吗?@leewite是的,它是一个局部变量;如果未初始化任何内容,则会创建一个变量类型变量,它可以处理多种数据类型。但是1)它会影响性能,因为变量比原始数据类型慢一个数量级;2)显式声明/初始化变量比让编译器决定并执行更好的设计实践。@leewite是的,它是一个局部变量;如果未初始化任何内容,则会创建一个变量类型变量,它可以处理多种数据类型。但是1)它会影响性能,因为变量比原始数据类型慢一个数量级;2)明确声明/初始化变量比让编译器决定并这样做更好。