В этом ответе рассматриваются Структурированные таблицы в интерпретации Excel. В то время как методы можно легко перевести в матрицы необработанных данных без назначенной структуры таблиц, формулы и кодирование VBA для этого решения будут нацелены на истинно структурированные таблицы.
Преамбула
Третья таблица может содержать объединенные данные двух таблиц с некоторыми собственными формулами рабочего листа, но для правильного размера третьей таблицы при добавлении или удалении строк в / из зависимых таблиц потребуются либо операции изменения размера вручную, либо некоторый VBA, который отслеживает их изменяет и соответствует третьей таблице, чтобы удовлетворить. В конце этого ответа я включил варианты добавления имени рабочего листа исходной таблицы, а также некоторого кода VBA для обслуживания таблицы.
Если вам нужна только рабочая книга с примерами без объяснений, перейдите к концу этого ответа, чтобы получить ссылку на книгу, использованную для создания этой процедуры.
Примеры таблиц данных
1017 *
Я использовал пример данных ОП для построения двух таблиц с именами (по умолчанию) Table1 и Table2 на листах Sheet1 и Sheet2 соответственно. Я намеренно сместил их, меняя градусы от ячейки A1 каждого рабочего листа, чтобы продемонстрировать способность структурированной таблицы обращаться либо к себе, либо к другой структурированной таблице в формуле как к отдельной сущности, независимо от ее положения на родительском листе. Третья таблица будет построена аналогичным образом. Эти смещения предназначены только для демонстрационных целей; они не обязательны.
Шаг 1: постройте третий стол
Создайте заголовки для третьей таблицы и выберите эту будущую строку заголовка и хотя бы одну строку под ней, чтобы использовать команду Вставить ► Таблицы ► Таблица.
1028 *
Ваша новая пустая третья таблица на листе Sheet3 должна выглядеть следующим образом.
1035 *
Шаг 2: Заполните третью таблицу
Начните с заполнения первой ячейки в DataBodyRange третьей таблицы. В этом примере это будет Sheet3! C6. Введите или вставьте следующую формулу в C6, помня, что она основана на именах таблиц по умолчанию. Если вы изменили имена таблиц, измените их соответствующим образом.
=IFERROR(INDEX(Table1, ROW([@[no.]])-ROW(Table3[#Headers]),COLUMN(A:A)), INDEX(Table2, ROW([@[no.]])-ROW(Table3[#Headers])-ROWS(Table1),COLUMN(A:A)))
Функция INDEX сначала извлекает каждую доступную строку из Table1 . Фактические номера строк определяются с помощью функции ROW , которая ссылается на определенные фрагменты структурированной таблицы вместе с небольшими математическими вычислениями. Когда в Table1 заканчиваются строки, поиск передается второй функции INDEX, ссылающейся на Table2 с помощью функции IFERROR , и ее последовательные строки извлекаются с помощью функций ROW и ROWS используя немного больше математики. Функция COLUMN используется как COLUMN(A:A)
, которая будет извлекать первый столбец ссылочной таблицы независимо от того, где она находится на рабочем листе. Это будет переходить ко второму, третьему столбцу и т. Д., Если формула заполнена правильно.
Говоря о правильном заполнении, заполните формулу прямо до E6. У вас должно быть что-то похожее на следующее.
1066 *
Шаг 2.5: [необязательно] Добавить имя родительского листа исходной таблицы
Возьмите ручку определения размера Table3 (обозначенную оранжевой стрелкой на приведенном ниже примере изображения) в правом нижнем углу и перетащите ее вправо на один столбец, чтобы добавить новый столбец в таблицу. Переименуйте заголовок метки в нечто более подходящее, чем значение по умолчанию. Я использовал Лист в качестве метки столбца.
1077 *
Хотя вы не можете получить имя листа исходной таблицы напрямую, функция CELL может получить полный путь, имя файла и лист любой ячейки в сохраненной книге¹ в качестве одного из необязательных info_types .
Положите следующую формулу яВ пустую ячейку Таблицы в первой строке нового столбца, который вы только что создали.
=TRIM(RIGHT(SUBSTITUTE(CELL("filename", IF((ROW([@[no.]])-ROW(Table3[#Headers]))>ROWS(Table1), Table2, Table1)), CHAR(93), REPT(CHAR(32), 999)), 255))
Составить заполнение Таблицы3
Если вы не планируете завершить этот небольшой проект с помощью некоторого VBA, чтобы сохранить размеры таблицы 3 при добавлении или удалении строк из одной из двух исходных таблиц, просто возьмите ручку изменения размера таблицы 3 и перетащите вниз, пока вы не накопите все данные. из обеих таблиц. Внизу этого ответа приведено примерное изображение ожидаемых результатов.
Если вы планируете добавить немного VBA, пропустите все заполнение таблицы 3 и перейдите к следующему шагу.
Шаг 3: Добавьте немного VBA для поддержки третьей таблицы
Полная автоматизация процесса, который запускается изменениями данных рабочего листа, лучше всего обрабатывается макросом события Worksheet_Change рабочего листа. Поскольку задействованы три таблицы, каждая на своем рабочем листе, макрос события Workbook_SheetChange является лучшим методом обработки событий изменения из нескольких рабочих листов.
Откройте VBE с помощью Alt + F11 . Когда он откроется, найдите Project Explorer в левом верхнем углу. Если его не видно, нажмите Ctrl + R , чтобы открыть его. Найдите ThisWorkbook и щелкните правой кнопкой мыши, затем выберите Просмотреть код (или просто дважды щелкните ThisWorkbook).
1121 *
Вставьте следующее в новую панель под названием что-то вроде Book1 - ThisWorkbook (Код) .
Option Explicit
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Select Case Sh.Name
Case Sheet1.Name
If Not Intersect(Target, Sheet1.ListObjects("Table1").Range.Offset(1, 0)) Is Nothing Then
On Error GoTo bm_Safe_Exit
Application.EnableEvents = False
Call update_Table3
End If
Case Sheet2.Name
If Not Intersect(Target, Sheet2.ListObjects("Table2").Range.Offset(1, 0)) Is Nothing Then
On Error GoTo bm_Safe_Exit
Application.EnableEvents = False
Call update_Table3
End If
End Select
bm_Safe_Exit:
Application.EnableEvents = True
End Sub
Private Sub update_Table3()
Dim iTBL3rws As Long, rng As Range, rngOLDBDY As Range
iTBL3rws = Sheet1.ListObjects("Table1").DataBodyRange.Rows.Count
iTBL3rws = iTBL3rws + Sheet2.ListObjects("Table2").DataBodyRange.Rows.Count
iTBL3rws = iTBL3rws + Sheet3.ListObjects("Table3").DataBodyRange.Cells(1, 1).Row - _
Sheet3.ListObjects("Table3").Range.Cells(1, 1).Row
With Sheet3.ListObjects("Table3")
Set rngOLDBDY = .DataBodyRange
.Resize .Range.Cells(1, 1).Resize(iTBL3rws, .DataBodyRange.Columns.Count)
If rngOLDBDY.Rows.Count > .DataBodyRange.Rows.Count Then
For Each rng In rngOLDBDY
If Intersect(rng, .DataBodyRange) Is Nothing Then
rng.Clear
End If
Next rng
End If
End With
End Sub
Эти две подпрограммы широко используют свойство Worksheet .CodeName . CodeName рабочего листа имеет значение Sheet1, Sheet2, Sheet3 и т. Д. и не изменяется при переименовании рабочего листа. На самом деле, они редко меняются даже более опытным пользователем. Они были использованы для того, чтобы вы могли переименовывать свои рабочие листы без изменения кода. Тем не менее, они должны указывать на правильные рабочие листы сейчас. Измените код, если ваши таблицы и таблицы не совпадают с данными. Вы можете видеть отдельные кодовые имена рабочих листов в скобках рядом с их рабочим листом . Имя свойства на изображении выше, показывающем проводник проекта VBE.
Нажмите Alt + Q , чтобы вернуться к рабочим листам. Все, что осталось, это закончить заполнение Table3 , выбрав любую ячейку в Table1 или Table2 и сделав вид, что ее изменили, нажав F2 затем Введите↵ . Ваши результаты должны напоминать следующее.
1157 *
Если вы проделали весь этот путь, то у вас должна быть довольно полная таблица сбора, которая активно объединяет данные из двух исходных «дочерних» таблиц. Если вы также добавили VBA, то обслуживание третьей таблицы сбора практически отсутствует.
Переименование таблиц
Если вы решите переименовать одну или все три таблицы, формулы рабочего листа будут мгновенно и автоматически отражать изменения. Если вы решили включить Workbook_SheetChange и сопровождающую вспомогательную процедуру помощника, вам придется вернуться в кодовую таблицу ThisWorkbook и использовать Find & Replace, чтобы внести соответствующие изменения.
Пример рабочей книги
Я сделал полностью рабочую рабочую книгу примера доступной из моего общедоступного DropBox.
Table_Collection_w_Sheetname.xlsb
¹ Функция CELL может извлечь только имя листа сохраненной книги. Если рабочая книга не была сохранена, то у нее нет имени файла, и функция CELL вернет пустую строку при запросе имени файла.