将类设置为PublicNotCreatable的潜在后果是什么?

时间:2015-03-02 18:51:31

标签: vba excel-vba excel

假设我有一个类TestClass,其定义如下:

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的属性窗口并将Instancing设置为PublicNotCreatable来解决此问题。看起来这并没有影响类的行为或我在这个VBA项目中的各种函数中创建它的本地实例的能力。更改此Instancing设置是否存在任何潜在问题?

1 个答案:

答案 0 :(得分:5)

PublicNotCreatable是您可以在不同的VBProject中使用该类。 NotCreatable部分意味着无论VBProject托管什么,该类都必须创建任何新实例并将其传递给其他VBProject。另一个VBProject不能自己创建它们。

您要做的是在标准模块中Public tc As TestClass,并让您的班级实例化为私有。在标准模块中声明变量public会使该变量在项目的任何位置都可用。

您所做的是创建Workbook对象的ThisWorkbook实例的自定义属性。 ThisWorkbook是一个类模块(表单模块和用户表单也是如此)。这些类模块是特殊的,因为它们具有用户界面组件(工作簿,工作表和表单),但它们的类模块都是相同的。您可以像在自定义类中一样在ThisWorkbook中定义属性和方法。这就是你做的。您创建了一个名为tc的自定义属性。

要在类中创建属性,您可以使用Property Get / Let或Public。使用Public的快捷方式看起来很像在标准模块中声明一个公共变量,但它并不完全相同。

那么为什么会出错呢?当您的自定义类实例是另一个类的属性时,VBA不会让您创建自定义类的实例,因为您可能最终得到子类而没有父类。

因此,请保持您的实例私有,并在标准模块中声明您的公共变量。我有一个名为MGlobals的特殊模块,我保存所有公共变量。如果我有一对以上,我可能做错了。