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.Rows
和Range.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.EntireRow
和Range.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
你的两个例子是我曾经使用过的Rows
和Columns
属性的唯一的东西,但理论上你可以用它们做任何可以用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
所有你需要做的就是将你的variablesiStartRow
, iEndRow
转换成一个string。