Как добавить несколько строк из одной таблицы Excel (ListObject) в другую?
У меня есть две таблицы:
Table_1 Table_2
A B C A B C
------------- -------------
1| A1| B1| C1| 1| A2| B2| C2|
2| A1| B1| C1| 2| A2| B2| C2|
3| A1| B1| C1| 3| A2| B2| C2|
Результирующая таблица:
Table_1
A B C
-------------
1| A1| B1| C1|
2| A1| B1| C1|
3| A1| B1| C1|
4| A2| B2| C2|
5| A2| B2| C2|
6| A2| B2| C2|
Table_2 - это временная таблица (ListObject), которая запрашивает в базе данных записи с использованием подключения к данным.
Table_1 - это таблица (ListObject), которая действует как сводный список записей. Он хранится отдельно, потому что (1) сокращает время запроса в Table_2 и (2) имеет некоторые программные изменения.
У меня есть код VBA, который копирует Table_2 в Table_1, а затем обновляет строку подключения для Table_2, чтобы не включать записи с датами в пределах диапазона Table_1. В результате Table_2 извлекает только новые данные.
Мой код (правильно) копирует данные из Таблицы_2 в Таблицу_1:
For Each temprow in Table_2.ListRows
Set newRow = table_1.ListRows.Add
tempRow.Range.Copy
newRow.Range.PasteSpecial xlPasteValues
Next
Это прекрасно работает, если в Table_2 (новые записи) всего дюжина записей. Иногда в Table_2 будет пара сотен записей, на заполнение которых уйдет буквально 20 минут. Я подозреваю, что это потому, что я делаю пару сотен итераций.Copy и.Paste.
Есть ли способ, которым я могу сделать это оптом: скопировать ВСЕ из Table_2 и просто сделать его частью Table_1? Я чувствую, что то, что я хочу сделать, должно занять всего 1 секунду, чтобы выполнить программно, а не 20 минут. У меня нет условий или исключений. Я хочу ВСЕ из Таблицы_2, что должно быть легко. Я, наверное, ошибаюсь. Любая помощь приветствуется. Благодарю.
3 ответа
Возможно это, меняя рабочий лист соответствующим образом:
Option Explicit
Sub CombineTables()
Dim LO1 As ListObject, LO2 As ListObject
With Sheet3
Set LO1 = .ListObjects("Table_1")
Set LO2 = .ListObjects("Table_2")
End With
LO2.DataBodyRange.Copy Destination:= _
LO1.DataBodyRange.Offset(LO1.DataBodyRange.Rows.Count).Resize(1, 1)
End Sub
Попробуйте использовать оператор объединения SQL для быстрого объединения таблиц (ODBC):
SELECT * FROM [Sheet1$] UNION SELECT * FROM [Sheet2$]
где таблица 1 находится на листе с именем "Sheet1" и таблица 2 на "Sheet2".
Сделайте это, перейдя в "Данные-> Из других источников-> Из Microsoft Query"
Скопируйте исходную таблицу и специальные значения вставки + форматирование во временном диапазоне
- Вырезать временный диапазон
- Добавить последнюю строку в таблицу назначения
- Выберите последнюю строку
- Вставьте выделение Вырезать в таблицу назначения с помощью Shift:=xlDown
- Удалите последний ряд, если он вам не нужен