创建包含UDT子数组的VBA数组时遇类型错误,求解决建议
VBA UDT数组存入Variant数组报错的解决办法
错误原因
你遇到的错误是因为标准模块中定义的用户自定义类型(UDT)无法直接赋值给Variant数组元素。VBA规定,只有在公共对象模块(比如类模块)中定义的UDT,才能被转换为Variant或传递给后期绑定函数,普通标准模块里的UDT属于私有作用域,不支持这种操作。
解决方法
方法1:将UDT改为类模块(推荐)
把UDT的定义移到类模块中,将其成员设为公共属性,这样类实例可以自由存入Variant数组。
步骤:
- 插入类模块,命名为
clsUdtA - 在类模块中写入以下代码:
Option Explicit Public A As Integer Public B As Integer Public C As Integer
- 修改原标准模块代码:
Option Explicit Sub Main() test End Sub Function test() Dim A() As Variant Dim B() As clsUdtA, intRun As Integer Dim udtARun As clsUdtA ReDim A(0) ReDim B(2) intRun = 1 Do While intRun <= UBound(B) + 1 ' 创建类实例 Set udtARun = New clsUdtA With udtARun .A = 1 * intRun .B = 100 * intRun .C = 10000 * intRun End With ' 赋值类实例到数组 Set B(intRun - 1) = udtARun intRun = intRun + 1 Loop A(0) = B End Function
方法2:使用嵌套UDT包装数组
如果不想用类,可以定义一个新的UDT,内部包含原UDT的数组,然后声明这个新UDT的数组,避免使用Variant。
修改后的标准模块代码:
Option Explicit Type udtA A As Integer B As Integer C As Integer End Type ' 定义包装UDT,包含udtA数组 Type udtWrapper udtArray() As udtA End Type Sub Main() test End Sub Function test() Dim A() As udtWrapper Dim B() As udtA, intRun As Integer Dim udtARun As udtA ReDim A(0) ReDim B(2) intRun = 1 Do While intRun <= UBound(B) + 1 With udtARun .A = 1 * intRun .B = 100 * intRun .C = 10000 * intRun End With B(intRun - 1) = udtARun intRun = intRun + 1 Loop ' 将udtA数组赋值给包装类型的成员 A(0).udtArray = B End Function
方法对比
- 类模块方法:更灵活,支持后期绑定和更多操作,适合复杂场景。
- 嵌套UDT方法:轻量高效,不需要额外类模块,适合简单的数组存储需求。
内容的提问来源于stack exchange,提问作者Eric Hu
相关产品推荐
相关产品推荐

