2

Я пытаюсь извлечь "остаток" (несоответствующая часть) поиска с использованием Excel 2003. Я пытался использовать различные комбинации функций, но кажется, что нет конкретной функции, которая могла бы вернуть несопоставленную часть записи, найденную в результате совпадения с другой частью записи.

Вот иллюстрация того, что я пытаюсь сделать. У меня есть два списка. Список А насчитывает 2000 записей. Каждая запись представляет собой массив из 9 ячеек, каждая из которых содержит одну цифру в столбцах от A до I. Цифры всегда в порядке возрастания. Так что данные выглядят так:

    [A]  [B]  [C]  [D]  [E]  [F]  [G]  [H]  [I]
     1    2    2    3    4    5    7    7    9
     2    4    5    5    6    6    8    9    9
    . . . etc.

Список B имеет 30 записей. Это значения, которые ищутся в записях Списка А. Каждая запись представляет собой массив из 5 ячеек, каждая из которых содержит одну цифру в столбцах с L по P. Эти цифры всегда в порядке возрастания. Итак, эти данные выглядят так:

    [L]  [M]  [N]  [O]  [P]
     1    1    3    4    5
     2    3    5    7    9
     1    2    3    4    5
    . . . etc.

Каждая запись в списке B ищется в списке A. Это совпадает, если все пять цифр в записи списка B совпадают с пятью цифрами в записи списка A. Таким образом, в этом примере первая запись списка B не соответствует ничему в списке A. Вторая и третья записи списка B соответствуют первой записи списка A, и никакие записи списка B не соответствуют второй записи списка A.

Когда есть совпадение, "остаток" - это другие четыре цифры записи списка А, которые не были частью совпадения. Для двух совпадений в этом примере это будет показано следующим образом:

    List A record: 1    2    2    3    4    5    7    7    9
    List B record:      2         3         5    7         9
    Remainder:     1         2         4              7


    List A record: 1    2    2    3    4    5    7    7    9
    List B record: 1    2         3    4    5
    Remainder:               2                   7    7    9

Таким образом, результат для первой записи списка А: 1247 2779 а результат для второй записи списка А - пустой.

Значения в записях списка B могут изменяться, поэтому решение должно быть "общим", чтобы результаты можно было обновлять без изменения формул.

Я попытался основать решение на функции COUNT чтобы подсчитать частоту каждой цифры 0-9 в каждом элементе списка A, а затем использовать функции IF и AND (указав, какая и сколько из каждой цифры требуется для соответствия), сказать мне, какие элементы в списке B соответствуют списку A. Мои попытки использовать другие функции не смогли извлечь остаток так, как я хочу.

Этот вопрос похож на Как извлечь напоминание о совпадении в MS Excel 2003, но шаблоны чисел отличаются. Решение было найдено для этого вопроса, но трудно понять, как изменить ответ, чтобы соответствовать этой проблеме. Время от времени у меня возникают подобные проблемы такого рода, поэтому я надеюсь на ответ, который включает процесс, которым я могу следовать, чтобы разработать аналогичные решения для других подобных проблем.

2 ответа2

1

Я начал создавать ответ на основе метода в предыдущем вопросе. Тогда я понял, что вы на правильном пути. Поскольку все в порядке возрастания, вы можете просто основать ответ на счет каждой цифры. Функция REPT будет строить строку, основываясь на том, сколько повторений символа вам нужно. Количество каждой цифры, которое вам нужно для остатка, - это количество в записи списка А минус количество в записи списка Б. Таким образом, для одного совпадения, скажем, цифры записи A находятся в A1:I1, а цифры записи B находятся в L1:P1. Остальная часть будет:

    =REPT(1,COUNTIF(A1:I1,1)-COUNTIF(L1:P1,1))&
     REPT(2,COUNTIF(A1:I1,2)-COUNTIF(L1:P1,2))&
     REPT(3,COUNTIF(A1:I1,3)-COUNTIF(L1:P1,3))&
     REPT(4,COUNTIF(A1:I1,4)-COUNTIF(L1:P1,4))&
     REPT(5,COUNTIF(A1:I1,5)-COUNTIF(L1:P1,5))&
     REPT(6,COUNTIF(A1:I1,6)-COUNTIF(L1:P1,6))&
     REPT(7,COUNTIF(A1:I1,7)-COUNTIF(L1:P1,7))&
     REPT(8,COUNTIF(A1:I1,8)-COUNTIF(L1:P1,8))&
     REPT(9,COUNTIF(A1:I1,9)-COUNTIF(L1:P1,9))

