Як злити дві таблиці в Excel, які мають однакові стовпці?


11

У Excel у мене є електронна таблиця, яка витягує дані з бази даних SQL в таблицю, а потім генерує звіт на основі цих даних. На жаль, дані в цій базі даних SQL є неповними, і я хочу включити в набір результатів додаткові рядки, які вводяться вручну в електронну таблицю.

Як би я хотів, я не можу просто вручну вставити ці додаткові рядки в таблицю, оскільки вони видаляються, коли Excel витягує нові дані з бази даних SQL. Отже, я розглядаю можливість створення окремої таблиці з тими ж заголовками стовпців на новому аркуші та введення туди даних, а потім створення третьої таблиці на іншому аркуші, яка якось поєднує рядки з таблиці, яка витягує дані з SQL та таблицю, куди вводяться дані вручну. Як я можу це досягти? (Або по черзі, чи є кращий спосіб зробити це, щоб я якось пропав?)


Приклад:

Table 1 (From Database):

  | Person | Week Of | Task | Hours |
  | Bob    | 1/6/13  | Foo  | 12    |
  | Mary   | 1/6/13  | Foo  | 7     |
  | Mary   | 1/6/13  | Bar  | 5     |
  | John   | 1/6/13  | Foo  | 5     |
  | John   | 1/13/13 | Foo  | 13    |

-

Table 2 (Entered Manually): 
  | Person | Week Of | Task | Hours |
  | Bob    | 1/6/13  | Baz  | 3     |
  | Mary   | 1/6/13  | Baz  | 2     |
  | John   | 1/13/13 | Baz  | 5     |

-

Result:
  | Person | Week Of | Task | Hours |
  | Bob    | 1/6/13  | Foo  | 12    |
  | Mary   | 1/6/13  | Foo  | 7     |
  | Mary   | 1/6/13  | Bar  | 5     |
  | John   | 1/6/13  | Foo  | 5     |
  | John   | 1/13/13 | Foo  | 13    |
  | Bob    | 1/6/13  | Baz  | 3     |
  | Mary   | 1/6/13  | Baz  | 2     |
  | John   | 1/13/13 | Baz  | 5     |

Чи добре для вас, якщо додані вами дані вручну нижче ваших даних SQL? Або їх треба сортувати за датою. Excel не перезапише рядки, що знаходяться прямо під існуючими рядками даних SQL. Але якщо обидва типи даних доводиться сортувати, то вся справа є складнішою.
nixda

Ну, я б вважав за краще їх сортувати, але це не зовсім необхідно. Важливим є те, що я можу використовувати зведені таблиці та інші інструменти Excel для аналізу всього набору даних (включаючи як таблиці вручну, так і автоматично заповнені). Мені також потрібно мати можливість автоматично витягувати нові дані з SQL автоматично.
Ajedi32

Чи була б така поведінка рішенням? Після першого запиту та після другого запиту . І звичайно, Excel автоматично оновить ваш SQL, коли ви відкриєте робочу книгу.
nixda

Гадаю, це працювало б. Я вважаю за краще мати дані в одній таблиці, щоб я міг фільтрувати, сортувати тощо, але, як я вже говорив, це не зовсім необхідно.
Ajedi32

можливо, ми знайдемо рішення для вашої проблеми зі сортуванням. Але для першого кроку просто вперше запитайте свій SQL у новій робочій книжці. Після цього додайте свої ручні записи прямо під ними. Тепер протестуйте його за допомогою другого (і більшого) запиту. Вони не будуть перезаписані. Це стандартна поведінка. Нічого особливого робити.
nixda

Відповіді:


2

Ось чисте рішення Excel без VBA. Він працює за допомогою функції INDEX для зменшення вниз рядків та стовпців даних SQL до тих пір, поки значення не вичерпаються і не виникла умова помилки. Функція IFERROR виявляє помилку та використовує другу функцію INDEX для зменшення рядків та стовпців введених вручну даних, знову до тих пір, поки ці значення не вичерпаються і не виникла умова помилки. Друга функція IFERROR виявляє помилку і повертає тире ("-"). (Дані SQL повинні бути оновлені через стрічку для формул, щоб отримати правильний результат.)

