Как добавить несколько строк из одной таблицы 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
  • Удалите последний ряд, если он вам не нужен
Другие вопросы по тегам