Excel range.Rows属性真的有什么用?

好的,我正在为传统的Excel-VBA应用程序完成一个附加项目,并且我再次运行了神秘的range.Rows(?)和worksheet.Rows属性的难题。

有谁知道这些属性真的是什么,他们应该提供给我什么? (注意:所有这些可能也适用于相应的* .Columns属性)。

我真的希望能够使用它是为了返回一系列的行,如下所示:

SET rng = wks.Rows(iStartRow, iEndRow) 

但我从来没有能够做到这一点,即使智能感知显示了两个参数。 相反,我必须使用其他两种或另外三种技术中的一种。

帮助是非常无用的(对于Office VBA通​​常是这样),并且search“行”并不是很有用,无论我添加了多less其他术语。

我已经能够使用它的唯一的事情是1)作为范围( rng.Rows(i) )返回一行,并且2)返回范围( rng.Rows.Count )中的行的计数。 是吗? 还有没有其他的东西是好的?

澄清:我知道它返回一个范围,并有其他方法来获得一个行的范围。 我所要求的是我们从.Rows()中得到的,我们还没有从.Cells()和.Range()中得到的。 我知道的两件事情是1)返回单行的范围和2)计算范围内的行数的一种更简单的方法。

还有别的事吗?

Range.RowsRange.Columns基本上返回相同的范围,除了新的范围有一个标志,表示它表示行或列。 对于某些Excel属性(如Range.Count和Range.Hidden)以及某些方法(如Range.AutoFit()这是必需的:

  • Range.Rows.Count返回Range中的行数。
  • Range.Columns.Count返回Range中的列数。
  • Range.Rows.AutoFit()适应Range中的行。
  • Range.Columns.AutoFit()适应Range中的列。

你可能会发现Range.EntireRowRange.EntireColumn是有用的,尽pipe它们仍然不是你正在寻找的东西。 它们为EntireRow返回所有可能的列,为EntireRow返回表示范围内所有可能的行。

我知道这是因为SpreadsheetGear for .NET附带了与API的API非常相似的.NET API。 SpreadsheetGear API为IRange索引器提供了几个强types的重载,包括您可能希望Excel拥有的重载:

  • IRange this[int row1, int column1, int row2, int column2];

免责声明:我自己的SpreadsheetGear LLC

你的两个例子是我曾经使用过的RowsColumns属性的唯一的东西,但理论上你可以用它们做任何可以用Range对象完成的事情。

这些属性的返回types本身就是一个Range ,所以你可以这样做:

 Dim myRange as Range Set myRange = Sheet1.Range(Cells(2,2),Cells(8,8)) myRange.Rows(3).Select 

这将selectmyRange的第三行(Sheet1中的单元格B4:H4)。

更新:要做你想做的事情,你可以使用:

 Dim interestingRows as Range Set interestingRows = Sheet1.Range(startRow & ":" & endRow) 

更新#2:或者,从另一个范围内获取行的子集:

 Dim someRange As Range Dim interestingRows As Range Set myRange = Sheet1.Range(Cells(2, 2), Cells(8, 8)) startRow = 3 endRow = 6 Set interestingRows = Range(myRange.Rows(startRow), myRange.Rows(endRow)) 

Range.Rows,Range.Columns和Range.Cells是Excel.Range对象,根据VBA Type()函数:

 ?types名(Selection.rows)
范围

然而,这并不是全部:那些返回的对象是扩展types,它inheritance了Excel :: Range中的每个属性和方法 – 但.Columns和.Rows有一个特殊的For …每个迭代器和一个特殊的.Count属性aren与父对象的迭代器和计数完全相同。

所以.Cells被重复计算为一个单元格范围的集合,就像父范围的默认迭代器一样。

但是.Columns迭代计数为垂直子范围的集合,每个列都是单列的;

…和.Rows迭代计数为水平子范围的集合,每个都是单行高。

理解这个最简单的方法就是遍历这个代码并观察select的内容:

公共子testing() 
Dim SubRange As Range 昏暗的ParentRange作为范围
设置ParentRange = ActiveSheet.Range(“B2:E5”)

对于ParentRange.Cells中的每个子范围 SubRange.Select 下一个
对于ParentRange.Rows中的每个子范围 SubRange.Select 下一个
对于ParentRange.Columns中的每个子范围 SubRange.Select 下一个
对于ParentRange中的每个子范围 SubRange.Select 下一个
结束小组

请享用。 并尝试与几个合并单元格在那里,只是为了看看有多奇怪的合并范围可以。

我不确定,但我认为第二个参数是红鲱鱼。

.Rows和.Columns都有两个可选参数:RowIndex和ColumnIndex。 尝试使用ColumnIndex,例如Rows(ColumnIndex:=2) ,为.Rows和.Columns都生成一个错误。

我感觉它是从Cells(RowIndex,ColumnIndex)属性的某种意义上inheritance的,但只有第一个参数是合适的。

我发现自己在复制方法中使用了range.Rows的效果。 它将行的高度从原点复制到目的地,这是我想要的行为。

 rngLastRecord.Rows.Copy Destination:=Sheets("Availability").Range("a" & insertRow) 

如果我已经使用了rngLastRecord.Copy而不是rngLastRecord.Rows.Copy,则行高将是复制之前的任何东西。

由于.Rows结果被标记为由行组成,因此您可以“For Each”来单独处理每行,如下所示:

 Function Attendance(rng As Range) As Long Attendance = 0 For Each rRow In rng.Rows If WorksheetFunction.Sum(rRow) > 0 Then Attendance = Attendance + 1 End If Next End Function 

我用这个来检查一些人(不同行)列表中的几个类别(不同列)中的任何一个出席。

(当然,您可以使用.Columns在范围中的列上执行“For Each”)。

这可能是一个混乱,但下面的代码做你想做的事情:

 Set rng = wks.Range(wks.Rows(iStartRow), wks.Rows(iEndRow)).Rows 

我发现这个作品:

 Rows(CStr(iVar1) & ":" & CStr(iVar2)).Select 

还有另一种方法,以此为例

 Dim sr As String sr = "6:10" Rows(sr).Select 

所有你需要做的就是将你的variablesiStartRowiEndRow转换成一个string。