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

raj*_*ato 8 excel vba excel-vba

我知道Range()Cells()属性是访问工作表上的单元格的等效方法.但是,何时使用Range.Cells()这种组合是明智的?

我遇到了他们使用过的一个例子Range("A1").Resize(2,3).cells.value.这相当于Range("A1").Resize(2,3).value

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

GSe*_*erg 12

从技术上讲,RangeRange.Cells不能等同.有一个小但重要的区别.

但是在你的特殊情况下,你在哪里

  1. Range("something"),和构造范围
  2. 只对该.Value范围感兴趣,

它没有任何区别.


VB中有一个方便的子句For Each,它枚举了集合中的所有元素.在Excel对象模型,有方便性能如Columns,Rows,或Cells,相应小区的跨距即返回集合:列的集合,行的集合,或细胞的集合.

从语言的流动方式来看,你自然会期望它For Each c In SomeRange.Columns会枚举列,一次一个,并且For Each r In SomeRange.Rows一次一个地枚举行.事实上,他们就是这么做的.
但是你可以注意到Columns属性返回一个Range,并且Rows属性也返回一个Range.然而,前者Range会告诉For Each它它是一个"列的集合",而后者Range会将自己称为"行集合".

这是有效的,因为显然Range类的每个实例中都有一个隐藏的标志,它决定了这个实例Range在一个内部的行为For Each.

查询Cellsa Range确保您获得Range具有For Each枚举模式设置为"cells" 的实例.如果你不打算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
Run Code Online (Sandbox Code Playgroud)


Pᴇʜ*_*Pᴇʜ 6

Dim b As Variant
b = Range("A1").Resize(2, 3).Cells.Value
Run Code Online (Sandbox Code Playgroud)

Dim c As Variant
c = Range("A1").Resize(2, 3).Value
Run Code Online (Sandbox Code Playgroud)

将返回相同的值数组.所以它们是等价的.没有优势你使用哪一个(一个更短).

在此输入图像描述


但你可以使用

Range("A1").Resize(2, 3).Cells(1, 2).Value
Run Code Online (Sandbox Code Playgroud)

从该范围中获取特定单元格.因此,这是最有可能在你需要的.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
Run Code Online (Sandbox Code Playgroud)