将范围对象从VBA传递到.NET不起作用

问题描述 投票:0回答:1

编辑后注:感谢@Mathieu如此有启发性地回答了以下问题:

是.NET类型:Microsoft.Office.Interop.Excel.Range与VBA相同的类型:excel.range

从VBA传递到.NET不起作用。

。NET代码(在这种情况下为VB.NET是:

Imports Microsoft.Office.Interop.Excel

Public Class clsDotNetClass

private mRangeObject as Excel.Range

Public Property FirstProperty As Excel.Range

        Get
            Return mRangeObject

        End Get

        Set(value As Excel.Range)

            mRangeObject = value

        End Set

    End Property

End class

VBA是:

Public sub DoesNotWork ()

Dim wkbObject As Workbook
Dim shtObject As Worksheet
Dim rngObject As Range

Set wkbObject = ThisWorkbook
Set shtObject = wkbObject.Worksheets("Sheet1")
Set rngObject = shtObject.Range("A1:B2")

Dim clsAttempt1 as new clsDotNetClass 

With clsAttempt1

    .FirstProperty = rngObject

End With

End sub

COM连接可以正常工作。

将不胜感激,

Hein

.net vba range excel-interop
1个回答
0
投票

。NET的类型是否为:Microsoft.Office.Interop.Excel.Range与VBA的类型相同:Excel.Range

不,不是。 .NET类型是托管类型,VBA类型是COM对象类型。 COM-Interop类型将包装COM对象,从而使非托管对象可通过.NET使用。

不过,托管互操作类型应该很好地与另一方进行编组。

除非这没有按照您的想法做:

With clsAttempt1

    .FirstProperty = rngObject

End With

不涉及任何.NET代码,这是同一件事:

Public Sub test()
    Dim foo As Range
    foo = Sheet1.Range("A1")
End Sub

并且此代码被Rubberduck标记如下:

分配给'foo'隐式分配给类'EXCEL.EXE:Excel.Range'的默认成员'_Default'。

换句话说,您未分配.FirstProperty。您正在分配给.FirstProperty.[_Default](在VBA规范中记录为“ let-coercion”),如果未设置范围参考,则将引发错误91,因为您正在进行隐式成员调用针对Nothing

尝试使用Set关键字:

With clsAttempt1

    Set .FirstProperty = rngObject

End With

Set关键字在VBA中是必需,每当您打算分配对象引用时:这是因为在VBA中,无参数的默认成员是完全合法的(在VB.NET中不是)。

© www.soinside.com 2019 - 2024. All rights reserved.