What does the Excel range.Rows property really do?

前端 未结 9 1835
故里飘歌
故里飘歌 2021-01-30 16:21

OK, I am finishing up an add-on project for a legacy Excel-VBA application, and I have once again run up against the conundrum of the mysterious range.Rows (?) and

9条回答
  •  野的像风
    2021-01-30 16:26

    Range.Rows, Range.Columns and Range.Cells are Excel.Range objects, according to the VBA Type() functions:

    ?TypeName(Selection.rows)
    Range
    
    However, that's not the whole story: those returned objects are extended types that inherit every property and method from Excel::Range - but .Columns and .Rows have a special For... Each iterator, and a special .Count property that aren't quite the same as the parent Range object's iterator and count.

    So .Cells is iterated and counted as a collection of single-cell ranges, just like the default iterator of the parent range.

    But .Columns is iterated and counted as a collection of vertical subranges, each of them a single column wide;

    ...And .Rows is iterated and counted as a collection of horizontal subranges, each of them a single row high.

    The easiest way to understand this is to step through this code and watch what's selected:

    Public Sub Test() 
    Dim SubRange As Range Dim ParentRange As Range
    Set ParentRange = ActiveSheet.Range("B2:E5")

    For Each SubRange In ParentRange.Cells SubRange.Select Next
    For Each SubRange In ParentRange.Rows SubRange.Select Next
    For Each SubRange In ParentRange.Columns SubRange.Select Next
    For Each SubRange In ParentRange SubRange.Select Next
    End Sub
    Enjoy. And try it with a couple of merged cells in there, just to see how odd merged ranges can be.

提交回复
热议问题