Range.Item和Range.Cells有什么区别?

例如,在下面的代码中, ItemCells可以互换使用:

 Dim rRange As Range Set rRange = ThisWorkbook.ActiveSheet.Range("A1") With rRange Debug.Print .Item(1, 1).Value ' Outputs value of "A1" Debug.Print .Cells(1, 1).Value ' Outputs value of "A1" Debug.Print .Item(2, 1).Value ' Outputs value of "A2" Debug.Print .Cells(2, 1).Value ' Outputs value of "A2" End With 

在开发人员参考中,它们被定义为:

Range.Item属性(Excel)

返回一个Range对象,它表示在指定范围的偏移量处的范围。

Range.Cells属性(Excel)

返回一个Range对象,它表示指定范围内的单元格。

备注

由于Item属性是Range对象的默认属性,所以您可以在Cells关键字之后立即指定行和列索引。

从这句话来看,这是否意味着Cells(1, 1)实际上是Cells.Item(1, 1) ? 因此Cells(1, 1)实际上等价于Item(1, 1) ? 我错过了什么?

了解这个最好的方法是通过下面的例子

.Item.Cells被用于一个范围,那么是的,它们是相同的。 例如

 Sub Sample() Dim rRange As Range Set rRange = ThisWorkbook.ActiveSheet.Range("B1:C10") With rRange Debug.Print .Item(1, 3).Address '<~~ $D$1 Debug.Print .Cells(1, 3).Address '<~~ $D$1 End With End Sub 

在上面他们都描述了该Range单元格的地址

Cells()被独立使用时,它们是不同的。

 Sub Sample() Dim rRange As Range Set rRange = ThisWorkbook.ActiveSheet.Range("B1:C10") With rRange Debug.Print .Item(1, 3).Address '<~~ $D$1 '~~> DOT before Cells missing Debug.Print Cells(1, 3).Address '<~~ $C$1 End With End Sub 

在上面的.Item描述该单元格在该Range的地址,其中Cells描绘ActiveSheet单元格的地址

除了引用Worksheet中的所有单元格之外,我可以看到不使用“单元格属性”。 我会这样说,(根据我的实验和研究):

Cells属性返回一个Range对象,它包含了它所应用到的Object的所有单元格。 对于工作表而言,显然是有用的,以便能够在整个工作表上使用范围对象的所有属性。 对于Range对象的情况,我不确定它是否有用。 例如,我找不到任何额外的属性,我不能从Range对象的属性中获取,而不首先将Cells属性应用到该Range对象

我想知道它在代码中的一些用法多年来是否“ cre手cre脚 ”。 例如,我相信这种types的代码行是一种可能的显式方式,使用Range对象Item属性Ws.Range(“A1”)。Areas.Item(1)来引用工作表中第二个单元格的Range对象。 Item(1,2)沿着我们所说的话,我可以依靠隐含的第一个Area和Item的默认属性来重写那个代码行:Ws.Range(“A1”)(1,2)

如果我放入Cells属性,我不会伤害Ws.Range(“A1”)。Cells(1,2)

但是我会build议:_(i)使用Cells这里是完全多余的_(ii)我仍然在这里使用Range Item属性。 _(iii)没有Cells项目属性_(iv)像这样的Cell(1,2)的代码部分具有“ 爬入 ”作为所谓的“ Cells属性”,它将接受一个或两个参数。 ..“和/或…” 单元格有一个项目属性.. “…等等。 我认为这些陈述可能是不正确的。 我认为Cells属性没有任何争论。 (我不是很确定,如果单元格可能有一个项目属性,我不是一个计算机专业人士,但专家告诉我,intellisense提供它,或微软帮助暗示它不能保证它存在。我希望没有细胞项目属性)

在所有情况下,像这样的代码部分,Cells(1,2),解释如下:Cells返回一个Range对象。 该范围对象具有其默认属性,范围对象项目属性应用于它。 除非我单独使用单元格到Range,否则我应该省略它。 我build议这样做,在这种情况下,我并不明确。 相反,我正在促成一个可能是错误的想法,我可以通过_ .. _“ 单元格(_argument / s_)types ”属性来引用Range对象,这可能不存在。

艾伦