VBA同类型对象数组复制报错438:对象不支持该属性或方法
VBA复制自定义对象数组时438错误的解决方法
错误原因分析
你遇到的438错误(对象不支持该属性或方法),根源在于两个核心问题:
- 对象数组声明方式错误:
Dim firstArray() As New Facture这种写法会让VBA在首次访问数组元素时自动实例化对象,但这种逻辑不符合数组的常规使用场景,会导致后续赋值操作出现异常。 - 对象赋值逻辑错误:自定义类
Facture未定义默认属性,直接用=赋值时,VBA会尝试调用对象的默认属性,而类中不存在该属性,因此触发错误。
修正后的代码示例
1. 正确声明并初始化源数组
' 声明对象数组,不要使用As New Dim firstArray() As Facture ReDim firstArray(arSize) ' arSize为已定义的数组大小 ' 逐个实例化数组中的Facture对象,并赋值属性 Dim i As Integer For i = LBound(firstArray) To UBound(firstArray) Set firstArray(i) = New Facture ' 示例:给对象属性赋值 firstArray(i).clientName = "示例客户" firstArray(i).realisationDate = Date Next i
2. 正确复制到目标数组
' 声明目标数组 Dim secondArray() As Facture Dim lineSecondArray As Integer lineSecondArray = -1 ' 初始化为-1,确保首次+1后从索引0开始 ' 复制元素的逻辑 lineSecondArray = lineSecondArray + 1 ' 使用Preserve保留数组中已有的元素(如果需要) ReDim Preserve secondArray(lineSecondArray) ' 方式1:值复制(创建新的对象实例,属性与源对象一致) Set secondArray(lineSecondArray) = New Facture secondArray(lineSecondArray).clientName = firstArray(lineFirstArray).clientName secondArray(lineSecondArray).realisationDate = firstArray(lineFirstArray).realisationDate ' 方式2:引用复制(两个数组元素指向同一个对象实例,修改一个会影响另一个) ' Set secondArray(lineSecondArray) = firstArray(lineFirstArray)
关键说明
- 如果需要两个数组的对象实例相互独立(修改其中一个不影响另一个),必须用值复制的方式,逐个复制对象的属性;
- 如果只需要共享同一个对象实例,直接用
Set进行引用复制即可,但要确保源数组的元素已经被正确实例化。
内容的提问来源于stack exchange,提问作者Reiler74
相关产品推荐
相关产品推荐

