我正在与一个真正让我烦恼的VBA非交互式问题作斗争:我有一个mysql数据库的传递查询,如果用户双击它会很好。但如果从VBA自动化会话调用(从excel调用),如果先没有进行交互,则会失败。最奇怪的是:它可以在在GUI上点击一段时间后从VBA 中运行(可能是odbc mysql连接超时)。
passthrough-query在DSN和连接字符串中有密码(用于解决商店的问题)。链接表的行为相同。
有问题的VBA代码看起来像这样:
CurrentProject.Connection.Execute "INSERT INTO [SomeLocalTable] (id) SELECT id FROM [somePassThroughOrLinkedMySQLTable]"
错误是通用的odbc连接失败80004005。
虽然这种类型的查询始终有效:
Dim cnn As New ADODB.Connection
cnn.Open ("Driver=MySQL ODBC 5.2w Driver;SERVER=myserver;UID=user;DATABASE={db};PORT=3306;DFLT_BIGINT_BIND_STR=1;PWD=secret")
我可以像UI一样“初始化”直通查询以使其正常工作吗?或者我可以使用第二种类型的查询插入本地MS Access表吗?
环境:Win8-64bit,Office2013,mysql-odbc-5.2w
答案 0 :(得分:2)
我认为问题正在发生,因为您将Access数据库称为外部ADODB数据源,而是使用Access实例以通过DAO运行查询。下面的示例子项创建一个不可见的Access实例并执行查询,然后在完成后退出。我在这个例子中使用了DAO版本3.6的后期绑定,因此您可能需要稍微修改该位或使用早期绑定:
Sub ExecPassThru()
Dim acApp As Object
Dim acDb As Object
Set acApp = CreateObject("Access.Application")
Set acDb = CreateObject("DAO.DBEngine.36") 'May need slight alteration
acApp.OpenCurrentDatabase ("C:\db1.mdb") 'Amend as required
Set acDb = acApp.CurrentDb
acDb.Execute "INSERT INTO [SomeLocalTable] (id) SELECT id FROM [somePassThroughOrLinkedMySQLTable]"
acDb.Close
acApp.Quit 2
End Sub
这是使用Excel 2003编码的,但应该很容易转换为更高版本的办公室。