Как добавить несколько строк из одной таблицы 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 извлекает только новые данные.

Мой код (правильно) копирует данные из Table_2 в Table_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 минут. У меня нет условий или исключений. Я хочу ВСЕ из Table_2, что должно упростить задачу. Я, наверное, делаю это неправильно. Любая помощь приветствуется. Спасибо.


person user2271875    schedule 04.02.2015    source источник
comment
Возможно, вы сможете скопировать .DataBodyRange за один шаг.   -  person Ron Rosenfeld    schedule 05.02.2015
comment
Ответ Рона Розенфилда выше сработал для меня ПОСЛЕ того, как я удалил итоговые строки. Может быть, поэтому Шмалльс не мог заставить его работать. Я бы добавил это как комментарий, но у меня нет репутации.   -  person Joe Noble    schedule 25.04.2019


Ответы (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
person Ron Rosenfeld    schedule 04.02.2015
comment
Это направило меня в правильном направлении. Однако он не добавлял строки в таблицу, а просто вставлял их после таблицы. Мне пришлось добавить шаг создания новой строки таблицы в нижней части таблицы и использования ее в качестве места назначения для моей копии. Например, последняя строка будет заменена на: LO2.DataBodyRange.Copy Destination:=LO1.DataBodyRange.ListRows.Add.Resize(1, 1) - person Schmalls; 05.06.2015
comment
@Schmalls Здесь все работает правильно без этих изменений (Excel 2007), поэтому я предполагаю, что в вашей среде или ваших данных есть что-то другое. - person Ron Rosenfeld; 05.06.2015
comment
Странно, что у меня тогда был такой вывод. Я думаю, моя версия может быть просто альтернативной, если кто-то столкнется с той же проблемой. - person Schmalls; 06.06.2015

Попробуйте использовать оператор объединения SQL для быстрого объединения таблиц (ODBC):

SELECT * FROM [Sheet1$] UNION SELECT * FROM [Sheet2$]

где Таблица 1 находится на листе с именем «Лист1», а Таблица 2 — на «Листе2».

Для этого перейдите в «Данные-> Из других источников-> Из Microsoft Query».

person AnalystCave.com    schedule 04.02.2015

Скопируйте исходную таблицу и вставьте специальные значения + форматирование во временном диапазоне.

  • Сократите диапазон температур
  • Добавить последнюю строку в таблицу назначения
  • Выберите последнюю строку
  • Вставьте выделение Cut в таблицу назначения с помощью Shift:=xlDown.
  • Удалите последнюю строку, если она вам не нужна
person icek    schedule 02.11.2015