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可能更安全。我理解并同意你所说的一切。也许我个人对“默认”这个词的使用在这种情况下并不准确。我就这样算了。谢谢你的评论。