Итерация по таблице в Excel VBA - PullRequest
1 голос
/ 05 июня 2019

Каков наилучший способ перебора содержимого каждой ячейки в таблице и получения / сохранения ее значения.При моем текущем подходе я не могу получить значение таблицы в моей переменной val

Образец таблицы:

enter image description here

Set ws = ActiveSheet
ws.Name = "sheet1"

Set tbl = ws.ListObjects("tblBor")
Application.Calculation = xlCalculationManual
ws.Calculate

With tbl.Sort
         .SortFields.Clear
         .SortFields.Add Key:=Range("tblBor[ID]"), SortOn:=xlSortOnValues, Order:=xlAscending
         .Header = xlYes
         .Apply
End With

Set rng = Range(tbl)
rows = tbl.Range.rows.Count
Columns = tbl.Range.Columns.Count

For iter = 1 To rows
    For col = 1 To Columns
        'Iterate through each row by each column
        'val = tbl.DataBodyRange(iter, col).Value

    Next col
Next iter

1 Ответ

1 голос
/ 05 июня 2019

У вас есть ListObject, используйте его API!ListRows и ListColumns являются коллекциями объектов, и самый быстрый способ их итерировать, на несколько порядков , - это цикл For Each:

Dim tblRow As ListRow
For Each tblRow In tbl.ListRows
    Dim tblCol As ListColumn
    For Each tblCol In tbl.ListColumns
        Debug.Print "(" & tblRow.Index & "," & tblCol.Index & "): " & tblRow.Range(tblCol.Index).Value
    Next
Next

Если выпросто хотите собрать содержимое в двумерный массив значений, вам не нужно ничего повторять - просто возьмите DataBodyRange и обработайте его как любой другой "обычный" Range:

Dim contents As Variant
contents = tbl.DataBodyRange.Value

Если вам позже потребуется выполнить итерацию этого двумерного массива вариантов, самый быстрый способ (тот же источник, что и выше) - это For...Next loop:

Dim currentRow As Long
For currentRow = LBound(contents, 1) To UBound(contents, 1)
    Dim currentCol As Long
    For currentCol = LBound(contents, 2) To UBound(contents, 2)
        Debug.Print "(" & currentRow & "," & currentCol & "): " & contents(currentRow, currentCol)
    Next
Next
...