关于vba:Excel range.Rows属性的作用是什么?

What does the Excel range.Rows property really do?

好的,我正在为旧版Excel-VBA应用程序完成一个附加项目,而我又一次遇到了神秘的range.Rows(?)和worksheet.Rows属性的难题。

有谁知道这些物业的实际用途以及应该向我提供什么? (注意:所有这些可能也适用于相应的*.Columns属性)。

我真正想要使用的是返回一定范围的行,如下所示:

1
   SET rng = wks.Rows(iStartRow, iEndRow)

但是,即使Intellisense显示了两个参数,我也无法做到这一点。相反,我必须使用其他两种或三种(非常模糊)的技术之一。

该帮助非常无济于事(对于Office VBA通??常如此),并且无论我添加了多少其他术语,都对谷歌搜索"行"并不是很有用。

我唯一能使用的是1)返回一行作为范围(rng.Rows(i))和2)返回该范围内的行数(rng.Rows.Count)。是吗真的没有其他好处吗?

澄清:我知道它返回一个范围,并且还有其他方法可以获取一定范围的行。我要的是专门从.Rows()中获得什么,而从.Cells().Range()中尚未得到什么?我知道的两件事是:1)一种更简单的方法来返回单个行的范围,以及2)一种方法来计算范围内的行数。

还有别的事吗?


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

  • Range.Rows.Count返回范围中的行数。
  • Range.Columns.Count返回范围中的列数。
  • Range.Rows.AutoFit()自动调整范围中的行。
  • Range.Columns.AutoFit()自动调整范围中的列。

您可能会发现Range.EntireRowRange.EntireColumn很有用,尽管它们仍不是您要寻找的。对于所表示的范围,它们为EntireRow返回所有可能的列,为EntireColumn返回所有可能的行。

我知道这是因为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

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

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

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,例如Rows(ColumnIndex:=2),为.Rows和.Columns均生成错误。

我的感觉是从Cells(RowIndex,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

您需要做的就是将变量iStartRowiEndRow转换为字符串。