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

如何在Access VBA中获取返回对象List的C#方法的数据

问题根因

报错的核心原因是:C# 泛型List<Item>默认不支持COM互操作,基于COM的VBA无法直接识别泛型集合类型;同时你用Set关键字接收非对象类型返回值也会触发「需要对象」错误。返回单个Item的方法正常是因为单个自定义类可以被标记为COM可见,VBA能正常识别。

解决方案

方案1:修改C#端接口(推荐,兼容性最好)

将返回值从List<Item>改为COM可识别的Item数组,原有逻辑无需调整,仅需最后做一次类型转换即可:

// 修改后的方法签名
Item[] getInterventions(string p1, string p2, string p3, string p4, string p5, string p6)
{
    // 原有获取List的逻辑不变
    List<Item> originalList = 原有逻辑;
    // 转数组返回
    return originalList.ToArray();
}

注意要确保Item类、以及暴露给VBA的所有方法、属性都显式标记[ComVisible(true)]特性,生成DLL时勾选「注册为COM互操作」选项。

对应修改VBA端代码:

Dim WsObject As Object
' 数组用Variant接收,不能加Set关键字
Dim result As Variant
Dim i As Integer

Set WsObject = CreateObject("Namespace1.Path.To.Class")
result = WsObject.getInterventions("", "", "123456789", "", "", "")

' 判断返回结果
If IsArray(result) Then
    If UBound(result) >= LBound(result) Then
        ' 遍历数组处理每个Item
        For i = LBound(result) To UBound(result)
            Dim currentItem As Object
            Set currentItem = result(i)
            ' 此处编写currentItem属性处理逻辑
        Next
    Else
        ' 空数组对应逻辑
    End If
Else
    ' 返回异常对应逻辑
End If

方案2:封装COM可见集合类

如果不方便修改原有返回结构,可以在C#端额外封装一个COM可见的自定义集合类,包装List<Item>,暴露Count属性和GetItem(index)方法,VBA端通过调用公开方法逐个读取元素即可。

内容的提问来源于stack exchange,提问作者Ahmed Aboumalek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:36:03