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
从技术上讲,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会将自己称为"行集合".
这是有效的,因为显然在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)
都
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)