ОК, ось рішення, яке працює, але може нанести вам пошкодження мозку, налаштувавши його. Я будував це крок за часом, обчислюючи один набір речей, які потім були використані наступними обчисленнями. Після того, як у мене була робоча модель, я працював назад, підміняючи фактичні формули для посилань на комірки, щоб усі формули посилалися лише на ваші фактичні списки, а не на проміжні обчислення. Формули грибів. Фактично, перша спроба створила формули, що перевищували ємність клітини. Я розділив його на дві таблиці, перший подав другий. Таблиці дуже великі, і ви б пішли з великими захопленнями, які намагаються отримати всі посилання на клітинки, які вказують на потрібні місця для заселення формул у двох напрямках по таблицях. Тому я додав кілька непрямих посилань, щоб формули можна було просто скопіювати та вставити, і вони працюватимуть без ручного очищення. На жаль, це дало кілька великих формул.
Я поясню це як приклад, розміщений у певних місцях електронної таблиці. Якщо вам потрібно знайти фрагменти в іншому місці, відредагуйте всі посилання рядків і стовпців у першій комірці, а потім скопіюйте та вставте для заповнення таблиць. Для власного розуму встановіть кілька відомих прикладів, щоб ви могли переконатися, що перші пара рядків і стовпців у кожній таблиці працюють, перш ніж заповнити все. Візьміть пару профілактичного аспірину і ми почнемо.
Це ґрунтується на вашому списку А у стовпцях від A до F, дані починаються з першого рядка (2000 рядків). Список B знаходиться у стовпцях H - J, дані починаються з рядка 1 (30 рядків).
Перша таблиця починається з L1. Ця таблиця створює перелік позицій записів Список B в записах Списку А. Наприклад:
Position: 1 2 3 4 5 6
So if a List A record contains: 1 3 3 5 7 9
and a List B record contains: 1 3 7
the entry in this table will be: 1 2 5 (stored as a single number: 125)
Якщо запис списку B не відповідає запису списку А, у комірці буде номер N / A. Макет цієї таблиці виглядає так:
[L] [M] [N] [O]
[1] <=======List B Row========>
[2] List A Row 1 2 3 ...
[3] 1
[4] 2
[5] 3
...
Потрібно фактично розмістити номери рядків як заголовки стовпців у другому рядку стовпців M через AP та як мітки рядків у стовпці L. Саме такі формули використовують як покажчики. Існує 30 стовпців даних, по одному для кожного рядка записів у списку B, і у вас буде 2 000 рядків, що представляють записи у списку А, починаючи з рядка 3. Кожна комірка таблиці відображає запис у списку B порівняно із записом у списку А . Це формула для M3:
=MATCH(INDIRECT("H"&M$2),$A1:$F1,0)&MATCH(INDIRECT("H"&M$2),$A1:$F1,0)
+MATCH(INDIRECT("I"&M$2),INDIRECT(ADDRESS($L3,MATCH(INDIRECT("H"&M$2),$A1:$F1,0)+1, , )&":$F"&$L3),0)&MATCH(INDIRECT("H"&M$2),$A1:$F1,0)
+MATCH(INDIRECT("I"&M$2),INDIRECT(ADDRESS($L3,MATCH(INDIRECT("H"&M$2),$A1:$F1,0)+1, , )&":$F"&$L3),0)
+MATCH(INDIRECT("J"&M$2),INDIRECT(ADDRESS($L3,MATCH(INDIRECT("H"&M$2),$A1:$F1,0)
+MATCH(INDIRECT("I"&M$2),INDIRECT(ADDRESS($L3,MATCH(INDIRECT("H"&M$2),$A1:$F1,0)+1, , )&":$F"&$L3),0)+1, , )&":$F"&$L3),0)
Я порушив формулу тут, щоб зробити її читабельнішою, але все це одна формула. Переконайтеся, що він працює в M3 - N4 з деякими зразками даних, а потім скопіюйте та вставте для заповнення таблиці.
Друга таблиця починається з AR1. Ця таблиця побудована так само:
[AR] [AS] [AT] [AU]
[1] <=======List B Row========>
[2] List A Row 1 2 3 ...
[3] 1
[4] 2
[5] 3
...
Ця таблиця працює аналогічно першій - кожна комірка представляє результати запису Списку B проти запису списку А. Ця таблиця містить ваші залишки. Отже, у прикладі, який я дав для першої таблиці, решта складе 359:
So if a List A record contains: 1 3 3 5 7 9
and a List B record contains: 1 3 7
the remainder is: 3 5 9
Формула, що йде в комірці AS3, така:
=IF(ISNA(M3),"",IF(ISERROR(FIND(COLUMN(INDIRECT("a"&$AR3)),M3)),INDIRECT("a"&$AR3),"")&
IF(ISERROR(FIND(COLUMN(INDIRECT("b"&$AR3)),M3)),INDIRECT("b"&$AR3),"")&
IF(ISERROR(FIND(COLUMN(INDIRECT("c"&$AR3)),M3)),INDIRECT("c"&$AR3),"")&
IF(ISERROR(FIND(COLUMN(INDIRECT("d"&$AR3)),M3)),INDIRECT("d"&$AR3),"")&
IF(ISERROR(FIND(COLUMN(INDIRECT("e"&$AR3)),M3)),INDIRECT("e"&$AR3),"")&
IF(ISERROR(FIND(COLUMN(INDIRECT("f"&$AR3)),M3)),INDIRECT("f"&$AR3),""))
Кожна комірка цієї таблиці буде містити або залишок, або нульовий символ, якщо не було відповідності.
Ви хотіли отримати підсумок результатів для кожного запису "Список А". Оскільки кожен рядок таблиці являє собою запис «Список А», резюме може міститись у кінці кожного рядка таблиці. 30 стовпців таблиці закінчуються на колонці BV, тому результати знаходяться у колонці BW. Формула для BW3 буде такою:
=AS3&IF(ISBLANK(AS3),""," ")&AT3&IF(ISBLANK(AT3),""," ")& ... &BV3&IF(ISBLANK(BV3),""," ")
Замість того, щоб показати тут усі 30 термінів, це показує лише перші два та останні. Дотримуйтесь тієї ж схеми, щоб додати решту. Він будує рядок результатів, об'єднуючи результати кожного матчу. Якщо в комірці є значення, воно додає пробіл перед наступним значенням. Якщо ви хочете інший роздільник, змініть пробіл на щось інше, наприклад пробіл з комами. Скопіюйте цю формулу в стовпчик BW для всіх рядків.
Це, мабуть, не найкорисніше місце для результатів. Як тільки у вас все буде працювати, ви можете переміщати речі. Насправді, якщо ви щось перемістите, у вас може бути масове очищення посилань на клітини. Було б більше сенсу просто створити потрібний вихід в іншому місці та використовувати посилання на комірки для посилання на вже створене.