2011-08-17 29 views
1

我有一個Access 2003數據庫,它將動態加載MDB數據庫作爲庫引用。原因是這個數據庫是60多個應用程序數據庫的菜單前端。與其處理永久引用所有這些數據庫,菜單前端將動態引用用戶進行選擇時所需的內容。我正在將此數據庫移到Access 2010並創建自定義功能區。當色帶加載時,我開始使用here中的技術捕獲全局變量中的色帶對象。然後我遇到了問題,我可以驗證代碼是否正在運行,並且全局變量正確地分配了功能區引用,但是在數據庫運行完啓動例程後,該全局變量將重置爲Nothing。如何在動態加載參考後保存全局變量值?

爲了驗證發生了什麼,我創建了一個簡單的數據庫進行測試。在這個數據庫中,我有一個全局變量模塊:

Public obj as Object 

我再有這樣的功能:

Public Function SetObj() 

Set obj = Application 

Debug.Print "IsNothing=" & (obj Is Nothing) 

References.AddFromFile "Test.mdb" 

Debug.Print "IsNothing=" & (obj Is Nothing) 

End Function 

顯然,在我的代碼,「Test.mdb的」是指實際文件。如果我運行這段代碼,Debug.Print爲兩個實例提供了「IsNothing = False」,但是在函數完成後,如果等待幾秒鐘,Debug.Print會給我「IsNothing = True」。如果我註釋掉References.AddFromFile,無論等待多久,Debug.Print都會給我「IsNothing = False」。

對我來說這是有道理的,因爲Access加載庫後必須重新編譯VBA代碼,所有全局變量都被重置。我已經嘗試將全局變量移動到一個類中,但是因爲我需要一個全局變量,所以類變量會被重置。我嘗試在函數中使用局部變量來保存全局變量的值,但它看起來像Access在代碼運行完幾秒後等待重新編譯,所以這也不起作用。有沒有人有任何其他想法來實現這一點?

+0

我相信它更加用戶友好,併爲「無縫」體驗做出了貢獻。它還使數據庫之間共享信息變得更加容易。例如,我有一個報告表單,可以從任何數據庫運行任何報告。如果數據庫位於單獨的實例中,則無法從「報告」窗體中看到選擇。我現在的目標是在Access 2010中處理自定義功能區。由於不再可以使用CommandBars(謝謝,Microsoft!),並且沒有獲得Ribbon引用的編程方式,我需要將Ribbon對象保存在全局變量中。 – TheOtherTimDuncan

回答

1

我真的不知道這是否會解決這種引用的問題,但總的來說,我不使用公共變量來處理這種事情,而是在函數中使用STATIC變量。這將是這樣的:

Public Function SetObj() As Object 
    Static obj As Object 

    If (obj Is Nothing) Then 
     Set obj = Application 
    End If 
    Set SetObj = obj 
    End Function 

然後,你只是使用SetObj作爲使用你的應用程序的對象。在製作應用程序中,您也需要拆卸代碼,但我在此省略了。

我對此有所幫助,但您的代碼讓我覺得效率低下而且不完整。

+0

我曾嘗試使用靜態變量,但也重置。另外,我確實在其他場景中使用了您的方法,但爲了保存功能區參考的最終目標,我只有一次機會捕獲它,如果值丟失,則無法重新捕獲它。 – TheOtherTimDuncan

0

我想出了一個解決方案來解決我的問題,感謝@ David-W-Fenton,因爲你的回答給了我這個想法。我在庫數據庫中使用您的方法來緩存經常訪問的值,這些值存儲在表中,但在初始啓動後不會更改。每當參考文獻發生變化時,這些值都不會丟失,這就是燈泡點亮時的情況。

解決方法是將全局變量放入庫數據庫。 Access似乎只是重置數據庫中引用被加載到的全局變量 - 考慮之後纔有意義。因此,由於庫數據庫不是被重新編譯的數據庫,它不會重置全局(或私有或靜態)變量。

我最終做的是在現有的庫數據庫中創建一個新的模塊。它有一個私有變量和兩個方法 - 一個設置變量,一個獲取變量值。在我的菜單前端數據庫中,當功能區加載並調用回調函數時,不是將Ribbon對象保存在前端數據庫中,而是將其傳遞到此模塊以進行保存。無論何時將新數據庫動態添加到庫引用中,我現在都不會再丟失該功能區引用。