VBA在关闭Access连接时崩溃Excel

VBA在关闭Access连接时崩溃Excel,vba,ms-access,ado,Vba,Ms Access,Ado,下面的VBA代码从Excel中创建一个新数据库,并向其中添加一个表。在生产线关闭之前,一切都很顺利。此行导致Excel因BEX错误而崩溃。如果我注释掉该行,代码运行正常,但数据库锁仍然存在。任何帮助都将不胜感激 Option Explicit Sub openADB() Dim adoxTab As ADOX.Table Dim adoxCat As ADOX.Catalog Dim adoxCol As ADOX.Column Dim adoxInd As N

下面的VBA代码从Excel中创建一个新数据库,并向其中添加一个表。在生产线关闭之前,一切都很顺利。此行导致Excel因BEX错误而崩溃。如果我注释掉该行,代码运行正常,但数据库锁仍然存在。任何帮助都将不胜感激

Option Explicit

Sub openADB()
    Dim adoxTab As ADOX.Table
    Dim adoxCat As ADOX.Catalog
    Dim adoxCol As ADOX.Column
    Dim adoxInd As New ADOX.Index
    Dim objConn As New ADODB.Connection
    Dim oCatalog As Object

    Const DB_NAME = "item_details.accdb"
    Const DB_PATH = "c:\temp\"

    'create the database
    Set oCatalog = CreateObject("ADOX.Catalog")
    oCatalog.Create "Provider='Microsoft.ACE.OLEDB.12.0';Data Source=" & DB_PATH & DB_NAME

    objConn.Open "Provider='Microsoft.ACE.OLEDB.12.0';Data Source=" & DB_PATH & DB_NAME
    If (objConn.State <> adStateOpen) Then
        MsgBox "A connection to the database " & DB_PATH & DB_NAME & " could not be established. Program terminated."
        objConn.Close
        Set objConn = Nothing
        End
    End If

    'create a table for currency
    Set adoxTab = CreateObject("ADOX.Table")
    Set adoxCat = CreateObject("ADOX.Catalog")
    Set adoxCat.ActiveConnection = objConn

    'field properties
    adoxTab.Name = "tblCurrency"
    adoxTab.Columns.Append "Currency", adVarWChar, 3
    adoxTab.Columns.Append "Factor", adSingle

    adoxTab.Columns("Currency").ParentCatalog = adoxCat
    adoxTab.Columns("Currency").Properties("JET OLEDB:Compressed Unicode Strings") = True
    adoxTab.Columns("Currency").Properties("JET OLEDB:Allow Zero Length") = False
    adoxTab.Columns("Currency").Properties("Nullable") = True

    adoxTab.Columns("Factor").ParentCatalog = adoxCat
    adoxTab.Columns("Factor").Properties("Nullable") = True

    adoxCat.Tables.Append adoxTab

    'set up a primary key for Item
    adoxTab.Keys.Append "PrimaryKey", adKeyPrimary, "Currency"

    'give back memory
    Set adoxCat = Nothing
    Set adoxTab = Nothing
    Set oCatalog = Nothing

    objConn.Close '<== this is the line that causes the error
    Set objConn = Nothing
End Sub
选项显式
亚开行()
将adoxTab设置为ADOX.表
Dim adoxCat作为ADOX.Catalog
将adoxCol设置为ADOX.列
Dim Adoxin作为新的ADOX.索引
Dim objConn作为新的ADODB.连接
将oCatalog作为对象
Const DB_NAME=“item_details.accdb”
Const DB_PATH=“c:\temp\”
'创建数据库
Set oCatalog=CreateObject(“ADOX.Catalog”)
oCatalog.Create“Provider='Microsoft.ACE.OLEDB.12.0';Data Source=“&DB\u PATH&DB\u NAME
objConn.Open“Provider='Microsoft.ACE.OLEDB.12.0';Data Source=“&DB\u PATH&DB\u NAME
如果(objConn.State adStateOpen),则
MsgBox“与数据库的连接”&DB\u PATH&DB\u NAME&“无法建立。程序已终止。”
结束
Set objConn=Nothing
终点
如果结束
'为货币创建表
设置adoxTab=CreateObject(“ADOX.Table”)
设置adoxCat=CreateObject(“ADOX.Catalog”)
设置adoxCat.ActiveConnection=objConn
'字段属性
adoxTab.Name=“tblCurrency”
adoxTab.Columns.Append“Currency”,adVarWChar,3
adoxTab.Columns.Append“Factor”,adSingle
adoxTab.Columns(“货币”).ParentCatalog=adoxCat
adoxTab.Columns(“Currency”).Properties(“JET OLEDB:压缩Unicode字符串”)=True
adoxTab.Columns(“Currency”).Properties(“JET OLEDB:允许零长度”)=False
adoxTab.Columns(“Currency”).Properties(“null”)=True
adoxTab.Columns(“Factor”).ParentCatalog=adoxCat
adoxTab.Columns(“Factor”).Properties(“null”)=True
adoxCat.Tables.Append adoxTab
'为项目设置主键
adoxTab.Keys.Append“PrimaryKey”,adKeyPrimary,“Currency”
“还给我记忆
设置adoxCat=Nothing
设置adoxTab=Nothing
设置oCatalog=Nothing

objConn.Close'这不重要,但无论如何,尝试将
Dim objConn声明为ADODB.Connection
而不使用
New
,并在下一行将其设置为
New ADODB.Connection
。适用于ADO/X v2.8。set
set adoxCat.ActiveConnection=Nothing
是否释放锁?可能不会有任何区别,但请尝试
adoxCat.ActiveConnection.Close
而不是早期绑定。您可以将
Set a=CreateObject(“b”)
替换为
Set a=new b
,这很可能与您的问题无关,但是您应该将
End
替换为
Exit Sub
,这样您就可以在这种情况下正常退出了-
End
确实拔出了插头,硬停。感谢大家的投入。ADO/XV2.8接受编写的代码,ADO/X6.1也接受编写的代码。出现错误时,我正在使用ADO/XV6.0。Alex K关于ActiveConnection.Close的建议解决了v6.0的问题。这不重要,但无论如何,请尝试将
Dim objConn声明为ADODB.Connection
而不声明
New
,并在下一行将其设置为
New ADODB.Connection
。适用于ADO/X v2.8。set
set adoxCat.ActiveConnection=Nothing
是否释放锁?可能不会有任何区别,但请尝试
adoxCat.ActiveConnection.Close
而不是早期绑定。您可以将
Set a=CreateObject(“b”)
替换为
Set a=new b
,这很可能与您的问题无关,但是您应该将
End
替换为
Exit Sub
,这样您就可以在这种情况下正常退出了-
End
确实拔出了插头,硬停。感谢大家的投入。ADO/XV2.8接受编写的代码,ADO/X6.1也接受编写的代码。出现错误时,我正在使用ADO/XV6.0。Alex K关于ActiveConnection.Close的建议解决了v6.0的问题。