Range()vs Cells()vs Range.Cells()

时间:2018-06-29 01:53:09

标签: vba excel-vba excel

我知道Range()Cells()属性是访问工作表上单元格的等效方法。但是,什么时候结合使用Range.Cells()是明智的呢?

我遇到了一个他们使用Range("A1").Resize(2,3).cells.value的示例。 这等于Range("A1").Resize(2,3).value吗?

如果没有,前者的优势是什么?

2 个答案:

答案 0 :(得分:9)

从技术上讲,RangeRange.Cells不是等效的。有一个很小但很重要的区别。

但是在您的特定情况下

  1. 使用Range("something")构建范围,然后
  2. 只对该范围内的.Value感兴趣

完全没有区别


VB中有一个方便的子句For Each,它枚举了集合中的所有元素。在Excel对象模型中,有方便的属性,例如ColumnsRowsCells,它们返回相应单元格跨度的集合:列的集合,行的集合或细胞的集合。

从语言的流动方式来看,您自然希望For Each c In SomeRange.Columns一次枚举一列,而For Each r In SomeRange.Rows一次枚举一列。实际上,他们就是这样做的。
但是您会注意到Columns属性返回一个Range,而Rows属性也返回一个Range。但是,前一个Range会告诉For Each这是一个“列集合”,而后一个Range会把自己介绍为“行集合”。

之所以可行,是因为apparentlyRange类的每个实例中都有一个隐藏的标志,它决定了Range的该实例在For Each中的行为。 / p>

Cells中查询Range可以确保您获得Range的实例,该实例的For Each枚举模式设置为“单元”。如果您不打算开始使用For Each的范围,那么这种差异对您没有任何影响。

即使您确实关心For Each模式,在您的特殊情况下Range("A1").Resize(2,3)Range("A1").Resize(2,3).Cells也是相同的,因为默认情况下Range是用“单元格”的枚举模式,并且Resize不会更改其调整大小的范围的枚举模式。


因此,我唯一能想到的是从一个已经存在的Cells查询Range的地方,就是当您有一个接受Range作为参数的函数时,您不知道Range的构造方式,您想枚举该范围内的单个单元格,并且要确保要枚举的是For Each单元格,而不是行或列:

function DoSomething(byval r as range)
  dim c as range

  'for each c in r ' Wrong - we don't know what we are going to enumerate

  for each c in r.cells ' Make sure we enumerate cells and not rows or columns (or cells sometimes)
    ...
  next
end function

答案 1 :(得分:6)

两者

Dim b As Variant
b = Range("A1").Resize(2, 3).Cells.Value

Dim c As Variant
c = Range("A1").Resize(2, 3).Value

将返回相同的值数组。因此它们是等效的。使用哪一个没有优势(一个较短)。

enter image description here


但是您可以使用

Range("A1").Resize(2, 3).Cells(1, 2).Value

以获得超出该范围的特定单元格。因此,这很可能是您在.Cells上需要.Range的地方。 请注意,Cells(1, 2)中的行/列编号是相对于范围的,而不是工作表的绝对编号。

所以区别是:

Range("A1:A2")              'range can return multiple cells …
Range("A1")                 '… or one cell.
Cells(1, 2)                 'cells can return one cell or …
Cells                       '… all cells of the sheet

Range("A1:A2").Cells        'returns all cells of that range and therefore is the same as …
Range("A1:A2")              '… which also returns all cells of that range.

Range("C5:C10").Cells(2, 1) 'returns the second row cell of that range which is C6, but …
Cells(2, 1)                 'returns the second row cell of the sheet which is A2