gpt4 book ai didi

vba - Range() vs Cells() vs Range.Cells()

转载 作者:行者123 更新时间:2023-12-01 21:19:37 32 4
gpt4 key购买 nike

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

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

如果不是,前者的优点是什么?

最佳答案

从技术上讲,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会将自己介绍为“行集合”。

这有效是因为 apparently Range 的每个实例内都有一个隐藏标志类,它决定 Range 的这个实例如何将在 For Each 内表现.

查询Cells关闭Range确保您获得 Range 的实例有 For Each枚举模式设置为“单元格”。如果您不打算For Each从一开始的范围来看,这种差异对你来说没有什么区别。

即使您确实关心 For Each模式,在您的特定情况下 Range("A1").Resize(2,3)Range("A1").Resize(2,3).Cells也相同,因为默认情况下 Range以“cells”的枚举方式构造,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

关于vba - Range() vs Cells() vs Range.Cells(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51093274/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com