Excel range.Rows属性真的有用吗?

RBa*_*ung 59 excel vba ole-automation excel-vba

好的,我正在为一个遗留的Excel-VBA应用程序完成一个附加项目,我再一次遇到了神秘范围的难题.Rows(?)和worksheet.Rows属性.

有谁知道这些属性真正做了什么以及它们应该为我提供什么?(注意:所有这些可能也适用于相应的*.Columns属性).

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

   SET rng = wks.Rows(iStartRow, iEndRow)
Run Code Online (Sandbox Code Playgroud)

但是我从来没有能够做到这一点,即使Intellisense为它显示了两个参数.相反,我必须使用其他两种(非常kludgy)技术中的一种.

帮助是非常无益的(对于Office VBA通​​常如此),并且对于"Rows"的Google搜索并不是非常有用,无论我添加了多少其他术语.

我能够使用它的唯一的事情是1)返回单行作为范围(rng.Rows(i))和2)返回范围(rng.Rows.Count)中的行的计数.是吗?真的没有别的东西吗?

澄清:我知道它会返回一个范围,并且还有其他方法可以获得一系列行.我要求的具体是我们从.Cells()和.Range()得到的.Rows()得到了什么?我知道的两件事是1)返回单行范围的简单方法和2)计算范围内行数的方法.

还有别的事吗?

Joe*_*son 53

Range.RowsRange.Columns返回基本相同的Range,除了新Range有一个标志表示它代表行或列的事实.对于某些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很有用,尽管它们仍然不是你想要的.它们为所表示的范围返回所有可能的列EntireRow和所有可能的行EntireColumn.

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

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

免责声明:我拥有SpreadsheetGear LLC

  • `本质上是相同的Range ...`错过了这些属性的一个有价值的部分,它们为`For Each`循环提供了一个新的迭代器,它逐行或逐列地遍历`Range`.请参阅[尼罗河回答](http://stackoverflow.com/a/23394965/4288101)以供参考.当与"SpecialCells"或其他不连续范围(例如来自"AutoFilter")结合使用时,这非常强大.具体示例:当您没有"表格"时,在"自动过滤"之后快速将带状行着色应用于可见数据. (3认同)

Nig*_*nan 9

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

__PRE__
但是,这不是全部故事:那些返回的对象是从Excel :: Range继承每个属性和方法的扩展类型 - 但.Columns和.Rows有一个特殊的For ...每个迭代器,以及一个特殊的.Count属性"T 一样的父Range对象的迭代器和计数.

因此.Cells被迭代并计为单单元格范围的集合,就像父范围的默认迭代器一样.

但是.Columns被迭代并计为一组垂直子范围,每个子范围都是一个列宽;

......并且.Rows被迭代并计为水平子范围的集合,每个水平子范围都是单行高.

理解这一点的最简单方法是逐步执行此代码并观察所选内容:

__PRE__
请享用.并尝试使用几个合并的单元格,只是为了看看奇数合并的范围是多少.

  • **这个**是所有答案中缺少的部分,说"`行'和`列'除了'计数'之外是相同的".迭代一个范围的行和列而不考虑如何创建`Range`的能力非常强大.它提供了一种非常干净的方法来迭代单元格,避免了在循环中出现"Cell(i,j)"类型逻辑.它也适用于在某些情况下可能出现的不连续范围. (4认同)

e.J*_*mes 7

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

这些属性的返回类型本身就是a Range,所以你可以做以下事情:

Dim myRange as Range
Set myRange = Sheet1.Range(Cells(2,2),Cells(8,8))
myRange.Rows(3).Select
Run Code Online (Sandbox Code Playgroud)

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

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

Dim interestingRows as Range
Set interestingRows = Sheet1.Range(startRow & ":" & endRow)
Run Code Online (Sandbox Code Playgroud)

更新#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))
Run Code Online (Sandbox Code Playgroud)


小智 5

由于 .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
Run Code Online (Sandbox Code Playgroud)

我用它来检查人员列表(不同行)的几个类别(不同列)中任何一个的出勤情况。

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