You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 14:05:20