1

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

Стоит также отметить, что хотя мои столы не будут массивными, они также не будут маленькими. Вероятно, будет около 6 таблиц в каждой с одним или двумя VLOOKUPS (полный столбец) с общим количеством записей в сотнях.

Точнее, я собираюсь создать набор таблиц в Excel и буду эмулировать полезности правильной реляционной базы данных, используя функцию VLOOKUP для получения значения связанной таблицы, но я буду использовать MATCH функция, чтобы получить индекс столбца, который я хочу, по его заголовку. Ниже приводится фактическая формула, которую я буду использовать:

=VLOOKUP([@ForeignKey],RelatedTable,MATCH(RelatedTable[[#Headers],[ItemName]],RelatedTable[#Headers],0),FALSE)
'Broken down by parameters
VLOOKUP(
  Lookup_value  := [@ForeignKey]
  Table_array   := RelatedTable
  Col_index_num := 'Return of MATCH
      MATCH(
        Lookup_value := RelatedTable[[#Headers],[ItemName]]
        Lookup_array := RelatedTable[#Headers]
        Match_type   := 0 'Exact Match
  Range_lookup  := FALSE 'Exact Match

РЕДАКТИРОВАТЬ:

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

Table_Products
╔════╦════════╦═══════════════╦═══════════╗
║    ║   A    ║       B       ║     C     ║
╠════╬════════╬═══════════════╬═══════════╣
║  1 ║ ItemID ║ ItemName      ║ ItemPrice ║
╠════╬════════╬═══════════════╬═══════════╣
║  2 ║      1 ║ Stylus        ║ $   25.00 ║
╠════╬════════╬═══════════════╬═══════════╣
║  3 ║      2 ║ Mech Keyboard ║ $  120.00 ║
╠════╬════════╬═══════════════╬═══════════╣
║  4 ║      3 ║ Monitor       ║ $  750.00 ║
╚════╩════════╩═══════════════╩═══════════╝

Table_Transactions

EITHER LIKE THIS
╔════╦════════╦════════╦═════╦═══════════════════════╗
║    ║   A    ║   B    ║  C  ║           D           ║
╠════╬════════╬════════╬═════╬═══════════════════════╣
║  1 ║ CustID ║ ItemID ║ Qty ║ ItemName              ║
╠════╬════════╬════════╬═════╬═══════════════════════╣
║  2 ║    101 ║      3 ║   1 ║ VLOOKUP(,,Match(,,),) ║
╠════╬════════╬════════╬═════╬═══════════════════════╣
║  3 ║    102 ║      3 ║   2 ║          ...          ║
╠════╬════════╬════════╬═════╬═══════════════════════╣
║  4 ║    103 ║      3 ║   1 ║          ...          ║
╠════╬════════╬════════╬═════╬═══════════════════════╣
║  5 ║    104 ║      2 ║   3 ║          ...          ║
╠════╬════════╬════════╬═════╬═══════════════════════╣
║  6 ║    105 ║      1 ║   8 ║          ...          ║
╠════╬════════╬════════╬═════╬═══════════════════════╣
║  7 ║    106 ║      2 ║   2 ║          ...          ║
╠════╬════════╬════════╬═════╬═══════════════════════╣
║  8 ║    107 ║      2 ║   1 ║          ...          ║
╠════╬════════╬════════╬═════╬═══════════════════════╣
║  9 ║    108 ║      2 ║   2 ║          ...          ║
╠════╬════════╬════════╬═════╬═══════════════════════╣
║ 10 ║    109 ║      1 ║   4 ║          ...          ║
╠════╬════════╬════════╬═════╬═══════════════════════╣
║ 11 ║    110 ║      2 ║  16 ║          ...          ║
╚════╩════════╩════════╩═════╩═══════════════════════╝

OR LIKE THIS
(D1 cell is NOT part of the table)

╔════╦════════╦════════╦═════╦═════════════════╗
║    ║   A    ║   B    ║  C  ║        D        ║
╠════╬════════╬════════╬═════╬═════════════════╣
║  1 ║        ║        ║     ║ Match(,,)       ║
╠════╬════════╬════════╬═════╬═════════════════╣
║  2 ║ CustID ║ ItemID ║ Qty ║ ItemName        ║
╠════╬════════╬════════╬═════╬═════════════════╣
║  3 ║    101 ║      3 ║   1 ║ VLOOKUP(,,D$1,) ║
╠════╬════════╬════════╬═════╬═════════════════╣
║  4 ║    102 ║      3 ║   2 ║       ...       ║
╠════╬════════╬════════╬═════╬═════════════════╣
║  5 ║    103 ║      3 ║   1 ║       ...       ║
╠════╬════════╬════════╬═════╬═════════════════╣
║  6 ║    104 ║      2 ║   3 ║       ...       ║
╠════╬════════╬════════╬═════╬═════════════════╣
║  7 ║    105 ║      1 ║   8 ║       ...       ║
╠════╬════════╬════════╬═════╬═════════════════╣
║  8 ║    106 ║      2 ║   2 ║       ...       ║
╠════╬════════╬════════╬═════╬═════════════════╣
║  9 ║    107 ║      2 ║   1 ║       ...       ║
╠════╬════════╬════════╬═════╬═════════════════╣
║ 10 ║    108 ║      2 ║   2 ║       ...       ║
╠════╬════════╬════════╬═════╬═════════════════╣
║ 11 ║    109 ║      1 ║   4 ║       ...       ║
╠════╬════════╬════════╬═════╬═════════════════╣
║ 12 ║    110 ║      2 ║  16 ║       ...       ║
╚════╩════════╩════════╩═════╩═════════════════╝

1 ответ1

1

Я бы написал в D2, =index(Table_Products'$B:$B,(match($B2,Table_Products'$A:$A,0)) Вы также можете выполнить двухстороннее соответствие, если хотите изменить какой столбец на вернуть вместо жесткого кодирования столбец имени элемента (столбец B). Я могу изменить ответ, если вам это нужно.

Я использую это ежедневно на листах с тысячами просмотров на многослойных таблицах и не замечаю проблем с производительностью. В общем случае Index/Match лучше, чем Vlookup, поскольку vlookup необходимо обрабатывать весь диапазон.

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