如何在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
相关产品推荐
相关产品推荐

