VBA自定义List类调用GetAt取自定义对象时报错438如何解决?
错误产生原因
在Visual Basic语法中,值类型和对象类型的赋值、返回逻辑存在差异:
- 字符串、数值、布尔等基础值类型默认使用隐式
Let赋值,直接传递值本身,不需要额外声明 - 自定义类、控件等对象类型必须使用
Set关键字赋值/返回,传递的是对象的引用
你写的GetAt方法没有做类型判断,默认走值类型返回逻辑:当存储的是对象时,VB会自动尝试调用该对象的默认属性来获取值,你的自定义List类没有定义默认属性,因此触发Run-time error '438': Object doesn't support this property or method错误。而存储基础值类型时不需要调用默认属性,所以运行正常。
修复方法
有两种可行的修复方案:
方案1:适配两种类型的返回逻辑(推荐)
修改GetAt方法,判断存储内容的类型,分别按值类型和对象类型返回:
Public Function GetAt(position As Integer) If IsObject(me_col(position + 1)) Then ' 对象类型用Set返回引用 Set GetAt = me_col(position + 1) Else ' 值类型直接返回值 GetAt = me_col(position + 1) End If End Function
如果调用时明确知道返回的是对象,也可以主动用Set接收返回值避免报错:
Sub Run() Dim col As New List Dim child As New List col.Add child Dim res As List Set res = col.GetAt(0) MsgBox TypeName(res) ' 正常输出List End Sub
方案2:给自定义List类添加默认属性
如果不希望修改GetAt方法的原有逻辑,可以给自定义List类添加一个默认属性,VB尝试调用默认属性时就不会抛出错误:
- 在
List类代码中新增一个属性,示例:
' 示例默认属性,可根据自己的需求调整实现 Public Property Get Value() As Variant Value = me_col(1) ' 这里可以根据你的需求写逻辑 End Property
- 点击VB编辑器菜单栏的「工具」→「过程属性」,选中你刚写的
Value属性,点击「高级」,将「过程标识符」设置为「(默认)」,确认保存即可。
内容的提问来源于stack exchange,提问作者Trần Hoàn
相关产品推荐
相关产品推荐

