MS Access VBA:如果对象变量不是';未使用,是否超出了声明它们的范围?

MS Access VBA:如果对象变量不是';未使用,是否超出了声明它们的范围?,vba,variables,object,ms-access,Vba,Variables,Object,Ms Access,我经常看到代码示例,它们经历了一个费劲且可能令人困惑的过程,声明、设置、调用和任何相关的清理对象变量,否则,在没有变量的情况下可以正常工作,尤其是在该函数专用的变量上 在写出完整的参考资料时,这真的有必要吗 我听过一些争论,认为代码更容易阅读,运行更快。前者非常主观,而后者,我还没有真正注意到 实例 vs 我不是要把变量设置为“无”;我是问他们是否有必要。在提供的示例的范围内,这是必要的。简言之,没有必要将它们存储在局部变量中,因为在两个代码示例中引用是相同的。将它们设置为局部变量的原因是为了避

我经常看到代码示例,它们经历了一个费劲且可能令人困惑的过程,声明、设置、调用和任何相关的清理对象变量,否则,在没有变量的情况下可以正常工作,尤其是在该函数专用的变量上

在写出完整的参考资料时,这真的有必要吗

我听过一些争论,认为代码更容易阅读,运行更快。前者非常主观,而后者,我还没有真正注意到

实例

vs


我不是要把变量设置为“无”;我是问他们是否有必要。在提供的示例的范围内,这是必要的。

简言之,没有必要将它们存储在局部变量中,因为在两个代码示例中引用是相同的。将它们设置为局部变量的原因是为了避免必要的对象取消引用调用。在您的示例中,
DAO.DBEngine
被调用三次。每一个基本上都是一个函数调用,它会带来一些处理开销来检索您正在使用的对象引用。在上面的示例中,该函数调用只进行一次,结果缓存在局部变量引用中

如果不想声明局部变量,可以通过将使用相同引用的代码包装到
With
块中来执行相同的操作:

Public Sub TransactionExample()
    With DBEngine(0)
        On Error GoTo trans_Err
        .BeginTrans
        With CurrentDb
            .Execute "SomeActionQuery", dbFailOnError
            .Execute "SomeOtherActionQuery", dbFailOnError
        End With
        .CommitTrans
trans_Exit:
        .Close
        Exit Sub

trans_Err:
        .Rollback
        MsgBox "Transaction failed. Error: " & Err.Description
        Resume trans_Exit
    End With
End Sub
除非你用它做了大量的工作(即广泛地循环),否则无论你使用哪种方法,性能差异都可以忽略不计


注意-无需将变量设置为
Nothing
。当它们离开作用域时,运行时会处理这些问题。

简言之,否-没有必要将它们存储在局部变量中,因为两个代码示例中的引用都是相同的。将它们设置为局部变量的原因是为了避免必要的对象取消引用调用。在您的示例中,
DAO.DBEngine
被调用三次。每一个基本上都是一个函数调用,它会带来一些处理开销来检索您正在使用的对象引用。在上面的示例中,该函数调用只进行一次,结果缓存在局部变量引用中

如果不想声明局部变量,可以通过将使用相同引用的代码包装到
With
块中来执行相同的操作:

Public Sub TransactionExample()
    With DBEngine(0)
        On Error GoTo trans_Err
        .BeginTrans
        With CurrentDb
            .Execute "SomeActionQuery", dbFailOnError
            .Execute "SomeOtherActionQuery", dbFailOnError
        End With
        .CommitTrans
trans_Exit:
        .Close
        Exit Sub

trans_Err:
        .Rollback
        MsgBox "Transaction failed. Error: " & Err.Description
        Resume trans_Exit
    End With
End Sub
除非你用它做了大量的工作(即广泛地循环),否则无论你使用哪种方法,性能差异都可以忽略不计


注意-无需将变量设置为
Nothing
。运行时会在它们离开作用域时处理这些问题。

是的,有时确实需要这样做,特别是关于
CurrentDb
函数。请参阅下面评论中的相关问题。链接问题/答案的可能副本不会比您在这里做的更详细,老实说-是基于意见的,没有支持性的例子。我的回答不是基于意见,而是基于经验。我没有任何具体的例子,因为我几年前就不再做“错误的事情”,所以我最近没有浪费任何时间去追踪一个失败的案例。无意冒犯,但鉴于这样的性质,我有点期待答案能像问题一样完整。我几年前就停止给汽车喷漆了,我知道混合系统是不好的做法。但我不会告诉别人,也不会去做,除非我能用一个自信的,甚至是可以证明的理由来支持它;“为什么”这是个坏主意。是的,有时确实需要这样做,特别是在
CurrentDb
函数方面。请参阅下面评论中的相关问题。链接问题/答案的可能副本不会比您在这里做的更详细,老实说-是基于意见的,没有支持性的例子。我的回答不是基于意见,而是基于经验。我没有任何具体的例子,因为我几年前就不再做“错误的事情”,所以我最近没有浪费任何时间去追踪一个失败的案例。无意冒犯,但鉴于这样的性质,我有点期待答案能像问题一样完整。我几年前就停止给汽车喷漆了,我知道混合系统是不好的做法。但我不会告诉别人,也不会去做,除非我能用一个自信的,甚至是可以证明的理由来支持它;“为什么”这是个坏主意。抱歉,不是。
CurrentDb
是一个返回数据库对象副本的函数,在某些情况下,它的行为与正确的对象引用不一样。另外,不需要将对象变量设置为
Nothing
,但是长时间的VBA/VB6编码器会告诉您,如果不这样做,可能会导致一些相当模糊的应用程序失败。@GordThompson-如果您在上面的代码中注意到,只有当
With
块求值时才会调用它一次。因此,您的一个示例是有效的(我假设),但也有很多其他情况是不会的(同样,嵌套
块的做法不值得鼓励,因为它们可能是不明确的)@GordThompson-与块嵌套是一个品味问题,而不是任何其他问题。缩进可以清楚地显示引用的对象。带
块的
与局部变量之间没有功能上的区别-运行时只是在内部管理它,是的,在
E中将它设置为
Nothing
nd带有
语句。@Comintern没有什么扩展-只是一组操作查询,用正确的
事务
,和
错误捕获来替换当前嵌入的宏。
而不是用户禁用警告,就像他们现在做的那样…“您即将…”。I d
Public Sub TransactionExample()
    With DBEngine(0)
        On Error GoTo trans_Err
        .BeginTrans
        With CurrentDb
            .Execute "SomeActionQuery", dbFailOnError
            .Execute "SomeOtherActionQuery", dbFailOnError
        End With
        .CommitTrans
trans_Exit:
        .Close
        Exit Sub

trans_Err:
        .Rollback
        MsgBox "Transaction failed. Error: " & Err.Description
        Resume trans_Exit
    End With
End Sub