3

假设我有以下示例表

在此处输入图像描述

我有一个贯穿整个ListColumn(2)(C / 3 列)的 for 循环,并根据谁拥有最多的苹果(例如 Michael 是 1,Robert 2 等)对“用户”进行排名

但是,假设我只想引用表格的特定范围
(例如,假设Range("C7:C9") <=> ListRows(3,4,5)
我该怎么做?

我有以下代码:

    Private Sub CommandButton1_Click()

    Dim tbl As ListObject: Set tbl = Sheets("Sheet1").ListObjects("Table1")
    Dim my_range As Range

    For Each my_range In tbl.ListColumns(2).DataBodyRange 
    ' ^ this runs through entire column instead of the specified range I want!
        my_range.Offset(0, 1) = WorksheetFunction.Rank(my_range, tbl.ListColumns(2).DataBodyRange)
         ' ^ again, isntead of entire DataBodyRange we should be rather referencing the specific Range
    Next my_range
End Sub

基本上,我需要以某种方式将.DataBodyRange自身限制在特定范围内,问题是,.DataBodyRange指定为将整个列/行或整个 ListObject 中的仅 1 个单元格作为.DataBodyRange([row index], [column index]).

因此,在选择 Robert,Michael,Laurel 的假设示例中,ListRows(3, 4, 5)预期结果将是:

在此处输入图像描述

任何建议如何做到这一点?

4

2 回答 2

1

我知道我迟到了,但为了后代......

使用.Offset和方法在或....Resize中做任何事情tbl.Rangetbl.DataBodyRange

要仅迭代选择行:

...
Set my_range1 = tbl.Listcolumns(2).DataBodyRange
For LoopControl = StartRow To EndRow
    my_range1.Resize(1).Offset(LoopControl - 1).Value2 = 'your code here
    'Alternate code
    tbl.ListRows(LoopControl).Resize(, 1).Offset(, 2).Value2 = 'your code here
    'Or even:
    tbl.DataBodyRange.Resize(1, 1).Offset(2, LoopControl).Value2 = 'your code here
Next LoopControl

请注意,您可以.ListColumns("Apples")在事后重新排列列的情况下使用。此外,您可以.Offset(, tbl.ListColumns("Apples").Index)适应不断变化的表结构。

或者将行的子集称为单个范围:

Set my_range = tbl.ListColumns(2).DataBodyRange.Offset(StartRow - 1).Resize(EndRow - StartRow + 1)
'Alternately:
Set my_Range = tbl.ListColumns(2).Range.Offset(StartRow).Resize(EndRow - StartRow + 1)
于 2021-07-21T02:26:07.177 回答
0

您可以使用以下方式引用列中的连续单元格:

With tbl.ListColumns(2).DataBodyRange
    For Each my_range in Range(.Cells(3), .Cells(5))
      ' Code here.
    Next my_range
End With

你是这个意思吗?

于 2018-08-07T21:51:40.540 回答