作者:手机用户2502910101 | 来源:互联网 | 2023-05-19 18:09
假设我有一个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> Dick Kusleik..:
PublicNotCreatable是可以在不同的VBProject中使用该类的.NotCreatable部分意味着无论VBProject托管什么,该类都必须创建任何新实例并将其传递给其他VBProject.另一个VBProject无法自己创建它们.
你想要做的是Public tc As TestClass
在一个标准模块中,让你的班级实例私密.在标准模块中声明变量public会使该变量在项目中的任何位置都可用.
您所做的是创建Workbook对象的ThisWorkbook实例的自定义属性.ThisWorkbook是一个类模块(表单模块和用户表单也是如此).那些类模块是特殊的,因为它们有一个用户界面组件(工作簿,工作表和表单),但它们都是类模块.您可以像在自定义类中一样在ThisWorkbook中定义属性和方法.那就是你做的.您创建了一个名为自定义属性tc
.
要在类中创建属性,可以使用Property Get/Let或Public.使用Public的快捷方式看起来很像在标准模块中声明一个公共变量,但它并不完全相同.
那么为什么会出错呢?当您的自定义类实例是另一个类的属性时,VBA将不允许您创建自定义类的实例,因为您可能最终得到子类而没有父类.
因此,请保持您的实例私有,并在标准模块中声明您的公共变量.我有一个名为MGlobals的特殊模块,我保存所有公共变量.如果我有一对以上,我可能做错了什么.