我已经改写了我原来的问题。
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是相同的。我在很多出版物中都遇到过这种情况,如果没有指定,Cells
就是缺省项。
我想知道是否有人读过微软的文档来说明这一点--到目前为止我还没有。
发布于 2018-05-22 15:51:11
你实际上并不知道你自以为知道的事情。:)
根据分配区域的方式,Range.Count
可能返回行数或列数,而不是单元格的数量;Cells.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
发布于 2018-05-22 16:05:03
在任何情况下,你都需要问自己--我需要什么?单元格数量?行的数量?列的数量?回答时,请使用适当的操作:
1)行:rng.Rows.Count
2)列:rng.Columns.Count
3)单元格:rng.Cells.Count
作为提示,对于Rows
属性有一些注意事项。如果您想遍历各行并处理它们的各个单元格,那么您必须使用的Cells
属性。比方说,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
更新
此外,在处理范围时(特别是在自动过滤的情况下):范围可以包含不连续的范围。不同的连续范围位于Areas
属性中,因此您必须首先迭代区域,然后处理您的范围。
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
发布于 2018-05-22 13:47:17
试试下面的代码,看看他们到底喜欢什么:
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
对象的属性。
其他资源:
https://stackoverflow.com/questions/50459919
复制相似问题