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

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尝试调用默认属性时就不会抛出错误:

  1. 在List类代码中新增一个属性,示例:
' 示例默认属性,可根据自己的需求调整实现
Public Property Get Value() As Variant
    Value = me_col(1) ' 这里可以根据你的需求写逻辑
End Property
  1. 点击VB编辑器菜单栏的「工具」→「过程属性」,选中你刚写的Value属性,点击「高级」,将「过程标识符」设置为「(默认)」,确认保存即可。

内容的提问来源于stack exchange,提问作者Trần Hoàn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:24:00