Как объединить две таблицы в Excel с одинаковыми столбцами?

в 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     |
6
задан Ajedi32
17.12.2022 5:17 Количество просмотров материала 3504
Распечатать страницу

5 ответов

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

создать динамический именованный диапазон SQLDB для данных SQL в Листе1 с использованием формулы:

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

создать второй динамический диапазон EXCELRNG для вручную введенных данных в Лист2, используя формулу:

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

оба этих именованных диапазона предполагают, что имена переменных вводятся в строке 1 каждого из них листы.

Enter имена переменных в строке 1 листа 3 (начиная с ячейки A1).

Enter следующая формула в ячейке A2 листа 3:

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

скопировать формула по столбцам имен переменных, а затем вниз по строкам, пока результаты формул все тире (" -").

в качестве следующего шага можно создать сводную таблицу на другом листе для анализа и организация.

снова первым шагом было бы создать динамический именованный диапазон, скажем, RESULTRNG, вставив следующую формулу в поле ввода менеджера имен для именованного диапазона:

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

затем создайте сводную таблицу на новом листе, установив RESULTRNG в качестве таблицы, которую вы хотите проанализировать. Это отфильтрует все конечные тире из таблицы формул в Листе3.

это работает, потому что формула RESULTRNG подсчитывает общее количество строк в Листе1 и Sheet2 (исключая заголовок в Sheet2) и общее количество столбцов в Sheet1, и устанавливает его экстент на основе этих счетчиков, исключая любые тире в любых конечных строках (или Столбцах) в таблице формул Sheet3.

2
отвечен chuff 2022-12-18 13:05

Я нашел способ сделать это. Это решение немного сложно, и оно требует, чтобы у обеих таблиц были свои собственные отдельные листы (ни с чем другим на них), но кроме этого он делает почти именно то, что я хочу. (Кроме того, существует большой потенциал для выполнения более сложных операций, таких как объединения.)

перейдите на вкладку Данные на ленте, нажмите кнопку "из других источников" и "из Microsoft Query". Затем нажмите "файлы Excel", выберите файл, с которым вы в данный момент работаете, и нажмите кнопку ОК. Затем нажмите кнопку Отмена и при повышении На ли вы хотите продолжить редактирование в Microsoft Query, нажмите кнопку "Да". Отсюда вы можете нажать на кнопку SQL и написать SQL-запросе на любом листе в таблице. В моем случае:

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

Примечание: для меня этот метод перестает работать после закрытия файла и открытия его снова. Я все равно публикую его здесь, хотя в случае, если это просто проблема с моим компьютером или кто-то другой может заставить его работать.

5
отвечен Ajedi32 2022-12-18 15:22

Если вы заинтересованы в решении VBA, я смог получить следующее Для работы:

  • задайте динамический именованный диапазон для данных, получаемых из SQL Server. Откройте Диспетчер имен, введите новое имя (например, "SQLDB") и скопируйте следующую формулу в поле ссылается на ввод. Я предположил, что вытащил данные в Лист1:

    =OFFSET(Sheet1!$A,0,0,COUNTA(Sheet1!$A:$A),COUNTA(Sheet1!:))
    
  • задайте другой именованный диапазон для диапазона, в который вводятся данные вручную. Я название EXCELRNG и предположил, что это было в Sheet2. Именованный диапазон начинается в строке 2 исключить строку заголовка. Формула здесь идентична первой, за исключением листа, на который она ссылается:

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



connection settings



  • вот второй набор параметров. Они находятся в разделе свойства вкладки данные (при выборе ячейки в импортированной таблице SQL). Хотя я выбрала опция "вставить целые строки для новых данных, удалить неиспользуемые ячейки", на самом деле я не столкнулся с проблемами с "вставить ячейки"..." опцион.



connection properties



  • наконец, это код VBA. Чтобы вставить его, выберите Visual Basic на вкладке разработчик. Выделите имя листа в списке слева. Он будет называться " Проект VBA (имя листа). Затем вставьте модуль в строке меню в верхней части экрана, и вставляем код в новый модуль. Обратите внимание, что я помещаю сводную таблицу в Лист3. Как написано, макрос не сортирует новую таблицу, хотя это не сложно добавить.

    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
    
3
отвечен chuff 2022-12-18 17:39

вот версия @мякина это решение "Pure Excel", разработанное специально для работы с таблицами. (Т. е. два источника данных, которые вы хотите объединить, являются таблицами.)

основное различие между этим методом и один грубиян написал в ответ, что вам не нужно определять именованные диапазоны для двух наборов данных слиянии, поскольку они представляют собой таблицы, и уже есть свои именованный диапазон. Итак, назовите свою первую таблицу Table1, и ваша вторая таблица Table2.

Теперь создайте новую таблицу в левом верхнем углу нового листа и присвойте ей те же имена столбцов, что и двум другим таблицам. Затем введите следующую формулу в ячейку A2 только что созданного листа:

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

далее скопируйте эту формулу по всем столбцам таблицы, а затем вниз по строкам, пока результаты формул все тире (" -"). Примечание: сортировка этой новой таблицы ничего не сделает, так как содержимое каждой ячейки фактически идентично (все они содержат одну и ту же формулу).

если столбцы в объединенной таблице показывают 0, когда они должны отображать пустую ячейку, вы можете обернуть формулу в этот столбец с помощью функции замены, например:

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

если вы хотите создать сводную таблицу, которая использует данные из этой новой таблицы, вам придется создать именованный диапазон. Во-первых, назовите таблицу Table3. Теперь перейдите на вкладку формулы и нажмите кнопку "Определить имя". Дайте ссылке имя, введите следующее уравнение для его значения ("относится к"):

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

затем вы можете использовать эту именованную ссылку в качестве диапазона для сводной таблицы.

3
отвечен Ajedi32 2022-12-18 19:56

Если вы просто хотите получить результат на разовой основе, есть веб-сайт, который будет объединять две таблицы для вас: https://office-tools.online / table / merge/

вставить таблицы на веб-страницу и выберите соответствующие параметры. Вот скриншот встроенного примера, который показывает, как его использовать:

enter image description here

0
отвечен Hvg Hng 2022-12-18 22:13

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх