从Excel VBA运行Access查询
我试图在excel vba中编写一个宏,它只需打开access数据库并在access中运行2个查询。它似乎可以工作,并且每单击两次宏按钮就运行一次查询。我的意思是我点击它,它工作,第二次点击我在第二次点击时得到“运行时错误462”,第三次点击它工作,第四次点击我再次得到错误,依此类推。我似乎不明白为什么会这样。下面是代码从Excel VBA运行Access查询,vba,excel,ms-access,Vba,Excel,Ms Access,我试图在excel vba中编写一个宏,它只需打开access数据库并在access中运行2个查询。它似乎可以工作,并且每单击两次宏按钮就运行一次查询。我的意思是我点击它,它工作,第二次点击我在第二次点击时得到“运行时错误462”,第三次点击它工作,第四次点击我再次得到错误,依此类推。我似乎不明白为什么会这样。下面是代码 Sub QueryAccess1() Dim db As Access.Application Set db = New Access.Application 'set va
Sub QueryAccess1()
Dim db As Access.Application
Set db = New Access.Application
'set variables
db.Visible = True
db.OpenCurrentDatabase ("DatabaseFileName")
'open database
'--------------------------------------------------------------
On Error Resume Next
db.DoCmd.DeleteObject acTable, "TableName"
'if the table does not exist it skips this line
'--------------------------------------------------------------
On Error GoTo 0
'sets the error back to normal
'--------------------------------------------------------------
CurrentDb.Openrecordset ("QUERY1")
CurrentDb.Execute ("QUERY2")
'Calls the queries
'--------------------------------------------------------------
'--------------------------------------------------------------
db.CloseCurrentDatabase
db.Quit
'Closes Access
'--------------------------------------------------------------
Set db = Nothing
End Sub
当我得到这个错误时,我就在线上得到了它
CurrentDb.Openrecordset ("QUERY1")
每两次单击一次的错误很可能是由于每隔一次打开刚被删除的表而导致的。考虑通过MS Access的集合迭代以有条件地删除对象,如果存在的话。然后,在调用之前重新排序要运行的操作查询 旁白-避免在VBA中使用错误恢复下一步时的
。始终积极预测和处理异常
或者,不必使用make table命令SELECT*INTO
然后担心以编程方式删除表,只需创建一次表,然后使用每次都可以运行的DELETE
和INSERT
。当然,这假定表的结构(字段/类型)保持不变
从myTable中删除;
插入myTable(Col1、Col2、Col3)
从myOtherTable中选择Col1、Col2、Col3;
从myTable中选择*;
最后,没有理由仅仅为了运行查询而使用MS Access对象库来打开/关闭.GUI。由于Access是一个数据库,所以可以像任何其他后端(即SQLite、Postgres、Oracle)一样连接到它并从那里运行查询。下面是一个ODBC连接示例,该驱动程序可以轻松地与其他RBDM的驱动程序交换
Dim conn As Object, rst As Object
Set conn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
' OPEN CONNECTION
conn.Open "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};" _
& "DBQ=C:\Path\To\Access\DB.accdb;"
' RUN ACTION QUERIES
conn.Execute "DELETE FROM myTable"
conn.Execute "INSERT INTO myTable (Col1, Col2, Col3)" _
& " SELECT Col1, Col2, Col3 FROM myOtherTable"
' OPEN RECORDSET
rst.Open "SELECT * FROM myQuery", conn
' OUTPUT TO WORKSHEET
Worksheets("DATA").Range("A1").CopyFromRecordset rst
rst.Close
事实上,上述方法甚至不需要安装MS Access GUI.exe!另外,请确保在Access中保存SELECT
查询(即使是INSERT
中的一个查询),并且不要作为VBA SQL字符串运行,因为Access引擎将为存储的查询保存最佳执行计划。我设法使它与Parfait的方法一起工作。这是我得到的
Sub QueryAccess1()
Dim conn As Object, rst As Object
Dim path As String
Set conn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
path = Sheets("SheetName").Range("A1")
'OPEN CONNECTION
conn.Open ConnectionString:="Provider = Microsoft.ACE.OLEDB.12.0; data source=" & path
'DELETES TABLE CONTENTS
conn.Execute "DELETE FROM [Table1]"
'RUN UNION QUERY AND INSERT INTO TABLE
rst.Open "SELECT * FROM [Query1]", conn
conn.Execute "INSERT INTO [Table1] select * from [QUERY1] "
Set rst = Nothing: Set conn = Nothing
End Sub
请尝试OpenQuery,而不是Openrecordset。如果这不起作用,您可以在编辑模式下打开查询,查看SQL视图并在VBA Excel上生成/使用SQL。Query2是否创建表“TableName”?也许这就是为什么odd失败的逻辑?是的,Query2确实创建了“TableName”,但我不确定这是否是个问题,因为我首先删除了表(如果它存在)?哪一行给出了错误?我在'CurrentDb.Openrecordset(“QUERY1”)'Hi Parfait的第行得到了错误,我想我需要打开Access Gui并运行查询,因为第二个查询在Access中创建了一个表,所以我想关闭Access,以便文件现在与新表一起保存,或者我可以在不打开Access的情况下执行此操作吗?此外,我还尝试删除“on error resume next”行,并将其添加到您的循环中,以查找表是否存在。这确实有效,但令人沮丧的是,我遇到了同样的问题,即我第二次运行代码时出现了相同的运行时错误:(我应该提到我第二次在db运行代码时出错。Visible=TrueCREATE TABLE
…SELECT*INTO
是SQL-DDL命令,因此您不需要GUI。exe。MS Access是一种独特的软件,同时作为后端和前端。只有在处理前端应用程序项(如表单/报表/宏/模块)时,您才需要它。)GUI。请参阅使用建议的正确错误处理进行编辑,在错误恢复下一步时切勿使用。
。然后,检查弹出的错误消息以正确查看要处理的问题。通常,发布的解决方案永远不会完全符合您的需要。OPs通常需要进行调整。这里唯一真正的区别是使用OLEDB提供程序而不是ODBC驱动程序。最后,在这段代码中,您永远不会使用rst,因此请删除它的集
和。打开
行,然后运行操作查询。
Sub QueryAccess1()
Dim conn As Object, rst As Object
Dim path As String
Set conn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
path = Sheets("SheetName").Range("A1")
'OPEN CONNECTION
conn.Open ConnectionString:="Provider = Microsoft.ACE.OLEDB.12.0; data source=" & path
'DELETES TABLE CONTENTS
conn.Execute "DELETE FROM [Table1]"
'RUN UNION QUERY AND INSERT INTO TABLE
rst.Open "SELECT * FROM [Query1]", conn
conn.Execute "INSERT INTO [Table1] select * from [QUERY1] "
Set rst = Nothing: Set conn = Nothing
End Sub