编辑后注:感谢@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的类型是否为:
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中不是)。