Это все одна формула. Я разбил его по линиям, так что кусочки выстраиваются в линию, и вы можете увидеть шаблон. Если совпадения нет, это приведет к ошибке, которая может быть обработана позже.

Вы хотите создать отчет о результатах всех матчей. Таким образом, мы можем создать структуру для этого.

Допустим, список A находится в A1:I2000, а список B в L1:P30. Создайте таблицу в R1:AV2002. Таблица будет механизмом для сбора результатов сравнения всех записей B со всеми записями A. Он также предоставит индекс для представления номеров строк в каждом списке, чтобы вы могли использовать общую формулу и косвенную адресацию для выполнения сопоставлений. Настройте таблицу так, чтобы она выглядела так:

        [R]     [S]      [T]       [U]   ...  [AV]
[1]             <=======List B Row===============>
[2] List A Row   1        2         3    ...   30
[3]     1
[4]     2
[5]     3
    ...

Каждая ячейка таблицы будет отражать совпадение между одной B-записью и A-записью. На самом деле введите номера строк списка A в качестве меток в столбце R, начиная со строки 3, а номера строк списка B в качестве заголовков столбцов в S2:AV2. Эти цифры будут использованы для указания на правильные записи.

В формуле, приведенной ранее в ответе, номера строк записей A и B жестко закодированы. Для этой таблицы нам нужна общая формула, которая может использовать метки строк и столбцов для ссылки на правильные записи, которые будут использоваться для каждой ячейки. Поэтому мы заменяем номера строк косвенными адресами на основе меток. Каждая ссылка на A1:I1 заменяется на:

    INDIRECT("$A"&$R3):INDIRECT("$I"&$R3)

и каждая ссылка на L1:P1 заменяется на:

    INDIRECT("$L"&S$2):INDIRECT("$P"&S$2)

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

    =REPT(1,COUNTIF(INDIRECT("$A"&$R3):INDIRECT("$I"&$R3),1)-COUNTIF(INDIRECT("$L"&S$2):INDIRECT("$P"&S$2),1))&
     REPT(2,COUNTIF(INDIRECT("$A"&$R3):INDIRECT("$I"&$R3),2)-COUNTIF(INDIRECT("$L"&S$2):INDIRECT("$P"&S$2),2))&
     REPT(3,COUNTIF(INDIRECT("$A"&$R3):INDIRECT("$I"&$R3),3)-COUNTIF(INDIRECT("$L"&S$2):INDIRECT("$P"&S$2),3))&
     REPT(4,COUNTIF(INDIRECT("$A"&$R3):INDIRECT("$I"&$R3),4)-COUNTIF(INDIRECT("$L"&S$2):INDIRECT("$P"&S$2),4))&
     REPT(5,COUNTIF(INDIRECT("$A"&$R3):INDIRECT("$I"&$R3),5)-COUNTIF(INDIRECT("$L"&S$2):INDIRECT("$P"&S$2),5))&
     REPT(6,COUNTIF(INDIRECT("$A"&$R3):INDIRECT("$I"&$R3),6)-COUNTIF(INDIRECT("$L"&S$2):INDIRECT("$P"&S$2),6))&
     REPT(7,COUNTIF(INDIRECT("$A"&$R3):INDIRECT("$I"&$R3),7)-COUNTIF(INDIRECT("$L"&S$2):INDIRECT("$P"&S$2),7))&
     REPT(8,COUNTIF(INDIRECT("$A"&$R3):INDIRECT("$I"&$R3),8)-COUNTIF(INDIRECT("$L"&S$2):INDIRECT("$P"&S$2),8))&
     REPT(9,COUNTIF(INDIRECT("$A"&$R3):INDIRECT("$I"&$R3),9)-COUNTIF(INDIRECT("$L"&S$2):INDIRECT("$P"&S$2),9))

