VBA嵌套类数组元素统一修改异常及结构合法性咨询
VBA嵌套类结构合法性验证与异常修复
一、复合数据结构的VBA合法性确认
你定义的嵌套类结构完全符合VBA规范:
- 标准模块的过程中可以声明自定义类类型的变量
- 自定义类中允许声明对象类型的数组(如Class_A中的
a() As Class_B) - 类之间的引用嵌套是VBA面向对象编程的常规用法
不过原代码中Class_B存在两处小疏漏:未声明私有变量s、pS属性的参数类型错误,修正后即可完全合规。
二、异常原因解析
所有数组元素的s属性最终均为"J",核心原因是循环中复用了同一个Class_B实例:
- 你仅在循环外创建了一次
Set z = New Class_B,后续每次修改z.pS都是修改同一个对象的属性 - VBA中对象变量存储的是对象引用,数组
a()中所有元素指向的都是同一个Class_B实例,因此最后一次修改的s值会覆盖所有引用的显示结果
三、代码修正方案
1. 修正Class_B的属性定义
补充私有变量声明,并修正pS属性的参数类型:
Option Explicit Private s As String ' 补充私有成员变量声明 Private i As Integer ' s属性的正确实现 Public Property Get pS() As String pS = s End Property Public Property Let pS(oS As String) s = oS End Property ' 保留原有的i属性(若业务需要) Public Property Get pI() As Integer pI = i End Property Public Property Let pI(oI As Integer) i = oI End Property
2. 修改循环逻辑,每次创建新的Class_B实例
将Set z = New Class_B移入循环内部,确保每次迭代生成独立的对象:
Sub NestedArray() Const ciNumberToString As Integer = 64 Dim l As Long Dim y As Class_A Dim z As Class_B Set y = New Class_A For l = 0 To 10 Set z = New Class_B ' 每次循环创建新的Class_B实例 y.pI = l z.pS = Chr(l + ciNumberToString) y.pA = z Next l End Sub
3. 修正Class_A的对象属性赋值方式
对象类型的属性赋值必须使用Property Set而非Property Let,修改Class_A的pA属性:
Option Explicit Private a() As Class_B Private i As Integer Public Property Get pI() As Integer pI = i End Property Public Property Let pI(oI As Integer) If Not oI < i Then ReDim Preserve a(oI) End If i = oI End Property Public Property Get pA() As Class_B Set pA = a(i) End Property ' 替换Property Let为Property Set,适配对象赋值 Public Property Set pA(oA As Class_B) Set a(i) = oA End Property
四、验证结果
修改完成后,循环中每次都会生成独立的Class_B实例,数组a()的每个元素指向不同对象,监视窗口中可看到s属性依次为"@"到"J"的不同字符串,符合预期。
内容的提问来源于stack exchange,提问作者Steve Roberts
相关产品推荐
相关产品推荐

