通过Excel VBA运行Access查询时出现间歇性错误

通过Excel VBA运行Access查询时出现间歇性错误,excel,ms-access,vba,Excel,Ms Access,Vba,我有一个.xlsm文件,它在一个新的电子表格中编译来自5个Access数据库表的条目,然后打开Access,并运行一些查询来更新主表(我知道,DBs的体系结构很糟糕…),问题(有时)出现在以下代码中 Dim accessApp Set accessApp = CreateObject("Access.Application") accessApp.UserControl = True accessApp.OpenCurrentDatabase ("G:\Dir1\Dir2\Processing

我有一个.xlsm文件,它在一个新的电子表格中编译来自5个Access数据库表的条目,然后打开Access,并运行一些查询来更新主表(我知道,DBs的体系结构很糟糕…),问题(有时)出现在以下代码中

Dim accessApp
Set accessApp = CreateObject("Access.Application")
accessApp.UserControl = True
accessApp.OpenCurrentDatabase ("G:\Dir1\Dir2\Processing Database.accdb")
DoCmd.SetWarnings False
DoCmd.OpenQuery "DeleteFTP", acViewNormal, acEdit

OpenQuery
行中,我得到一个“运行时错误2486,您目前无法执行此操作”,是否需要加载某种代码库或采取某种措施来防止此间歇性问题

尝试尽早绑定access应用程序

Dim accessApp As Access.Application
Set accessApp = New Access.Application
accessApp.UserControl = True
accessApp.OpenCurrentDatabase("G:\Dir1\Dir2\Processing Database.accdb")
accessApp.DoCmd.SetWarnings False
accessApp.DoCmd.OpenQuery "DeleteFTP", acViewNormal, acEdit
您可能还希望尝试以独占模式打开数据库

accessApp.OpenCurrentDatabase("G:\Dir1\Dir2\Processing Database.accdb", true)
我认为您的Processing Database.accdb数据库包含一个名为DeleteFTP的已保存查询,您希望执行该查询

如果这是真的,请使用应用程序对象
accessApp
限定
DoCmd

accessApp.DoCmd.OpenQuery“DeleteFTP”、acViewNormal、acEdit
请注意,如果Excel项目不包含Access引用,它将无法识别这些Access常量,
acViewNormal
acEdit
。在这种情况下,可以使用常量的值而不是它们的名称:

accessApp.DoCmd.OpenQuery“DeleteFTP”,0,1
然而,我不确定这些建议是否足够,因为您说问题是间歇性的,而且在我看来,您当前的代码总是会失败。所以还有一些我不明白的事情

关闭
SetWarnings
会抑制信息。我不知道它是否隐藏了本案的线索,但建议你无论如何避免。如果使用
DAO.Database.Execute
方法及其
dbFailOnError
选项来执行删除查询,则不需要它

“DoCmd.SetWarnings False
'DoCmd.OpenQuery“DeleteFTP”、acViewNormal、acEdit
accessApp.CurrentDb.Execute“DeleteFTP”,128'dbFailOnError=128

是否有其他用户访问此数据库?该表可能会因为这样的原因被锁定吗?也许……有没有办法确定是否有人在处理数据库中?在accdb文件所在的文件夹中有一个.laccdb文件,您可以使用文本编辑器读取该文件。只有当有人访问数据库时,文件才应该存在。谢谢,我将避免使用“SetWarnings”,并希望包含accessApp。prefix.Yes,如果是操作查询而不是数据请求,我建议对保存的查询使用Execute方法:accessApp.CurrentDb.QueryDefs(“DeleteFTP”)。Execute-您可以选择DBFailOneError标志,如果出现错误,将回滚删除,以及RecordsAffected属性,允许您捕获删除的记录数。