Створіть динамічний діапазон SQLDB для даних SQL у Sheet1, використовуючи формулу:

=OFFSET(Sheet1!$A$2,0,0,COUNTA(Sheet1!$A:$A)-1,COUNTA(Sheet1!$1:$1))

Створіть другий динамічний діапазон з назвою EXCELRNG для введених вручну даних у Sheet2 за допомогою формули:

=OFFSET(Sheet2!$A$1,1,0,COUNTA(Sheet2!$A:$A)-1,COUNTA(Sheet2!$1:$1))

Обидва названі діапазони передбачають, що імена змінних вводяться в рядок 1 кожного з двох аркушів.

Введіть імена змінних у рядок 1 таблиці 3 (починаючи з комірки A1).

Введіть таку формулу у комірку A2 Sheet3:

=IFERROR(INDEX(SQLDB,ROWS(A$2:A2),COLUMN(A2)),IFERROR(INDEX(EXCELRNG,ROWS(A$2:A2)-ROWS(SQLDB),COLUMN(A2)),"-"))

Скопіюйте формулу в стовпці назви змінної, а потім вниз по рядках, поки результати формул не будуть усі тире ("-").

Наступним кроком можна створити зведену таблицю на іншому аркуші для аналізу та організації.

Знову ж таки першим кроком було б створити динамічний діапазон з ім'ям, скажімо, RESULTRNG, вставивши таку формулу у поле введення диспетчера імен для названого діапазону:

=OFFSET(Sheet3!$A$1,0,0,COUNTA(Sheet1!$A:$A)+COUNTA(Sheet2!$A:$A)-1,COUNTA(Sheet1!$1:$1))

Потім створіть зведену таблицю на новому аркуші, встановивши RESULTRNG як таблицю, яку ви хочете проаналізувати. Це дозволить відфільтрувати будь-які проміжні тире з таблиці формул у Sheet3.

Це працює, тому що формула RESULTRNG підраховує загальну кількість рядків у Sheet1 та Sheet2 (за винятком заголовка в Sheet2) та загальну кількість стовпців у Sheet1, і встановлює його ступінь на основі цих підрахунків, виключаючи будь-які тире в будь-яких проміжних рядках ( або стовпці) у таблиці формул Sheet3.


Якби я зробив це таким чином, чи не повинен був би об'єднаний стіл мати фіксований розмір? І якби таблиця була більшою, ніж повинна була бути, чи не зіпсує мене це, якщо я спробую зробити зведену таблицю, яка обробляє дані з комбінованої таблиці? (Тому що деякі з значень таблиці означають символи "-"?) Або існує спосіб подолання цих проблем?
Ajedi32

