В 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 |
Ответы:
Вот чистое решение Excel без VBA. Он работает с помощью функции INDEX для перехода по строкам и по столбцам данных SQL до тех пор, пока значения не будут исчерпаны и не возникнет ошибка. Функция IFERROR улавливает ошибку и использует вторую функцию INDEX, чтобы шагать вниз по строкам и по столбцам введенных вручную данных, снова, пока эти значения не будут исчерпаны и не возникнет условие ошибки. Вторая функция IFERROR отлавливает ошибку и возвращает тире ("-"). (Для получения правильных результатов данные SQL должны обновляться через ленту.)
Создайте динамический именованный диапазон SQLDB для данных SQL в Sheet1, используя формулу:
Создайте второй динамический именованный диапазон EXCELRNG для введенных вручную данных в Sheet2, используя формулу:
Оба этих именованных диапазона предполагают, что имена переменных вводятся в строке 1 каждого из двух листов.
Введите имена переменных в строке 1 листа 3 (начиная с ячейки A1).
Введите следующую формулу в ячейку A2 Sheet3:
Скопируйте формулу в столбцы с именами переменных, а затем вниз по строкам, пока результаты формул не станут черточками («-»).
В качестве следующего шага можно создать сводную таблицу на другом листе для анализа и организации.
Опять же, первым шагом будет создание динамического именованного диапазона, скажем, RESULTRNG, вставка следующей формулы в поле ввода Name Manager для именованного диапазона:
Затем создайте сводную таблицу на новом листе, установив RESULTRNG в качестве таблицы, которую вы хотите проанализировать. Это отфильтровывает любые конечные тире из таблицы формул в Sheet3.
Это работает, потому что формула RESULTRNG подсчитывает общее количество строк в Sheet1 и Sheet2 (исключая заголовок в Sheet2) и общее количество столбцов в Sheet1, и устанавливает его экстент на основе этих подсчетов, исключая любые тире в любых конечных строках ( или столбцы) в таблице формул Sheet3.
источник
Я нашел способ сделать это. Это решение немного сложнее и требует, чтобы у обеих таблиц были свои собственные отдельные листы (на них больше ничего нет), но кроме этого оно делает почти то, что я хочу. (Здесь также, кажется, есть большой потенциал для выполнения более сложных операций, таких как соединения.)
Перейдите на вкладку данных на ленте, нажмите «Из других источников» и «Из Microsoft Query». Затем нажмите «Файлы Excel», выберите файл, в котором вы сейчас работаете, и нажмите «ОК». Затем нажмите «Отмена» и, когда появится вопрос о том, хотите ли вы продолжить редактирование в Microsoft Query, нажмите «Да». Отсюда вы можете нажать кнопку SQL и написать собственный запрос SQL на любом листе электронной таблицы. В моем случае:
Примечание: для меня этот метод перестает работать после того, как я закрываю файл и открываю его снова. В любом случае я публикую его здесь, но на случай, если это просто проблема с моим компьютером или кто-то другой может заставить его работать.
источник
Если вы заинтересованы в решении VBA, я смог заставить работать следующее:
Установите динамический именованный диапазон для данных, которые вы извлекаете из SQL Server. Откройте диспетчер имен, введите новое имя (скажем, «SQLDB») и скопируйте следующую формулу в поле «Относится к». Я предположил, что ваши данные находятся в Sheet1:
Установите другой именованный диапазон для диапазона, в который вводятся данные вручную. Я использовал имя EXCELRNG и предположил, что оно было в Sheet2. Именованный диапазон начинается со строки 2, чтобы исключить строку заголовка. Формула здесь идентична первой, за исключением листа, к которому она относится:
Вот первый набор настроек, которые я использовал для подключения к таблице SQL. Доступ к диалоговому окну можно получить, выбрав Подключения на вкладке Данные на ленте. Отключение фонового обновления гарантирует, что макрос VBA приостанавливается до тех пор, пока не завершится обновление данных в листе Excel. Обновление соединения при открытии рабочего листа может не понадобиться, но я хотел убедиться, что любая аутентификация будет выполнена до запуска макроса.
Наконец, это код VBA. Чтобы вставить его, выберите Visual Basic на вкладке «Разработчик». Выделите имя листа в списке слева. На него будет ссылаться как «VBA Project (имя листа)». Затем выберите «Вставить модуль» в строке меню в верхней части экрана и вставьте код в новый модуль. Обратите внимание, что я поместил сводную таблицу в Sheet3. Как написано, макрос не сортирует новую таблицу, хотя это не составит труда добавить.
источник
Вот версия решения @ chuff «Pure Excel», которое разработано специально для работы с таблицами. (IE Два источника данных, которые вы хотите объединить - это таблицы.)
Основное различие между этим методом и тем, что он написал в своем ответе, состоит в том, что вам не нужно определять именованные диапазоны для двух наборов данных, которые вы объединяете, поскольку они являются таблицами и уже имеют свой собственный именованный диапазон. Так что давай и назови свой первый стол
Table1
, и ваш второй столTable2
.Теперь создайте новую таблицу в верхнем левом углу нового листа и присвойте ей те же имена столбцов, что и двум другим таблицам. Затем введите следующую формулу в ячейку A2 только что созданного листа:
Затем скопируйте эту формулу по всем столбцам таблицы, а затем вниз по строкам, пока результаты формул не станут черточками («-»). Примечание. Сортировка этой новой таблицы ничего не даст, поскольку содержимое каждой ячейки фактически идентично (все они содержат одну и ту же формулу).
Если столбцы в объединенной таблице показывают 0, когда они должны отображать пустую ячейку, вы можете заключить формулу в этом столбце с помощью функции замены, например так:
Если вы хотите создать сводную таблицу, которая использует данные из этой новой таблицы, вам придется создать именованный диапазон. Во-первых, назовите таблицу
Table3
. Теперь перейдите на вкладку формул и нажмите «Определить имя». Дайте ссылку имени, введите следующее уравнение для ее значения («Относится к»):Затем вы можете использовать эту именованную ссылку в качестве диапазона для вашей сводной таблицы.
источник
Если вы просто хотите получить результат один раз, есть веб-сайт, который объединит две таблицы для вас: https://office-tools.online/table/merge/
Вы вставляете таблицы в веб-страницу и выбираете соответствующие параметры. Вот скриншот встроенного примера, который показывает, как его использовать:
источник