Копирование строк из одного объекта в другой с помощью 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 для обработки остальных