(До речі, я, як правило, віддаю перевагу таким чистим рішенням Excel, як це, тому що вони не вимагають, щоб користувач
ввімкнув

Було б потрібно певне обслуговування рук, щоб переконатися, що формули фіксували всі дані у двох таблицях. Щоб уникнути тире, вам потрібно буде скопіювати формули лише туди, куди вони повернули дані, а не тире.
чаф

Чи можна було б створити інший названий діапазон, який включає лише рядки з об'єднаної таблиці, які не порожні (заповнені символами '-')? Таким чином я міг просто встановити зведені таблиці, щоб отримати їх дані з цього діапазону, і мені не доведеться турбуватися про тире.
Ajedi32

Я розширив свою відповідь, щоб пояснити, як можна створити зведену таблицю, виключаючи тире. Спроба помістити таблицю "без тире" просто перенесіть проблему з тире на інший аркуш з # N / A в клітинках тире, якщо нова таблиця не буде розміщена вручну щоразу, коли кількість рядків у вихідних даних змінюється.
чаф

5

Я знайшов спосіб це зробити. Це рішення трохи складне, і воно вимагає, щоб обидві таблиці мали свої окремі аркуші (з ними нічого іншого), але крім цього, він робить майже саме те, що я хочу. (Тут також, мабуть, є великий потенціал для здійснення складніших операцій, таких як з'єднання.)

Перейдіть на вкладку даних на стрічці, натисніть «Від інших джерел» та «Від запиту Microsoft». Потім натисніть файли Excel, виберіть файл, в якому ви зараз працюєте, і натисніть «Гаразд». Потім натисніть кнопку Скасувати, і коли буде запропоновано, чи потрібно продовжувати редагування в Microsoft Query, натисніть "Так". Звідси ви можете натиснути кнопку SQL і написати спеціальний запит SQL на будь-який аркуш електронної таблиці. У моєму випадку:

SELECT *
FROM `'Sheet1$'` `'Sheet1$'`
UNION ALL
SELECT *
FROM `'Sheet2$'` `'Sheet2$'`

Примітка. Для мене цей спосіб припиняє роботу після закриття файлу та відкриття його знову. Я все-таки публікую його тут, хоча у випадку, якщо це просто проблема з моїм комп’ютером або хтось інший, може змусити його працювати.


1
Це добре працює, з'єднуючи дві різні робочі зошити. Це було саме те, що мені потрібно. Дякую!
daVe

Цей метод для мене працює дуже добре. Виконайте запит, а потім просто скопіюйте дані та минуле в excel. Однак важливо зазначити, що він видалить з ваших даних будь-які повторювані рядки, сподіваюся, ви не заперечуєте, якщо я трохи відредагую цю відповідь.
Some_Guy

Додавши, оскільки це насправді трапилося зі мною, я майже використав це, щоб об'єднати купу даних про продажі в 1 електронну таблицю, перш ніж зробити піктограму, щоб отримати підсумки, і я отримав би кілька помилок, коли однаковий обсяг товару, що продається кілька разів, мав би був пропущений.
Some_Guy

@Some_Guy Просто використовуйте UNION ALL замість цього.
Ajedi32

3

Якщо вас зацікавило рішення VBA, я зміг отримати наступні роботи:

  • Встановіть динамічний діапазон з назвами для даних, які ви отримуєте з SQL Server. Відкрийте диспетчер імен, введіть нове ім'я (скажімо, "SQLDB") і скопіюйте наступну формулу у поле "Посилається на". Я припустив, що ваші вкладені дані містяться в таблиці1:

    =OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!$A:$A),COUNTA(Sheet1!$1:$1))
    
  • Встановіть інший названий діапазон для діапазону, в який вводяться дані вручну. Я використав ім'я EXCELRNG і припустив, що воно є в Sheet2. Іменований діапазон починається у другому рядку, щоб виключити рядок заголовка. Формула тут ідентична першій, за винятком аркуша, на який вона посилається:

    =OFFSET(Sheet2!$A$1,1,0,COUNTA(Sheet2!$A:$A)-1,COUNTA(Sheet2!$1:$1))
    
  • Ось перший набір параметрів, які я використовував для підключення до таблиці SQL. Доступ до діалогового вікна здійснюється шляхом вибору підключень на вкладці «Дані» на стрічці. Вимкнення оновлення фону гарантує, що макрос VBA призупиняється до повного оновлення даних на аркуші Excel. Оновлення підключення під час відкриття робочого аркуша може не знадобитися, але я хотів переконатися, що будь-яка автентифікація буде виконана до запуску макросу.

налаштування з'єднання

  • Ось другий набір налаштувань. Вони знаходяться в розділі "Властивості" на вкладці "Дані" (тоді як вибрана комірка в імпортованій таблиці SQL). Хоча я вибрав варіант "Вставити цілі рядки для нових даних, видалити невикористані комірки", я фактично не зіткнувся з проблемою з опцією "Вставити комірки ...".

