Excel - VLoolup com Match - esta é uma solução ideal?

1

Estou tentando evitar a redundância de calcular o mesmo índice quantas vezes houver registros, portanto, devo pré-calcular o índice com MATCH em uma célula oculta acima da minha tabela?

Também é importante notar que, embora minhas tabelas não sejam massivas, elas também não serão pequenas. Provavelmente, haverá cerca de 6 tabelas, cada uma com um ou dois VLOOKUPS (coluna completa), com uma contagem total de registros nas centenas.

Mais precisamente, vou criar um conjunto de tabelas no Excel e vou emular as coisas boas de um banco de dados relacional adequado usando a função VLOOKUP para obter um valor de uma tabela relacionada, mas farei uso da função MATCH para obter o índice da coluna desejada pelo cabeçalho. Segue-se a fórmula real que utilizarei:

=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

EDITAR:

A primeira tabela é aquela com a chave primária. Os dois últimos são dos dois exemplos que estou me referindo.

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 ║       ...       ║
╚════╩════════╩════════╩═════╩═════════════════╝

    
por David 22.06.2018 / 04:33

1 resposta

1

Eu escreveria em D2, =index(Table_Products'$B:$B,(match($B2,Table_Products'$A:$A,0)) Você também pode fazer uma correspondência bidirecional se desejar alterar a coluna a ser retornada, em vez de codificar permanentemente a coluna do nome do item (Coluna B). Eu posso modificar a resposta se você precisar disso.

Eu uso isso diariamente em folhas com milhares de pesquisas em tabelas multible e não percebo nenhum problema de desempenho. Em geral, Index / Match é melhor que Vlookup, já que o vlookup precisa processar todo o intervalo.

    
por 24.06.2018 / 13:07