我知道Range()
和Cells()
属性是访问工作表上单元格的等效方法。但是,什么时候结合使用Range.Cells()
是明智的呢?
我遇到了一个他们使用Range("A1").Resize(2,3).cells.value
的示例。
这等于Range("A1").Resize(2,3).value
吗?
如果没有,前者的优势是什么?
答案 0 :(得分:9)
从技术上讲,Range
和Range.Cells
不是等效的。有一个很小但很重要的区别。
但是在您的特定情况下
Range("something")
构建范围,然后.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
会把自己介绍为“行集合”。
之所以可行,是因为apparently在Range
类的每个实例中都有一个隐藏的标志,它决定了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
将返回相同的值数组。因此它们是等效的。使用哪一个没有优势(一个较短)。
但是您可以使用
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