властивості з'єднання

  • Нарешті, це код VBA. Щоб вставити його, виберіть Visual Basic на вкладці Developer. Виділіть назву робочого аркуша у списку зліва. Це посилання буде "Проект VBA (назва аркуша). Потім виберіть Вставити модуль на панелі меню у верхній частині екрана та вставте код у новий модуль. Зауважте, що я помістив зведену таблицю в Sheet3. Як написано, макрос не сортує нову таблицю, хоча це не важко буде додати.

    Sub StackTables()
    
       Dim Rng1 As Range, Rng2 As Range
    
       Set Rng1 = ThisWorkbook.Names("SQLDB").RefersToRange
       Set Rng2 = ThisWorkbook.Names("EXCELRNG").RefersToRange
    
       ' refresh the SQL table
       ThisWorkbook.Connections(1).Refresh
    
       ' clear the consolidated table range  
       Sheet3.Cells.ClearContents
    
       ' copy the SQL data into the consolidation range
       Rng1.Copy
       Sheet3.Range("A1").PasteSpecial xlPasteValues
    
       'copy the manually entered data into the consolidate range
       Rng2.Copy
       Sheet3.Range("A1").Offset(Rng1.Rows.Count, 0).PasteSpecial xlPasteValues
       Application.CutCopyMode = False
    
       Sheets("Sheet3").Activate
       ActiveSheet.Range("A1").Select
    
    End Sub
    

Це виглядає як досить міцне рішення. У мене є кілька питань, хоча. Що запускає цей макрос? Він просто автоматично запускається, коли ви оновлюєте з'єднання даних, або вам потрібно натиснути окрему кнопку, щоб запустити його вручну? По-друге, це працює з таблицями, правда? (Не лише діапазони, які не відформатовані як таблиці) Якщо це так, чи не може сама таблиця обробляти сортування? (Замість того, щоб макрос VBA
проводив

1
Як слід, ви запустили макрос, вибравши Макроси на вкладці «Розробник», а потім вибравши та запустивши макрос. Дві альтернативи: призначте її спеціальній кнопці на стрічці та використовуйте її для її запуску; або вбудувати його як макрокод у події Worksheet_Activate. Це запускається, коли ви вибираєте аркуш консолідації. Він буде працювати з таблицями, за якими можна робити сортування. Однак я не впевнений, чи автоматично вдаються таблиці, коли дані додаються.
чаф

3

Ось версія рішення «Чистий Excel» @ chuff, розроблена спеціально для роботи з таблицями. (IE Два джерела даних, які потрібно об'єднати, - це таблиці.)

Основна відмінність цього методу від того, який розміщено у його відповіді, полягає в тому, що вам не потрібно визначати названі діапазони для двох наборів даних, які ви об’єднуєте, оскільки вони є таблицями і вже мають свій власний діапазон. Тому продовжуйте називати свою першу таблицю Table1та свою другу таблицю Table2.

Тепер створіть нову таблицю у верхньому лівому куті нового аркуша та надайте їй ті самі назви стовпців, що й дві інші таблиці. Потім введіть наступну формулу в комірку A2 щойно створеного аркуша:

=IFERROR(INDEX(Table1,ROWS(A$2:A2),COLUMN(A2)), IFERROR(INDEX(Table2,ROWS(A$2:A2)-ROWS(Table1),COLUMN(A2)), "-"))

Далі скопіюйте цю формулу в усі стовпці таблиці, а потім вниз по рядках, поки результати формул не стануть тире ("-"). Примітка: Сортування цієї нової таблиці нічого не призведе, оскільки вміст кожної комірки насправді однаковий (всі вони містять ту саму формулу).

Якщо стовпці в об'єднаній таблиці відображають 0, коли вони повинні відображати порожню клітинку, ви можете обернути формулу в цьому стовпчику за допомогою функції заміщення, як це:

=SUBSTITUTE(<old expression here>, 0, "")

Якщо ви хочете створити зведену таблицю, яка використовує дані з цієї нової таблиці, вам доведеться створити названий діапазон. Спочатку назвіть таблицю Table3. Тепер перейдіть на вкладку формул і натисніть «Визначити ім’я». Назвіть ім'я посилання, введіть наступне рівняння для його значення ("Посилається на"):

=OFFSET(Table3[#All],0,0,ROWS(Table1)+ROWS(Table2)+1)

Потім ви можете використовувати цю названу посилання як діапазон для своєї зведеної таблиці.


0

Якщо ви хочете отримати результат одноразово, є веб-сайт, який об’єднає дві таблиці для вас: https://office-tools.online/table/merge/

Ви вставляєте таблиці на веб-сторінку і вибираєте відповідні параметри. Ось скріншот вбудованого прикладу, який вказує, як ним користуватися:

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.