Access VBA:如果在重新使用之前确保将对象设置为“无”,为什么会出现重复声明错误?

Access VBA:如果在重新使用之前确保将对象设置为“无”,为什么会出现重复声明错误?,vba,ms-access,dao,ms-access-2013,Vba,Ms Access,Dao,Ms Access 2013,我有如下代码: If BLAH=BLAH Dim dbs As DAO.Database Dim rst As DAO.Recordset Dim qdf As DAO.QueryDef ...rest of code... 'Close stuff rst.Close dbs.Close Set dbs = Nothing Set rst = Nothing

我有如下代码:

If BLAH=BLAH

        Dim dbs As DAO.Database
        Dim rst As DAO.Recordset
        Dim qdf As DAO.QueryDef

...rest of code...

        'Close stuff
        rst.Close
        dbs.Close
        Set dbs = Nothing
        Set rst = Nothing
        Set qdf = Nothing

END IF

If FOO=FOO

        Dim dbs As DAO.Database
        Dim rst As DAO.Recordset
        Dim qdf As DAO.QueryDef

...rest of code...

        'Close stuff
        rst.Close
        dbs.Close
        Set dbs = Nothing
        Set rst = Nothing
        Set qdf = Nothing

END IF
但是在
FOO=FOO
部分,它突出显示了
dbs作为DAO.Database
,并给出了一个弹出的错误消息

编译错误:当前范围中的声明重复


我做错了什么?我认为这是可以的,因为我在重新使用之前否定了每个对象。首要目标是在表单计时器事件上运行大量的
IF
语句。我是否只需要在事件过程的顶部声明一些对象一次就可以避免此错误?

要在VBA的情况下解决此问题,变量声明对于给定的子/函数例程,甚至对于给定的模块都是全局的

对于这里的大多数人来说,海报问题似乎很奇怪,但请记住,在vb.net中,变量定义是发布的if/then代码块的局部变量

这在VBA中是失败的,但在vb.net中是完全合法的:

    If True Then
        Dim a As Long
        a = 5
    End If

    If True Then
        Dim a As Long
        a = 6
    End If
如果您希望该变量能够在两个if/then块中使用,那么您可以使用:

    Dim a As Long
    If True Then
        a = 5
    End If

    If True Then
        a = 6
    End If

因此,在VBA中,变量范围是函数/子例程的局部范围。在vb.net中,范围是if/then块的本地范围。这意味着在某些编程语言中,您可以在函数/子例程中多次声明变量,并且不会收到任何编译错误,即使在option explicit生效时也是如此。我还应该指出,在上面的vb.net代码示例中,当代码退出if/then块时,第一个代码示例中的给定变量将超出范围。因此,在VBA中,变量声明不是if/then块的局部声明。我还应该指出,我使用了单词“local”scope,因为if/then代码是编译的,“dim”语句的if/then不是在运行时出现的,而是在编译时出现的。换句话说,“true”或“false”并不意味着变量的“dim”和declare不会发生,而只是表示变量对于if/then块是“局部的”。dim语句不是有条件运行的,而是在编译时创建的。

要在VBA的情况下解决此问题,变量声明对于给定的子/函数例程,甚至对于给定的模块都是全局的

对于这里的大多数人来说,海报问题似乎很奇怪,但请记住,在vb.net中,变量定义是发布的if/then代码块的局部变量

这在VBA中是失败的,但在vb.net中是完全合法的:

    If True Then
        Dim a As Long
        a = 5
    End If

    If True Then
        Dim a As Long
        a = 6
    End If
如果您希望该变量能够在两个if/then块中使用,那么您可以使用:

    Dim a As Long
    If True Then
        a = 5
    End If

    If True Then
        a = 6
    End If

因此,在VBA中,变量范围是函数/子例程的局部范围。在vb.net中,范围是if/then块的本地范围。这意味着在某些编程语言中,您可以在函数/子例程中多次声明变量,并且不会收到任何编译错误,即使在option explicit生效时也是如此。我还应该指出,在上面的vb.net代码示例中,当代码退出if/then块时,第一个代码示例中的给定变量将超出范围。因此,在VBA中,变量声明不是if/then块的局部声明。我还应该指出,我使用了单词“local”scope,因为if/then代码是编译的,“dim”语句的if/then不是在运行时出现的,而是在编译时出现的。换句话说,“true”或“false”并不意味着变量的“dim”和declare不会发生,而只是表示变量对于if/then块是“局部的”。dim语句不是有条件运行的,而是在编译时创建的。

正如它所说的,您声明它两次,只需要dim一次。所以,就在你第一次做dim之前,没有必要,就用它。是的,我在等待的时候摆弄它,只是简单地注释出另一个
dim
,它使错误消失了。我现在很好奇为什么在“Close stuff”下使用代码并没有否定这些对象的初始化。使用
Dim
只是告诉编译器“我将使用
Y
类型的名为
X
”的变量-它与实际填充或清除该变量无关(将尺寸X用作新Y时除外)将变量设置为Nothing不会删除变量本身,它仍然存在,但不再指向任何对象。这就像说,如果你有一栋带车库的房子,但出售了汽车,你仍然会有车库,因此当你关闭它们时,它们仍然存在。它们在其作用域的末尾被正确地销毁
Dim a As Excel.Set a=工作簿。添加调试。打印类型名称(a)设置a=无调试。打印类型名称(a)设置a=工作簿。添加调试。打印类型名称(a)
还要注意编译错误和运行时错误之间的区别。您在问题中描述的内容只能在运行时检测到。但是您会遇到编译错误,因此无论您是否设置变量都不会产生任何影响。/Sherlock确切地说,您声明了两次,只需要调暗一次。所以就在之前你第一次如果做dim,那么没有必要,就用它吧。是的,我在等待的时候摆弄它,简单地注释掉另一个
dim
,错误就消失了。我现在很好奇为什么在“Close stuff”下使用代码不会否定这些对象的初始化。使用
dim
只会告诉编译器“我将使用类型为
Y
的名为
X
的变量”-它与实际填充或清除该变量无关(除非使用
Dim X作为新的Y
)将变量设置为Nothing不会删除变量本身,它仍然存在,但不再指向任何对象。这就像说,如果你有一栋带车库的房子,但出售了汽车,你仍然会有车库,因此当你关闭它们时,它们仍然存在。它们在其作用域的末尾被正确地销毁
Dim a As Excel.Set a=工作簿。添加调试。打印类型名称(a)集a=无调试。打印类型名称(a)集