引用表的特定范围.DataBodyRange

时间:2018-05-18 11:39:20

标签: vba excel-vba excel-tables excel

假设我有以下示例表

enter image description here

我有一个贯穿整个if (response && response.data.Success) { var arrayBufferedPdf = base64ToArrayBuffer(response.data.Document); PDFJS.workerSrc = "./scripts/pdf.worker.js"; PDFJS.getDocument({ data: arrayBufferedPdf }).then(function (pdf) { var pageNum = 1; var numPages = pdf.numPages; for (pageNum; pageNum <= numPages; pageNum++) { pdf.getPage(pageNum).then(function (page) { var scale = 1.25; var viewport = page.getViewport(scale); var canvasContainer = document.getElementById('canvas_container'); var canvas = document.createElement('canvas'); canvas.height = viewport.height; canvas.width = viewport.width; canvasContainer.appendChild(canvas); var context = canvas.getContext('2d'); page.render({ canvasContext: context, viewport: viewport }); }); } }); } (C / 3列)的for循环,并根据谁拥有最多的苹果对“用户”进行排名(例如,Michael将是1,Robert 2等。 )

但是,我想说的是,我只想参考表格的特定范围 (例如,让我们说ListColumn(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被指定为从整个ListObject中取整个Column / Row或只有1个Cell作为{{ 1}}。

因此,在选择Robert,Michael,Laurel .DataBodyRange的假定例子中,预期结果将是:

enter image description here

有任何建议怎么做?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

您可以使用类似以下内容的列来引用连续的单元格:

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

这是你的意思吗?