1

恐怕我误解了 VBA for excel 的文档,我有这行似乎是一个错误:

Range a = Selection.SpecialCells(xlCellTypeConstants, 23)

但这一个很好:

Set a = Selection.SpecialCells(xlCellTypeConstants, 23)

文件声称:

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

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

我在这里想念什么?

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

在此处输入图像描述

4

4 回答 4

5
Range a = Selection.SpecialCells(xlCellTypeConstants, 23)

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

你可以做:

Dim a As Range
Set a = Selection.SpecialCells(xlCellTypeConstants, 23)

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

你也可以这样做:

Dim a As Variant
a = Selection.SpecialCells(xlCellTypeConstants, 23)

这将保存在a范围内单元格值的二维数组中。

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

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

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

于 2013-07-26T09:25:01.260 回答
1

在此处输入图像描述

Range.SpecialCells 方法返回一个 Range 对象,该对象表示与指定类型和值匹配的所有单元格。set keyworkd 用于分配对对象的引用。

VBA 中有两种类型的赋值:一种用于普通变量,使用 Let,另一种用于对象变量,使用 Set。

普通(字符串、逻辑、数字)变量是指向内存中存储变量的位置的变量。

对象变量(您在 Objects 下的语言参考中找到的所有内容)是指向内存中的结构(VTable)的变量,该结构又包含指向对象属性和方法的指针。

参考http://www.excelforum.com/excel-programming-vba-macros/693357-when-to-use-the-keyword-set.html

于 2013-07-26T09:41:42.627 回答
1

使用 Set 关键字分配对象变量。非对象变量(让我们暂时忽略变体)不使用 Set 关键字

dim a as int
dim b as string
dim c as boolean

a = 1
b = "hello"
c = false

dim a as Range
dim b as Worksheet
dim c as PivotTable

set a = ActiveSheet.Range("a1")
set b = ActiveSheet
set c = ActiveSheet.PivotTables(1)
于 2013-07-26T09:38:16.060 回答
0

不知道这很重要,但Value 不是. Range的默认属性Range_Default

在此处输入图像描述

它是这样定义 _Default([in, optional] VARIANT RowIndex, [in, optional] VARIANT ColumnIndex)的,它表示特定范围的值数组。

Sub test()

    Dim rng As Range
    Set rng = ActiveSheet.Range("A1:C3")

    ' all cells in range rng become value of 1
    rng.Value = 1

    ' all cells in range rng become now value of 2
    rng.[_Default] = 2

    ' first cell in range rng become value of 3
    rng.[_Default](1, 1) = 3

    ' nothing changes
    rng.Value()(1, 1) = 4

    Dim a1, a2
    ' however both Value and _Default return same array of variants
    a1 = rng.Value
    a2 = rng.[_Default]

End Sub
于 2014-12-10T17:03:35.513 回答