Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在vb.net中强制转换Microsoft.Office.Interop.Excel.Application.Run结果?_Vb.net_Vba - Fatal编程技术网

如何在vb.net中强制转换Microsoft.Office.Interop.Excel.Application.Run结果?

如何在vb.net中强制转换Microsoft.Office.Interop.Excel.Application.Run结果?,vb.net,vba,Vb.net,Vba,我有以下代码: Dim technologyMapping = oXL.Run("GetTechnologyMapping") 结果是一个对象。在我的VBA(宏)代码中,我返回一个集合,如下所示: Public Function GetTechnologyMapping() As Collection ' ... Set GetTechnologyMapping = result End Function 我正试图通过CType和CTypeDynamic进行演员阵容转换,但目

我有以下代码:

Dim technologyMapping = oXL.Run("GetTechnologyMapping")
结果是一个对象。在我的VBA(宏)代码中,我返回一个
集合
,如下所示:

Public Function GetTechnologyMapping() As Collection
    ' ...
    Set GetTechnologyMapping = result
End Function

我正试图通过
CType
CTypeDynamic
进行演员阵容转换,但目前为止运气不错。每次代码抛出一个异常时,我都不能强制转换这个对象,尽管该对象具有属性
Count
。如何将此对象强制转换为集合?

您可以将
VBA.collection
强制转换为
System.Collections.IEnumerable
。这将允许您为每个循环枚举一个
集合

大概是这样的:

Sub Test(wbPath As String)
    Dim app As New Excel.Application
    Dim wb As Excel.Workbook = app.Workbooks.Open(wbPath)
    Dim result As Object = app.Run("ReturnCollection")
    wb.Close(Excel.XlSaveAction.xlDoNotSaveChanges)
    app.Quit()

    Dim colAsIEnumerable As System.Collections.IEnumerable = TryCast(result, System.Collections.IEnumerable)

    If colAsIEnumerable IsNot Nothing Then
        For Each o As Object In colAsIEnumerable
            If o IsNot Nothing Then Debug.Print(o.ToString())
        Next
    End If
End Sub

您可以将
VBA.Collection
强制转换为
System.Collections.IEnumerable
。这将允许您为每个
循环枚举一个
集合

大概是这样的:

Sub Test(wbPath As String)
    Dim app As New Excel.Application
    Dim wb As Excel.Workbook = app.Workbooks.Open(wbPath)
    Dim result As Object = app.Run("ReturnCollection")
    wb.Close(Excel.XlSaveAction.xlDoNotSaveChanges)
    app.Quit()

    Dim colAsIEnumerable As System.Collections.IEnumerable = TryCast(result, System.Collections.IEnumerable)

    If colAsIEnumerable IsNot Nothing Then
        For Each o As Object In colAsIEnumerable
            If o IsNot Nothing Then Debug.Print(o.ToString())
        Next
    End If
End Sub

运行宏时,唯一知道它返回什么的人就是您。集合的可能性非常小,vb.net类型不是VBA类型。查看宏代码。第二个清单显示了宏的重要部分。是的,它是一个集合。VBA代码返回的集合在VB.NET中不能直接使用,它是一个专用VBA类型,因此无法强制转换。你必须保持它的对象和使用后期绑定代码。好的,谢谢。我以为
VBA.Collection==VB.Collection
你运行一个宏,唯一知道它返回什么的人就是你。集合的可能性非常小,vb.net类型不是VBA类型。查看宏代码。第二个清单显示了宏的重要部分。是的,它是一个集合。VBA代码返回的集合在VB.NET中不能直接使用,它是一个专用VBA类型,因此无法强制转换。你必须保持它的对象和使用后期绑定代码。好的,谢谢。我想
VBA.Collection==VB.Collection