VBA构建嵌套Collection的类对象结构时报错91问题求助
VBA嵌套Collection运行时错误91解决方案
错误原因
你触发Run-time error '91': Object variable or With block variable not set的核心原因是顶层Collection col_A仅完成了对象类型声明,没有进行实例化。你代码中Dim col_A As Collection这行只是定义了一个可指向Collection对象的指针,并没有实际创建Collection实例,因此调用col_A.Add方法时找不到对应对象,抛出对象未设置的错误。
修复方案
主模块修改
只需给col_A补充实例化逻辑即可,有两种写法二选一:
写法1:声明同时实例化
Dim col_A As New Collection
写法2:先声明后手动实例化
Dim col_A As Collection Set col_A = New Collection
修正后的完整主模块代码如下:
Sub main() Dim objB As cls_B Dim col_B As New Collection ' 填充col_B集合(为简化演示只添加1个元素) Set objB = New cls_B objB.intb = 5 objB.dbl = 5.15 col_B.Add objB ' 填充col_A集合 Dim objA As cls_A ' 修正:实例化顶层集合col_A Dim col_A As New Collection Set objA = New cls_A objA.inta = 2 Set objA.col_B = col_B col_A.Add objA ' 此处不再报错 End Sub
可选优化
为了避免类内部的Collection也出现同类未初始化问题,建议给cls_A添加类初始化、销毁事件,自动管理内部col_B的生命周期:
' cls_A类模块代码 Public inta As Integer Public col_B As Collection ' 类实例化时自动创建内部Collection Private Sub Class_Initialize() Set col_B = New Collection End Sub ' 类销毁时自动释放资源 Private Sub Class_Terminate() Set col_B = Nothing End Sub
优化后无需在外部单独创建col_B再赋值给类对象,可直接操作objA.col_B.Add添加元素,逻辑更简洁,也能避免漏初始化的问题。
内容的提问来源于stack exchange,提问作者David R
相关产品推荐
相关产品推荐