Опять же, это все одна формула, разбитая на строки для удобства чтения. Как только S3 будет правильным, скопируйте эту формулу, чтобы заполнить все ячейки в таблице. Вы узнаете, правильно ли это: ссылки на записи списка А будут одинаковыми для всех ячеек в одной и той же строке таблицы, и $R3 будет увеличиваться при переходе по таблице (вторая строка таблицы, это будет $R4). Ссылки на записи списка B будут идентичны при переходе вниз по столбцу. S$2 изменит букву столбца при переходе по строке таблицы (второй столбец таблицы, это будет T$2). Как проверка, T3 должен выглядеть следующим образом:

    =REPT(1,COUNTIF(INDIRECT("$A"&$R3):INDIRECT("$I"&$R3),1)-COUNTIF(INDIRECT("$L"&T$2):INDIRECT("$P"&T$2),1))&
     REPT(2,COUNTIF(INDIRECT("$A"&$R3):INDIRECT("$I"&$R3),2)-COUNTIF(INDIRECT("$L"&T$2):INDIRECT("$P"&T$2),2))&
     REPT(3,COUNTIF(INDIRECT("$A"&$R3):INDIRECT("$I"&$R3),3)-COUNTIF(INDIRECT("$L"&T$2):INDIRECT("$P"&T$2),3))&
     REPT(4,COUNTIF(INDIRECT("$A"&$R3):INDIRECT("$I"&$R3),4)-COUNTIF(INDIRECT("$L"&T$2):INDIRECT("$P"&T$2),4))&
     REPT(5,COUNTIF(INDIRECT("$A"&$R3):INDIRECT("$I"&$R3),5)-COUNTIF(INDIRECT("$L"&T$2):INDIRECT("$P"&T$2),5))&
     REPT(6,COUNTIF(INDIRECT("$A"&$R3):INDIRECT("$I"&$R3),6)-COUNTIF(INDIRECT("$L"&T$2):INDIRECT("$P"&T$2),6))&
     REPT(7,COUNTIF(INDIRECT("$A"&$R3):INDIRECT("$I"&$R3),7)-COUNTIF(INDIRECT("$L"&T$2):INDIRECT("$P"&T$2),7))&
     REPT(8,COUNTIF(INDIRECT("$A"&$R3):INDIRECT("$I"&$R3),8)-COUNTIF(INDIRECT("$L"&T$2):INDIRECT("$P"&T$2),8))&
     REPT(9,COUNTIF(INDIRECT("$A"&$R3):INDIRECT("$I"&$R3),9)-COUNTIF(INDIRECT("$L"&T$2):INDIRECT("$P"&T$2),9))

Каждая ячейка таблицы будет отражать совпадение между B-записью и A-записью. Он будет содержать либо "остаток", либо ошибку в случае отсутствия совпадения. Вы хотите получить сводку результатов для каждой записи Списка А. Каждая строка таблицы представляет запись списка А. Результаты могут быть обобщены либо в конце таблицы (столбец AW), либо справа от данных Списка A (столбец J). Формула для первого резюме будет иметь вид:

=IF(ISERROR(S3),"",S3&" ")&IF(ISERROR(T3),"",T3&" ")&IF(ISERROR(U3),"",U3&" ")& ... &IF(ISERROR(AV3),"",AV3)

Вместо того, чтобы показывать здесь все 30 терминов, здесь показаны только первые три и последний. Следуйте той же схеме, чтобы добавить остальные. Он строит строку результата, объединяя результаты каждого совпадения. Если в ячейке есть значение, он добавляет пробел перед следующим значением. Если вы хотите использовать другой разделитель, измените пробел на что-то другое, например, запятую. Скопируйте эту формулу в итоговый столбец для всех строк в списке А.

0

Если у вас уже есть ответ на матч, то NOT(...) , скорее всего, даст вам несоответствующие результаты.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .