Vba Range.Cells.Count与Range.Count

Vba Range.Cells.Count与Range.Count,vba,excel,Vba,Excel,我已经改写了我原来的问题 Sub s() Dim r As Range Set r = ActiveSheet.Range("B2:D5") Debug.Print r.Rows.Count 'returns 4 Debug.Print r.Columns.Count 'returns 3 Debug.Print r.Cells.Count 'returns 12 Debug.Print r.Count 'also returns 12 End Sub 在这个

我已经改写了我原来的问题

Sub s()
  Dim r As Range
  Set r = ActiveSheet.Range("B2:D5")
  Debug.Print r.Rows.Count    'returns 4
  Debug.Print r.Columns.Count 'returns 3
  Debug.Print r.Cells.Count   'returns 12
  Debug.Print r.Count 'also returns 12
End Sub
在这个特定场景中,r.Cells.Count和r.Count是相同的。我在许多出版物中都遇到过这种情况,如果没有指定,则默认项是
单元格


我只是想知道是否有人看到过任何微软的文档,这些文档实际上说明了这一点——到目前为止我还没有

使用此代码查看他们真正喜欢什么:

Option Explicit
Sub s()
    Dim rng As Range, rng2 As Range, rng3 As Range

    Set rng = Range("B2:D5")
    Set rng2 = rng.cells
    Set rng3 = rng2.cells 'rng.cells.cells

    rng3.cells(1, 1).Select
    'rng2.cells(1, 1).Select
    'rng.cells(1, 1).Select

End Sub
底线是,
rng
rng.Cells
都是引用同一组单元格的
Range
对象。现在,由于
Range
有方法
Count
,它们都有,显然它们返回的结果是完全相同的。区别在于,使用
Range.Cells.Count
可以访问
Range
对象属性的属性

额外资源:


你实际上并不知道你认为自己知道什么。:)

根据分配范围的方式,
range.Count
可能返回行数或列数,而不是单元格数<代码>单元格。计数
将始终返回单元格数。要演示,请尝试以下方法:

Sub foo()
    Dim rg As Range
    Set rg = ActiveSheet.Columns(1)
    MsgBox "Cells count is: " & rg.Cells.Count & vbLf & "Count is: " & rg.Count
End Sub

在任何情况下,你都需要问自己——我需要什么?细胞数量?一排?有多少列?回答时,请使用适当的操作:

1) 行:
rng.Rows.Count

2) 列:
rng.Columns.Count

3) 单元格:
rng.Cells.Count

作为提示,对
属性有一个警告。如果要迭代行并处理其单个单元格,则必须使用
范围的
属性
单元格。比如说,
A1
单元格包含值
123
,您希望检索该值

Sub G()

    Dim rng As Range
    Dim firstRow As Range
    Dim firstCell As Range

    Set rng = [A1:F10]
    Set firstRow = rng.Rows(1)

    Set firstCell = firstRow(1)
    '// DOES NOT WORK: Type mismatch
    MsgBox firstCell.Value

    Set firstCell = firstRow.Cells(1)
    '// WORKS OK! Shows: 123
    MsgBox firstCell.Value

End Sub
更新

此外,在处理范围时(特别是在自动筛选的情况下):范围可以包含非连续范围。不同的连续范围位于
区域
属性中,因此您必须首先迭代区域,然后处理范围

Sub G2
    Dim rng As Range, rngArea As Range, cell As Range
    For Each rngArea In rng.Areas
        For Each cell in rngArea.Cells '//or just "rngArea"
            '// Process further
        Next
    Next
End Sub

“你实际上不知道你认为你知道什么。”–我毫不怀疑这可能在很多时候都是正确的,但在这种情况下,我确实知道我认为我知道什么。:)我知道在你的例子中,Rg.Count与Rg.Cells.Count不一样。显然,我的原始问题措词不当,因此我重新编写了它,希望这次我的意图更清楚。@daveu仍然存在相同的问题-
单元格
显然不是“未指定默认值”(如上所示,这取决于您如何创建范围对象)所以我会担心你是否能找到文件说它是。你是对的,我同意在你的例子中“单元格”不是默认值。然而,在我的示例中,“Cells”似乎是默认值,我在许多示例中都看到它是以这种方式使用的。就我个人而言,我总是声明“细胞”,这样就不会有歧义。我只是感到惊讶的是,微软对此没有什么可说的。谢谢你的回复。我想说的是事实并非如此。在您的示例中,范围本质上是单个单元格范围对象的集合。在我的作品中,它是一系列柱状区域的集合。count只返回集合中任何内容的计数-没有其他隐含属性。同样,在这两种情况下,每个
循环的
操作也会有所不同。另外,FWIW,现在在单元格中使用CountLarge可能更安全。我理解并同意你所说的一切。也许我个人对“默认”这个词的使用在这种情况下并不准确。我就这样算了。谢谢你的评论。