What does the Excel range.Rows property really do?
好的,我正在为旧版Excel-VBA应用程序完成一个附加项目,而我又一次遇到了神秘的
有谁知道这些物业的实际用途以及应该向我提供什么? (注意:所有这些可能也适用于相应的
我真正想要使用的是返回一定范围的行,如下所示:
1 | SET rng = wks.Rows(iStartRow, iEndRow) |
但是,即使Intellisense显示了两个参数,我也无法做到这一点。相反,我必须使用其他两种或三种(非常模糊)的技术之一。
该帮助非常无济于事(对于Office VBA通??常如此),并且无论我添加了多少其他术语,都对谷歌搜索"行"并不是很有用。
我唯一能使用的是1)返回一行作为范围(
澄清:我知道它返回一个范围,并且还有其他方法可以获取一定范围的行。我要的是专门从
还有别的事吗?
-
Range.Rows.Count 返回范围中的行数。 -
Range.Columns.Count 返回范围中的列数。 -
Range.Rows.AutoFit() 自动调整范围中的行。 -
Range.Columns.AutoFit() 自动调整范围中的列。
您可能会发现
我知道这是因为SpreadsheetGear for .NET附带了.NET API,该API与Excel的API非常相似。 SpreadsheetGear API为IRange索引器提供了几种强类型的重载,包括您可能希望Excel具有的重载:
-
IRange this[int row1, int column1, int row2, int column2];
免责声明:我拥有SpreadsheetGear LLC
根据VBA Type()函数,Range.Rows,Range.Columns和Range.Cells是Excel.Range对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | TypeName(Selection.rows) 范围 </ PRE> 但是,这还不是全部:那些返回的对象是扩展类型,它们继承了Excel :: Range的每个属性和方法-但是.Columns和.Rows具有特殊的For ...每个迭代器,以及特殊的.Count属性。与父级Range对象的迭代器和计数完全不同。 </p> <p> 因此,.Cells被迭代并计为单单元格范围的集合,就像父级范围的默认迭代器一样。 </p> <p> 但是.Columns被迭代并计为垂直子范围的集合,每个垂直子范围都是单个列宽; </p> <p> .... rows被迭代并计为水平子范围的集合,每个水平子范围都高一行。 </p> <p> 理解这一点的最简单方法是逐步阅读以下代码并观察选择的内容: [cc] 公开子测试()<BR /> 昏暗子范围作为范围 昏暗的ParentRange作为范围<BR /> 设置ParentRange = ActiveSheet.Range(" B2:E5")<BR /> <BR /> 对于ParentRange.Cells中的每个子范围 子范围选择 下一个<BR /> 对于ParentRange.Rows中的每个子范围 子范围选择 下一个<BR /> 对于ParentRange.Columns中的每个子范围 子范围选择 下一个<BR /> 对于ParentRange中的每个子范围 子范围选择 下一个<BR /> 结束子 </ PRE> 请享用。并尝试在其中合并几个单元格,以查看合并范围的奇数。 </p><div class="suo-content">[collapse title=""]<ul><li> 这是所有回答" <wyn>Rows</wyn>和<wyn>Columns</wyn>除了<wyn>Count</wyn>都相同"的答案中缺少的部分。 在不考虑<wyn>Range</wyn>创建方式的情况下,迭代范围的行和列的功能非常强大。 它提供了一种非常干净的迭代单元的方式,避免了循环内的<wyn>Cells(i,j)</wyn>类型逻辑。 它还适用于某些情况下可能出现的不连续范围。</li></ul>[/collapse]</div><p><center>[wp_ad_camp_1]</center></p><hr> <p> 您的两个示例是我曾经使用过<wyn>Rows</wyn>和<wyn>Columns</wyn>属性的唯一内容,但是从理论上讲,您可以使用<wyn>Range</wyn>对象完成任何操作。 </p> <p> 这些属性的返回类型本身就是<wyn>Range</wyn>,因此您可以执行以下操作: </p> [cc]Dim myRange as Range Set myRange = Sheet1.Range(Cells(2,2),Cells(8,8)) myRange.Rows(3).Select |
这将选择
更新:要做您想做的事,您可以使用:
1 2 | Dim interestingRows as Range Set interestingRows = Sheet1.Range(startRow &":" & endRow) |
更新#2:或者,从另一个范围内获取行的子集:
1 2 3 4 5 6 7 8 9 | 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)) |
由于.Rows结果被标记为由行组成,因此您可以对其" For Each"进行单独处理,如下所示:
1 2 3 4 5 6 7 8 | 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"。)
我发现自己在Copy方法中使用range.Rows来实现其效果。它会将行的高度从起点复制到终点,这是我想要的行为。
1 | rngLastRecord.Rows.Copy Destination:=Sheets("Availability").Range("a" & insertRow) |
如果我使用的是rngLastRecord.Copy而不是rngLastRecord.Rows.Copy,则行高将是复制前的高度。
我不确定,但是我认为第二个参数是红色鲱鱼。
.Rows和.Columns都带有两个可选参数:RowIndex和ColumnIndex。尝试使用ColumnIndex,例如
我的感觉是从
我发现这有效:
1 | Rows(CStr(iVar1) &":" & CStr(iVar2)).Select |
这可能有点麻烦,但是下面的代码完成了您似乎想做的事情:
1 | Set rng = wks.Range(wks.Rows(iStartRow), wks.Rows(iEndRow)).Rows |
还有另一种方法,以这个为例
1 2 3 | Dim sr As String sr ="6:10" Rows(sr).Select |
您需要做的就是将变量