OK,我整理了一个传统的Excel的VBA应用程序的附加项目,我再一次跑起来对抗神秘的难题range.Rows
(?)和worksheet.Rows
性能。
有谁知道这些属性确实和他们是什么应该提供给我吗? (注:所有这一切都可能适用于相应的*.Columns
性能也)。
我真的很希望能够使用它是返回行的范围,就像这样:
SET rng = wks.Rows(iStartRow, iEndRow)
但我从来没有能够得到它做的是,虽然智能感知显示这两个参数。 相反,我必须使用两个或三个其他(很缺憾)技术之一。
帮助是非常无益的(通常所以办公室VBA),和google搜索“行”是不是非常有用的,无论有多少其他方面,我添加到它。
我已经能够使用它是1的唯一的东西)返回一个单列为一个范围( rng.Rows(i)
和2)的范围(返回行数rng.Rows.Count
)。 是不是这样? 难道真的没有别的,它的好处是什么?
澄清:我知道,它返回一个范围,并且还有其他方法来获得一定范围的行。 我所要求的具体是什么我们从得到.Rows()
我们还没有从获得.Cells()
和.Range()
两件事情,我知道是:1)返回一个范围内的单排的更简单的方法,和2)的方法来计算一个范围内的行数。
还有别的事吗?
Answer 1:
Range.Rows
和Range.Columns
基本返回相同的范围除了一个事实,即新系列这表明它代表行或列的标志。 这是必要的Excel的一些性能如Range.Count和Range.Hidden并且对于一些方法,如Range.AutoFit()
-
Range.Rows.Count
返回范围的行数。 -
Range.Columns.Count
返回范围的列数。 -
Range.Rows.AutoFit()
autofits范围中的行。 -
Range.Columns.AutoFit()
autofits在范围列。
你可能会发现, Range.EntireRow
和Range.EntireColumn
是有用的,但他们仍然是你正在寻找不完全的东西。 他们返回了所有可能的列EntireRow
和所有可能的行为EntireColumn
为代表的范围。
我知道这是因为的SpreadsheetGear的.NET附带了一个非常类似Excel的API的.NET的API。 该API的SpreadsheetGear带有几个强类型重载到IRange索引包括你可能希望Excel中有一项:
IRange this[int row1, int column1, int row2, int column2];
免责声明:我自己的SpreadsheetGear LLC
Answer 2:
Range.Rows,Range.Columns和Range.Cells是Excel.Range目的,根据所述VBA类型()函数:
?类型名(Selection.rows) 范围
然而,这并不是故事的全部:那些返回对象扩展继承从Excel ::范围内的所有属性和方法的类型 - 但.Columns和.Rows有一个特殊的For ...每个迭代器,以及AREN特殊.count属性。 “T
不太一样父范围对象的迭代器和计数。
所以.Cells迭代和算作单细胞范围的集合,就像父范围的默认迭代器。
但.Columns被重复并计为垂直子范围,它们中的每一个单一的柱宽的集合;
......而.Rows迭代和算作水平子范围的集合,它们中的每一个单排高。
要了解这一点的最简单方法是通过一步这段代码,看有什么选择:
公用分类测试()
昏暗子范围为靶场 昏暗ParentRange由于范围
设置ParentRange = ActiveSheet.Range( “B2:E5”)
对于每个子范围在ParentRange.Cells SubRange.Select 下一个
对于每个子范围在ParentRange.Rows SubRange.Select 下一个
对于每个子范围在ParentRange.Columns SubRange.Select 下一个
对于每个子范围在ParentRange SubRange.Select 下一个
结束小组
请享用。 并在有一对夫妇的合并单元格的尝试,只是为了看看合并范围如何
奇能。
Answer 3:
你的两个例子是我曾经使用过的唯一的东西Rows
和Columns
的属性,但在理论上,你可以跟他们任何可以用做Range
对象。
这些属性的返回类型本身是一个Range
,所以你可以做这样的事情:
Dim myRange as Range
Set myRange = Sheet1.Range(Cells(2,2),Cells(8,8))
myRange.Rows(3).Select
这将选择第三排myRange
(单元格B4:在Sheet1 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))
Answer 4:
由于.Rows结果被标记为包括行的,你可以“对于每个”它来处理每一行独立,就像这样:
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做一个“对每个”在该范围内的列。)
Answer 5:
我不知道,但我想第二个参数是一个红色的鲱鱼。
无论.Rows和.Columns采取两个可选参数:rowIndex位置和ColumnIndex。 尝试使用ColumnIndex,例如Rows(ColumnIndex:=2)
对于.Rows和.Columns生成错误。
我感觉它继承从某种意义上Cells(RowIndex,ColumnIndex)
物业,但只有第一个参数是适当的。
Answer 6:
我自己用range.Rows其在复制方法的效果发现。 它复制从出发地到目的地,这是我想要的行为行的高度。
rngLastRecord.Rows.Copy Destination:=Sheets("Availability").Range("a" & insertRow)
如果我用了rngLastRecord.Copy代替rngLastRecord.Rows.Copy,行高会无论在那里复制前。
Answer 7:
这也许有点杂牌的,但下面的代码做你似乎什么想做的事情:
Set rng = wks.Range(wks.Rows(iStartRow), wks.Rows(iEndRow)).Rows
Answer 8:
我发现这工作:
Rows(CStr(iVar1) & ":" & CStr(iVar2)).Select
Answer 9:
还有另外一种方法,以此为例子
Dim sr As String
sr = "6:10"
Rows(sr).Select
所有你需要做的是你的变量转换iStartRow
, iEndRow
为字符串。
文章来源: What does the Excel range.Rows property really do?