2009-09-21 59 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

我相信這是最符合您的情況。

相關問題