VBA中使用返回数组的函数报错:Can't assign to array
问题分析与修正方案
你的代码触发Can't assign to array编译错误,核心是三个关键细节处理错了,我给你拆解并修正:
1. 函数返回类型声明不匹配
你把legBuilder声明为返回单个MyObject_Obj对象,但实际要返回的是该类型的数组,必须把返回类型改成对象数组类型。
2. 固定大小数组的赋值限制
VBA里直接返回固定大小数组(比如Dim my_legs(1 To 4) As MyObject_Obj)会有赋值限制,用动态数组更稳妥,在函数内部再指定大小即可。
3. 对象数组的初始化逻辑
填充对象数组时,必须为每个元素创建MyObject_Obj的实例,否则数组元素会是空值,后续调用必然出错。
修正后的完整可运行代码
Dim param1 As String Dim param2 As String ' 调用端声明匹配的动态数组 Dim my_legs() As MyObject_Obj ' 数组整体赋值不需要用Set,直接赋值即可 my_legs = legBuilder(param1, param2) ' 修正函数返回类型为MyObject_Obj数组 Private Function legBuilder(ByVal param1 As String, ByVal param2 As String) As MyObject_Obj() ' 声明动态数组,后续指定大小 Dim my_legs() As MyObject_Obj ' 初始化数组为1到4的固定大小 ReDim my_legs(1 To 4) As MyObject_Obj ' --- 填充数组的核心逻辑 --- Dim i As Integer For i = 1 To 4 ' 必须为每个数组元素创建对象实例 Set my_legs(i) = New MyObject_Obj ' 这里可以给对象属性赋值,示例: ' my_legs(i).Param1Value = param1 ' my_legs(i).Param2Value = param2 Next i ' 返回数组 legBuilder = my_legs End Function
额外提醒
- 如果一定要用固定大小数组,函数内部的数组声明和返回类型必须严格一致,但动态数组在VBA的数组返回场景中灵活性更高,出错概率更低。
- 调用端的数组不能用
Set赋值,因为是数组整体赋值,不是单个对象的引用赋值。
内容的提问来源于stack exchange,提问作者Pclaverie
相关产品推荐
相关产品推荐

