Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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
将范围对象从VBA传递到.NET会导致;运行时错误91“;_.net_Vba_Range_Excel Interop - Fatal编程技术网

将范围对象从VBA传递到.NET会导致;运行时错误91“;

将范围对象从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

是的.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

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