Excel - VLoolup с Match - это оптимальное решение?

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

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

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

= ВПР ([@ForeignKey],RelatedTable,MATCH(RelatedTable[[# Заголовки],[ItemName]],RelatedTable[#headers],0), значение FALSE)
'Разбит по параметрам VLOOKUP(
  Lookup_value:= [@ForeignKey]
  Table_array:= RelatedTable
  Col_index_num:= ' Возврат MATCH
      MATCH(
        Lookup_value:= RelatedTable[[#Headers],[ItemName]]
        Lookup_array:= RelatedTable[#Headers]
        Match_type:= 0 'Точное совпадение Range_lookup:= FALSE ' Точное совпадение 

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

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

Table_Products
╔════╦════════╦═══════════════╦═══════════╗
║ ║ A ║ B ║ C ║
╠════╬════════╬═══════════════╬═══════════╣
║ 1 ║ ItemID ║ ItemName ║ ItemPrice ║
╠════╬════════╬═══════════════╬═══════════╣
║ 2 ║ 1 ║ Стилус ║ 25,00 ║
╠════╬════════╬═══════════════╬═══════════╣
║  3 ║      2 ║ Механическая клавиатура ║ $  120.00 ║
╠════╬════════╬═══════════════╬═══════════╣
║  4 ║      3 ║ Монитор ║ $  750,00 ║
╚════╩════════╩═══════════════╩═══════════╝

Table_Transactions

ТАК КАК ЭТО ТАКОЕ
╔════╦════════╦════════╦═════╦═══════════════════════╗
║    ║   A    ║   B    ║  C  ║           D           ║
╠════╬════════╬════════╬═════╬═══════════════════════╣
║  1 ║ CustID ║ ItemID ║ Кол-во ║ 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 ║          ...          ║
╚════╩════════╩════════╩═════╩═══════════════════════╝

ИЛИ КАК ЭТО
(Ячейка D1 НЕ является частью таблицы)

╔════╦════════╦════════╦═════╦═════════════════╗
║ ║ A ║ B ║ C ║ D ║
╠════╬════════╬════════╬═════╬═════════════════╣
║ 1 ║ ║ ║ ║ Match (,,) ║
╠════╬════════╬════════╬═════╬═════════════════╣
║ 2 ║ CustID ║ ItemID ║ Кол-во ║ 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 ответ

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

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

Другие вопросы по тегам