首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Range() vs Cells() vs Range.Cells()

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

Stack Overflow用户
提问于 2018-06-29 01:53:08
回答 2查看 10.8K关注 0票数 10

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

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

如果没有,前者的好处是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-29 08:13:19

从技术上讲,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属性返回一个RangeRows属性也返回一个Range。然而,前者的Range会告诉For Each它是一个“列的集合”,而后者的Range将自己介绍为“行的集合”。

这是因为apparentlyRange类的每个实例中都有一个隐藏标志,这决定了Range实例在For Each中的行为。

查询Cells时,要确保您得到的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将枚举,而不是枚举行或列:

代码语言:javascript
运行
复制
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
票数 13
EN

Stack Overflow用户

发布于 2018-06-29 07:10:05

两者都有

代码语言:javascript
运行
复制
Dim b As Variant
b = Range("A1").Resize(2, 3).Cells.Value

代码语言:javascript
运行
复制
Dim c As Variant
c = Range("A1").Resize(2, 3).Value

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

但你可以用

代码语言:javascript
运行
复制
Range("A1").Resize(2, 3).Cells(1, 2).Value

让一个特定的细胞脱离这个范围。因此,这是您最有可能需要.Cells on .Range的地方。请注意,Cells(1, 2)中的行/列编号相对于范围,而不是工作表的绝对编号。

所以不同之处是:

代码语言:javascript
运行
复制
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
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51093274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档