【问题标题】:How to pass UDT array from excel vba to vb.net如何将 UDT 数组从 excel vba 传递到 vb.net
【发布时间】:2013-08-09 04:27:15
【问题描述】:

如何将用户定义的类类型 ByRef 的数组从 excel vba 传递到 vb.net?我有一个类似的帖子处理传递双数组here,我尝试对我的 UDT 使用相同的方法,但它不起作用。有什么想法吗?

【问题讨论】:

  • 作为一个快速的解决方案,你总是可以将它写入一个文本/excel文件并让.Net打开它......否则,你需要解释更多关于你想如何传递它...... . 您是用 VBA 编写并调用 .Net 程序还是用 .Net 编写并使用 Excel 作为中间步骤?
  • 我有一个 .net 类库,我使 COM 可见,以便在 excel 中访问。我创建了一个类的实例并尝试调用一个 Sub 例程,该例程将另一个 UDT 类的数组作为参数,对数组的元素执行操作,然后返回数组。
  • 据我所知,我不确定您是否可以。 UDT 不是对象。您可以尝试重构您的 VBA 代码并使 UDT 成为一个类,然后传递给 VB Variant,然后任何方法调用都将是后期绑定的。但是,我不确定这是否可行。问题是你的 VBA 代码无法导出定义类的信息(即在哪里调用这样那样的方法)。相比之下,VB/C# 可以处理双精度数组/集合,因为它们遵循标准/可以分别引用类型库。如果您使用的是 VB.NET,为什么需要任何 VBA 代码?
  • 我正在更新一些以前都在 excel vba 中的旧代码。该程序从 excel 单元格中获取各种信息,写入 excel 单元格,并在程序运行时在图表上进行可视化显示。

标签: arrays vb.net excel vba


【解决方案1】:

很抱歉(再次)回答我自己的问题,该问题与我在这个问题中链接的另一个问题非常相似,但我能够以与另一个问题的答案几乎相同的方式完成它。我只需要改变一些折射参数。

在 vb.net 代码中,我将参数作为对象,获取该对象的类型(它识别为 object() 数组),然后使用以下函数将该对象数组直接转换为所需的类数组vb.net

Friend Function ComObjectArrayToPointArray(ByVal comObject As Object) As Point()
    Dim thisType As Type = comObject.GetType
    Dim fibType As Type = Type.GetType("System.Object[]")
    Dim fibArray(0) As Point
    If thisType Is fibType Then
        Dim args(0) As Object
        Dim numEntries As Integer = CInt(thisType.InvokeMember("Length", BindingFlags.GetProperty, _
                                        Nothing, comObject, Nothing))
        ReDim fibArray(numEntries - 1)
        For j As Integer = 0 To numEntries - 1
            args(0) = j
            fibArray(j) = DirectCast((thisType.InvokeMember("GetValue", BindingFlags.InvokeMethod, _
                                    Nothing, comObject, args)), Point)
        Next
    End If

    Return fibArray

End Function

【讨论】:

    猜你喜欢
    • 2013-07-07
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 2013-12-07
    • 2010-10-31
    相关资源
    最近更新 更多