从另一个MDB在一个MDB中调用函数

时间:2009-09-21 17:48:01

标签: ms-access vba

我们已经开发了一个合并函数,将被其他进程使用,并希望将函数放在自己的MDB中(称之为“远程”),以便在需要时可以从“caller.mdb”引用和调用它。 。该函数旨在返回一个数组,并在直接从“远程”中调用时执行。但是,在“调用者”VBA项目中正确引用“远程”时,当“调用者”进行调用时,该函数将返回错误。我们遇到了各种错误,例如

3078: Jet cannot find the input table or query

问题。在“远程”中,如何正确设置对db及其本地对象的引用(例如,一个表和几个查询,包括INSERT和UPDATE查询)? CurrentDB显然不是答案;我们还尝试了AccessObject和CodeData对象。 “远程”和“呼叫者”当前驻留在同一个驱动器上,因此这似乎不是问题所在。

4 个答案:

答案 0 :(得分:5)

您可以使用CodeDb代替CurrentDb,它指向当前正在执行代码的mdb。

Set db = CodeDb

答案 1 :(得分:3)

Access本身执行此操作的方式(所有向导都在Access中编程)是使用Application.Run。它确实意味着您调用的代码必须是一个函数,尽管它返回的内容并不重要。 Application.Run不需要引用,只需要一个路径:

  Application.Run("MyCodeDatabase.MyFunction()")

显然,如果代码数据库不在Access使用的路径中(包括其自己的应用程序文件夹(包括用户配置文件中特定于应用程序的文件夹)和存储主应用程序前端的文件夹),我需要指定完整路径。

Application.Run()是一个返回值的函数,但它被键入为variant。这可能适用于您的阵列,也可能不适用。从对象浏览器中不清楚参数是否通过ByVal或ByRef传递,但如果它们是ByRef(这是我期望的),你可能只是传入数组并让函数在它上面工作然后使用在远程数据库中的代码完成之后。

另一方面,参数可能是变体,因此该方法与仅使用Application.Run()返回的结构之间没有太大区别。

答案 2 :(得分:1)

Marcand给了你当前问题的答案。使用加载项或引用的Access数据库时还有其他问题和烦恼。请参阅我的Add-in Tips, Hints and Gotchas页面。

答案 3 :(得分:1)

通过另一个MDB或ADP中的引用来调用表单和函数存在许多差异和细微差别。我在两种情况下遇到了问题,你所指的是"遥控器"数据库,我称之为中央库。

在我http://www.mooresw.com/tips.php的提示与技巧页面上,我有专门用于以编程方式更改引用的页面,获取Access以搜索引用的文件而不是使用损坏的引用,并通过引用调用表单。

将数据库从开发环境发布到用户或生产环境时,需要以编程方式更改引用。在开发文件夹中工作时,程序可以直接引用中央库,但我们不希望20个用户正在运行的代码在我们的开发区域中占用中央库。 (通过引用打开的MDB文件被锁定,就像您的用户直接打开它一样)

在没有链接或表的中央库(或#34;远程"数据库)中运行表单的情况可能很棘手。在那种情况下,我选择打开与" caller.mdb"的连接。在窗体的open事件中使用带有Jet连接字符串的ADO代码。这样做可以使表单中的代码(或库中的函数)能够访问调用mdb中的表和查询。

有关详细信息,请参阅上面提示链接中的我的页面,特别是请参阅:

http://www.mooresw.com/call_a_form_in_another_MDB_through_a_reference.php

我认为这与您的情况最相关。