Копирование строк из одного объекта в другой с помощью Excel VBA

Я хочу создать кусок кода VBA, который выберет первые 10 строк в ListObject, а затем вставит их в другой ListObject. Как только набор строк будет скопирован на новый лист, они будут обработаны, затем будут выбраны и обработаны следующие 10 строк и т. Д.

Я могу добиться этого с помощью стандартных функций VBA, но я хотел бы добиться этого с помощью ListObject, т.е.

Sub PopulateSectionOfData()

    Dim loInput As ListObject
    Dim loOutput As ListObject
    Dim intNumOfColumns As Integer
    Dim rngToCopy As Range
    Dim intRowsInFile As Integer

    ' Create the inout and output ListObjects
    Set loInput = Worksheets(WS_INPUT).ListObjects(LO_INPUT)
    Set loOutput = Worksheets(WS_OUTPUT).ListObjects(LO_OUTPUT)

    ' Delete all the current rows from the output table
    Worksheets(WS_OUTPUT).ListObjects(LO_OUTPUT).DataBodyRange.Delete

    ' Set variables
    intNumOfColumns = loInput.ListColumns.Count
    WorkbookCounter = 1
    intRowsInFile = 10                   ' Select 10 records at a time

    ' Get 10 records at a time from the input file
    For i = 1 To loInput.DataBodyRange.Rows.Count Step intRowsInFile - 1

        '???? - This is the area that i am unsure on
        Set rngToCopy = loInput.DataBodyRange(p, 1)
        rngToCopy.Copy loOutput

        '????

        ' TODO - Add further processing here
    Next i

    ' Clear used objects
    Set loInput = Nothing
    Set loOutput = Nothing

End Sub

Любая помощь в этом вопросе будет наиболее ценной, так как я хотел бы использовать ListObjects

заранее спасибо

1 ответ

Решение

DataBodyRange относится к фактическому диапазону строк и столбцов в таблице. Если в таблице нет строк (каково ваше состояние после выполнения DataBodyRange.Deleteвам нужно сначала добавить строку в таблицу; затем вы можете скопировать и вставить данные в эту строку, при этом Excel соответствующим образом расширит таблицу

Ваш for Цикл может быть обновлен следующим образом:

For i = 1 To loInput.DataBodyRange.Rows.Count Step intRowsInFile - 1

    ' First add a blank row to the table
    loOutput.ListRows.Add

    ' Check that 10 rows are available in the input table
    ' (Done to avoid adding blank rows to the output table)
    If i + 9 > loInput.DataBodyRange.Rows.Count Then
        loInput.DataBodyRange.Rows(i & ":" & loInput.DataBodyRange.Rows.Count) _
            .Copy loOutput.DataBodyRange.Rows(i)
    Else
        loInput.DataBodyRange.Rows(i & ":" & i + 9).Copy loOutput
    End If
Next i

Помните, что "DataBodyRange" возвращает диапазон. Так что сделайте это:

'copies entire line 1 from "loInput" to "loOutput" on line 2
loOutput.DataBodyRange.Rows(2) = loInput.DataBodyRange.Rows(1)

Кроме того, просто сделайте FOR для обработки остальных

Другие вопросы по тегам