在UiPath中读取作为COM__Object传递的自定义VBA类对象成员
解决UiPath读取VBA返回自定义COM对象成员的问题
我之前也踩过COM互操作的类似坑,给你几个实打实的解决方案:
一、先让VBA自定义类的成员对COM可见
你的CInputDBEntries类里的字段都是Private的,COM客户端(比如UiPath)根本没法访问这些私有成员。必须给每个私有字段添加Public的Property Get方法,才能让UiPath通过COM获取到值:
' 在CInputDBEntries类模块中补充以下代码 Public Property Get Title() As String Title = strTitle End Property Public Property Get Value() As String Value = strValue End Property Public Property Get Integrity() As Boolean Integrity = boolIntegrity End Property
修改后,你的ReadRelevantEntries方法返回的对象,就能被UiPath识别出这些公共属性了。
二、在UiPath里直接读取COM对象属性,别瞎转换
不用写CType(listExcelEntries, Object)这种无效转换,直接用UiPath的Get Property活动就能搞定:
- 把VBA返回的
COM__Object(也就是你的listExcelEntries变量)作为活动的TargetObject - 在
PropertyName里填写你刚在VBA类里定义的属性名,比如Title、Value、Integrity - 把结果存入对应的变量(字符串变量存标题/值,布尔变量存完整性标记)
如果要处理多个对象,别用VBA的Collection,建议改成返回数组或者Scripting.Dictionary(COM兼容性更好):
改用数组的VBA示例:
Public Function ReadRelevantEntries() As Variant Dim entries() As CInputDBEntries ' 初始化数组并添加对象(示例两个元素) ReDim entries(0 To 1) Set entries(0) = New CInputDBEntries entries(0).strTitle = "Test1" entries(0).strValue = "Value1" entries(0).boolIntegrity = True Set entries(1) = New CInputDBEntries entries(1).strTitle = "Test2" entries(1).strValue = "Value2" entries(1).boolIntegrity = False ReadRelevantEntries = entries End Function
在UiPath里接收数组后,用For Each循环遍历,再对每个元素用Get Property读取属性值就行。
三、解决Collection转换的CastTypeException
VBA的Collection和.NET的Microsoft.VisualBasic.Collection只是名字相同,实际是不同的COM类型,直接转换肯定报错。如果非要用Collection,在UiPath里可以把它当成System.Collections.IEnumerable来遍历,或者用Invoke Method调用它的Item方法取元素:
- 用Invoke Method活动,TargetObject是VBA返回的Collection,MethodName填
Item,参数填索引(注意VBA Collection索引从1开始) - 拿到单个元素后,再用Get Property读取属性
不过还是更推荐用数组或者Scripting.Dictionary,能彻底避开这种类型不匹配的麻烦。
内容的提问来源于stack exchange,提问作者Zate
相关产品推荐
相关产品推荐

