2012-06-11 51 views
1

在訪問數據庫中,我有一個小函數,它在啓動時調用,它註冊一個用於生成條形碼的軟件。從宏中調用函數的VBA錯誤處理

當軟件沒有安裝,然後微軟訪問運行時錯誤,所以我想添加一些適當的錯誤處理,通知用戶什麼是導致問題。

此函數在啓動時從宏中調用,並正在崩潰數據庫而不是錯誤處理正常工作。

我的錯誤處理是否正確?

Public Function LicenseTBarCode() 
On Error GoTo Err_LicenceTBarCode 

Dim TB As New TBarCode10 
TB.LicenseMe "<EXPUNGED>", eLicKindSite, 1, "<EXPUNGED>", eLicProd1D 
Set TB = Nothing 
Exit Function 

Err_LicenceTBarCode: 
MsgBox "TBarcode Software is not installed. Please contact the database administrator.", vbExclamation, Error 
DoCmd.Quit 
End Function 
+1

您的錯誤代碼是一般的方式,但我懷疑這個問題是在'作爲新的TBarCode10'暗淡的TB。這表明您已經創建了相關圖書館的參考,這是這種情況嗎? – Fionnuala

+0

是的,有一個使用的類型庫。當庫不可用時會發生此問題。 我曾經想過,如果找不到庫,那麼它會去錯誤處理程序。 – VBwhatnow

+1

您應該閱讀http://www.accessmvp.com/djsteele/AccessReferenceErrors.html – Fionnuala

回答

3

更改代碼以使用後期綁定:

Public Function LicenseTBarCode() 
On Error GoTo Err_LicenceTBarCode 

    Dim TB 
    Set TB = CreateObject("TBarCode10.TBarCode10") 
    TB.LicenseMe "<EXPUNGED>", eLicKindSite, 1, "<EXPUNGED>", eLicProd1D 
    Set TB = Nothing 
    Exit Function 

Err_LicenceTBarCode: 
    MsgBox "TBarcode Software is not installed. Please contact the database administrator.", vbExclamation, Error 
    DoCmd.Quit 
End Function 

爲了這個工作得很好,你真的需要使用您的所有的TBarCode代碼後期綁定,包括任何其他的TBarCode對象你可能正在使用。如果您還不熟悉延遲綁定,那麼首先需要理解一些難題,特別是如果您正在使用任何使用工廠模式的類。

通過後期綁定,您將取消選中對DLL的引用,然後您的代碼需要編譯時不會出錯。由於您無法訪問智能感知,因此使用延遲綁定進行開發可能具有挑戰性。最好使用Early Binding進行開發,然後將代碼轉換爲Late Binding。

您在Late Binding中丟失的另一件事是在原始對象中定義的任何常量。你必須自己創造這些。根據您需要使用的數量以及您需要使用它們的位置,創建一個模塊來保存這些常量可能是最簡單的。你真的只需要在你的代碼中實際使用的常量。

Global Const eLicKindSingle = 1 'Single license for exactly one computer 
Global Const eLicKindSite = 2 'Site license for an arbitrary number of computers within one site (or one facility) at one legal address 
Global Const eLicKindDeveloper = 3 'Developer license for redistribution to 3rd party 
Global Const eLicKindWeb = 3 'Web-server license 

Global Const eLicProd1D = 32 '(1D codes) 
Global Const eLicProd2D = 33 '(2D codes) 

或者,您可以使用常量包含的值。例如:

TB.LicenseMe "<EXPUNGED>", 2, 1, "<EXPUNGED>", 32 

此外,據我所知晚期綁定不適用於ActiveX控件。 ActiveX控件本質上是早期的。

還有另一種解決這個問題的方法。我使用「starter」數據庫文件來處理主數據庫的一些先決條件。該入門數據庫不使用任何引用。它只檢查文件系統以查看是否安裝了正確的文件。如果它們不是,它會彈出一個帶有正確錯誤/警告的消息框,然後它會運行主數據庫文件或選擇不運行它,具體取決於您寫入的邏輯。這是避免使用Late Binding的一種方法。

+0

這個答案有點奏效。數據庫在未安裝類型庫時仍然崩潰。 – VBwhatnow

+0

我很抱歉,我沒有在References對話框中關閉Reference。 我接受此答案 – VBwhatnow