将范围对象从VBA传递到.NET会导致;运行时错误91“;
是的.NET类型:将范围对象从VBA传递到.NET会导致;运行时错误91“;,.net,vba,range,excel-interop,.net,Vba,Range,Excel Interop,是的.NET类型: Microsoft.Office.Interop.Excel.Range 与VBA类型相同: excel.range ? 将它从VBA传递到.NET不起作用 它导致: 运行时错误“91”:未设置对象变量或带块变量 .NET代码(本例中为VB.NET)为: VBA是: Public sub DoesNotWork () Dim wkbObject As Workbook Dim shtObject As Worksheet Dim rngObject As Range Se
Microsoft.Office.Interop.Excel.Range
与VBA类型相同:
excel.range
?
将它从VBA传递到.NET不起作用
它导致:
运行时错误“91”:未设置对象变量或带块变量
.NET代码(本例中为VB.NET)为:
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连接工作正常
如果您有任何想法
海因
Microsoft.Office.Interop.Excel.Range的.NET类型是否与VBA:Excel.Range的类型相同
不,不是。.NET类型是托管类型,VBA类型是COM对象类型。COM互操作类型正在包装COM对象,使非托管对象可通过.NET访问
不过,托管互操作类型应该可以很好地封送到一个和另一个
但这并不是你想象的那样:
在不涉及任何.NET代码的情况下,与此相同:
Public Sub test()
Dim foo As Range
foo = Sheet1.Range("A1")
End Sub
此代码将按如下方式标记:
对“foo”的赋值隐式地赋值给类“EXCEL.EXE:EXCEL.Range”的默认成员“\u default”
换句话说,您没有将.FirstProperty
,而是分配给.FirstProperty.[u Default]
(在VBA规范中,这被记录为“let强制”,这里涉及一个隐藏的默认成员),如果未设置范围引用,则将引发错误91,因为您正在对Nothing
进行隐式成员调用
尝试使用Set
关键字:
With clsAttempt1
Set .FirstProperty = rngObject
End With
在VBA中,Set
关键字是必需的,无论何时您想要分配对象引用:这是因为在VBA中,无参数的默认成员是完全合法的(它们不在VB.NET中)。您可能想了解.FWIW作为新的
通常是一个坏主意,但当涉及.NET类型时更是如此。
Public Sub test()
Dim foo As Range
foo = Sheet1.Range("A1")
End Sub
With clsAttempt1
Set .FirstProperty = rngObject
End With