2009-09-21 74 views
4

我们开发了一个合并函数,该函数将被其他进程使用并希望将函数定位到其自己的MDB中(称为“远程”),以便可以从其中引用和调用它“caller.mdb”在需要时。该函数旨在返回一个数组,并且在直接从“远程”内部调用执行时运行良好。但是,在“调用者”VBA项目中正确引用“远程”的情况下,当“调用者”进行调用时,函数返回错误。我们得到各种错误,如从另一个MDB调用一个MDB中的函数

3078: Jet cannot find the input table or query 

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

回答

5

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

Set db = CodeDb

+0

杰出。以前没有见过这个参考。不得不重构几行,但现在它的工作很好。谢谢。 – TonBill 2009-09-21 22:11:25

1

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

+0

您能在这里引用您网页上的一些相关部分吗?链接可能会死,没有它的内容这篇文章仅仅是对已接受的答案的评论 – 2017-04-19 09:47:02

1

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

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

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

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

另一方面,参数可能是变体,所以这种方法和使用Application.Run()返回的结构没有多大区别。

+0

我给了这一点,所以它会很高兴知道为什么osmeone从这个答案拿分。 – 2009-09-23 02:55:19

+0

这是使用代码数据库的记录和尝试和真实的方式,所以我不知道为什么有人会投票。也许我没有回答正确的问题。 – 2009-09-24 07:34:08

+0

请投票的人请解释一下这不是对问题的有效答案吗? – 2009-09-28 19:52:04

1

通过另一个MDB或ADP中的引用调用窗体和函数有许多差异和细微差别。在这两种情况下,我遇到了问题,并且您称之为“远程”数据库,我称之为中央库。

在我的提示和技巧页面http://www.mooresw.com/tips.php,我有页面致力于以编程方式更改引用,让Access搜索引用的文件而不是具有损坏的引用,并通过引用调用表单。

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

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

欲了解更多信息,请参阅我在提示页面上面的链接,特别是,请参阅:

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

我相信这是最符合您的情况。

相关问题