关于vba:尝试控制另一个数据库时出现间歇性错误

关于vba:尝试控制另一个数据库时出现间歇性错误

Intermittent error when attempting to control another database

我有以下代码:

1
2
3
4
5
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的子例程。

我已经在我们的开发数据库中进行了尝试,并且可以正常工作。这没有任何意义,因为其他代码在开发中也可以正常工作。


我已经能够重现"开发"中的错误。

"此操作无法完成,因为另一个应用程序很忙。选择'切换到'以激活...。"

我真的看不到其余信息,因为它闪烁得非常快。我猜这个错误是由于两个数据库之间的"切换"引起的。我希望通过教育用户可以停止这种情况。

菲利普,您的答案当然是正确的。如果没有事先开发"例程",我会选择该路径。

"我已经能够重现此行为。当焦点必须转移到被调用的数据库,但是用户在第一个数据库上设置了焦点([ALT] + [TAB])时,就会发生这种情况。"解决方案"是教育用户。"由于无法阻止用户在Windows中切换应用程序,因此我想关闭这个主题。


如果您想通过其他方式运行该功能,请尝试以下操作:

1
2
3
4
5
6
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中执行


我猜这个错误消息链接到您的数据库之一的状态。您在此处使用Jet连接和Access对象,由于多种原因(多用户环境,无法删除LDB Lock文件等),您可能无法正确关闭活动数据库并打开另一个数据库。因此,根据我的说法,解决方案是忘记Jet引擎,并使用另一个连接来更新"其他"数据库中的数据。

当您说"数据流每月要更新一个数据库中的所有'项目',然后使该信息在另一个数据库中可用"时,我假设"常规"的作用是通过SQL更新某些数据说明或等效的记录集更新。

为什么不通过打开与其他数据库的连接来尝试进行相应的更新,并(1)发送相应的SQL指令,或者(2)打开记录集并进行请求的更新?

一个想法是例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)完成,因此您可以选择自己喜欢的对象。


推荐阅读