当一个人应该使用Set [例如对于SpecialCells的返回值]?

0x9*_*x90 1 excel vba excel-vba excel-2010

我担心我误解了VBA的excel文档,我有这条似乎是一个错误的行:

Range a = Selection.SpecialCells(xlCellTypeConstants, 23)
Run Code Online (Sandbox Code Playgroud)

但是这个很好:

Set a = Selection.SpecialCells(xlCellTypeConstants, 23)
Run Code Online (Sandbox Code Playgroud)

文件声称:

返回一个Range 对象,该对象表示与指定类型和值匹配的所有单元格.

但它实际上返回一个byRef对象,这就是我必须使用的原因Set.

我在这里想念什么?

这是Range.SpecialCellsExcel中的方法帮助:

在此输入图像描述

GSe*_*erg 5

Range a = Selection.SpecialCells(xlCellTypeConstants, 23)
Run Code Online (Sandbox Code Playgroud)

无论数据类型如何,这都不是有效的VBA.您不会像在C#中那样在变量名前面声明变量类型,并且不会像在VB.NET中那样在声明点初始化变量.

你可以做:

Dim a As Range
Set a = Selection.SpecialCells(xlCellTypeConstants, 23)
Run Code Online (Sandbox Code Playgroud)

这将保存对范围的引用a.

你也可以这样做:

Dim a As Variant
a = Selection.SpecialCells(xlCellTypeConstants, 23)
Run Code Online (Sandbox Code Playgroud)

这将保存a范围内的单元格值的2D数组.

返回一个Range对象,该对象表示与指定类型和值匹配的所有单元格.

但它实际上返回一个byRef对象,这就是我必须使用Set的原因.

VBA中没有byval对象.所有对象都是byref,当您想要复制对象的引用时,您总是使用Set.您需要的Set是默认属性.每个对象都可以具有仅在提供对象名称时请求的默认属性.这会产生歧义,因此您需要说明Set何时需要操作对象引用itselt,并Set在需要对象的默认属性时省略.默认属性RangeValue.

  • @ 0x90在VBA中传递一个对象`ByVal`意味着传递引用byval,而不是像在C++中那样复制对象并传递副本.传递一个对象byval确保被调用的函数不能用另一个对象替换传递的对象,但它仍然能够摆弄它. (2认同)