尝试控制VBA中的另一个数据库时出现间歇性错误
我有以下代码:
Dim obj As New Access.Application obj.OpenCurrentDatabase (CurrentProject.Path & "\Working.mdb") obj.Run "Routine" obj.CloseCurrentDatabase Set obj = Nothing
我正在尝试的问题是一个弹出窗口,告诉我Access无法将焦点放在另一个数据库上。从代码中可以看到,我想在另一个mdb中运行一个子例程。任何其他实现此目的的方式将不胜感激。
我正在使用MS Access 2003.
这是一个间歇性错误。由于这是生产代码,每个月只能运行一次,因此复制非常困难,并且目前我无法提供确切的文本和编号。这是第二个月了。
我怀疑有人在使用此数据库或者其他数据库时可能会发生这种情况。
数据流是每月在一个数据库中更新所有"项目",然后在另一个数据库中提供此信息。
也许是因为"常规"代码中的第一行:
如果vbNo = MsgBox("是否要更新?",vbYesNo,"更新")然后
退出功能
万一
我将创建另一个没有MsgBox的子例程。
我已经能够重现这种行为。当焦点必须转移到调用的数据库,但是用户在第一个数据库上设置了焦点([ALT] + [TAB])时,就会发生这种情况。 "解决方案"是教育用户。
这是一个间歇性错误。由于这是生产代码,每个月只能运行一次,因此很难复制,并且目前我无法提供确切的文本和编号。这是第二个月了。
我怀疑有人在使用此数据库或者其他数据库时可能会发生这种情况。
数据流是每月在一个数据库中更新所有"项目",然后在另一个数据库中提供此信息。
也许是因为"常规"代码中的第一行:
如果vbNo = MsgBox("是否要更新?",vbYesNo,"更新")然后
退出功能
万一
我将创建另一个没有MsgBox的子例程。
我已经在我们的开发数据库中进行了尝试,并且可以正常工作。这没有任何意义,因为其他代码在开发中也可以正常工作。
解决方案
回答
我猜这个错误消息链接到一个数据库的状态。我们在此处使用Jet连接和Access对象,由于多种原因(多用户环境,无法删除LDB Lock文件等),我们可能无法正确关闭活动数据库并打开另一个数据库。因此,根据我的说法,解决方案是忘记Jet引擎,并使用另一个连接来更新"其他"数据库中的数据。
当我们说"数据流每月要更新一个数据库中的所有'项目',然后使该信息在另一个数据库中可用"时,我假设"例程"的作用是通过SQL来更新某些数据。说明或者等效的记录集更新。
我们为什么不通过打开与其他数据库的连接来尝试进行相应的更新,并(1)发送相应的SQL指令,或者(2)打开记录集并进行请求的更新?
一个想法是例如:
Dim cn as ADODB.connexion, qr as string, rs as ADODB.recordset 'qr can be "Update Table_Blablabla Set ... Where ... 'rs can be "SELECT * From Table_Blablabla INNER JOIN Table_Blobloblo set cn = New ADODB.connexion cn.open You can here send any SQL instruction (with command object and execute method) or open and update any recordset linked to your other database, then cn.close
这也可以通过ODBC连接(和DAO.recordsets)来完成,因此我们可以选择自己喜欢的对象。
回答
如果我们想通过其他方式运行该功能,请尝试以下操作:
Dim obj As New Access.Application obj.OpenCurrentDatabase (CurrentProject.Path & "\Working.mdb") obj.DoCmd.RunMacro "MyMacro" obj.CloseCurrentDatabase Set obj = Nothing
如果" MyMacro"具有带有功能名称的" RunCode"操作,则我们希望在Working.mdb中执行
回答
我已经能够重现"开发"中的错误。
"此操作无法完成,因为另一个应用程序很忙。选择'切换到'以激活...。"
我真的看不到消息的其余部分,因为它的闪烁速度非常快。我猜这个错误是由于两个数据库之间的"切换"引起的。我希望,通过教育用户,这一过程将停止。
菲利普,答案当然是正确的。如果我没有事先开发"例程",我会选择该路径。
"我已经能够重现此行为。当焦点必须转移到调用的数据库,但是用户将焦点设置为[ALT] + [TAB]时,就会发生这种情况。教育用户。"由于无法阻止用户在Windows中切换应用程序,因此我想关闭这个主题。