2015-03-02 24 views
1

說我有一類TestClass,定義如下:將課程設置爲PublicNotCreatable的潛在後果是什麼?

Option Explicit 

Public x As Variant 

我想要的工作簿打開時創建這個類的一個實例,並在其他工作簿事件中使用的。所以ThisWorkbook模塊中,我補充一下:

Public tc As TestClass 

Private Sub Workbook_Open() 

Set tc = New TestClass 
tc.x = "abc" 

End Sub 

當我編譯此,我得到一個錯誤:

Private object modules cannot be used in public object modules as 
parameters or returns types for public procedures, as public data 
members, or as fields of public user defined types 

我能夠去的屬性窗口TestClass和設置實例來解決這個到PublicNotCreatable。看起來,這並沒有影響該類的行爲,也沒有影響我在此VBA項目的各種功能中創建本地實例的能力。更改此Instancing設置是否有任何潛在的問題?

回答

3

PublicNotCreatable是您可以在不同的VBProject中使用該類。 NotCreatable部分意味着任何VBProject宿主類都必須創建任何新實例並將其傳遞給其他VBProject。另一個VBProject不能單獨創建它們。

你想要做的是標準模塊中的Public tc As TestClass並保持你的類實例私人。在標準模塊中聲明一個變量公共變量使得該變量在項目中隨處可見。

您所做的是創建Workbook對象的ThisWorkbook實例的自定義屬性。 ThisWorkbook是一個類模塊(工作表模塊和用戶表單也是如此)。這些類模塊是特殊的,因爲它們有一個用戶界面組件(工作簿,工作表和表單),但它們都是類模塊。您可以像在自定義類中那樣在ThisWorkbook中定義屬性和方法。這就是你所做的。您創建了一個名爲tc的自定義屬性。

要在一個類中創建一個屬性,可以使用Property Get/Let或Property。使用Public的捷徑看起來很像在一個標準模塊中聲明一個公共變量,但它不完全相同。

那麼爲什麼錯誤呢?當您的自定義類實例是另一個類的屬性時,VBA不會讓您創建自定義類的實例,因爲您最終可能會生成一個子類而沒有父類。

因此,保持您的實例私有並在標準模塊中聲明您的公共變量。我有一個名爲MGlobals的特殊模塊,我保留了所有公共變量。如果我不止一對,我可能會做錯事。

相關問題