(respondendo aqui como nenhuma questão separada para dados classificados.)
Se os dados foram classificados, você pode usar VLOOKUP
com range_lookup
argumento TRUE
(ou omitido, já que é o padrão), que é oficialmente descrito para o Excel como "pesquisa para correspondência aproximada ".
Em outras palavras, para dados classificados:
- definir o último argumento como
FALSE
retorna o valor primeiro e
- definir o último argumento como
TRUE
retorna o valor último .
Isto é em grande parte não documentado e obscuro, mas data do VisiCalc (1979) e hoje é válido pelo menos no Microsoft Excel, no LibreOffice Calc e no Google Sheets. Em última análise, é devido à implementação inicial de LOOKUP
no VisiCalc (e daí VLOOKUP
e HLOOKUP
), quando não havia um quarto parâmetro. O valor é encontrado por pesquisa binária , usando o limite esquerdo e exclusivo inclusivo (uma implementação comum e elegante), que resulta neste comportamento.
Tecnicamente, isso significa que inicia-se a pesquisa com o intervalo de candidatos [0, n)
, em que n
é o comprimento da matriz e a condição invariante de loop é A[imin] <= key && key < A[imax]
(o limite esquerdo é < = o destino , o direito, que inicia um após o final, é > o alvo; para validar, ou verificar os valores nos pontos finais antes, ou verificar o resultado após), e dividir sucessivamente e escolher o lado que preserva essa invariante: por exclusão um lado , até chegar a um intervalo com 1 termo, [k, k+1)
, e o algoritmo retorna k
. Isso não precisa ser uma correspondência exata (!): É apenas a correspondência mais próxima de baixo. No caso de correspondências duplicadas, isso resulta no retorno da correspondência último , já que requer que o próximo valor seja maior do que a chave (ou o fim da matriz). No caso de duplicatas, você precisa de um comportamento alguns , e isso é razoável e fácil de implementar.
Esse comportamento é declarado explicitamente neste artigo antigo da Microsoft Knowledge Base (ênfase adicionada): "XL: Como retornar a primeira ou a última correspondência em uma matriz" ( Q214069 ):
You can use the LOOKUP() function to search for a value within an array of sorted data and return the corresponding value contained in that position within another array. If the lookup value is repeated within the array, it returns the last match encountered. This behavior is true for the VLOOKUP(), HLOOKUP(), and LOOKUP() functions.
A documentação oficial para algumas planilhas segue; Em nenhum deles o comportamento da "última correspondência" é indicado, mas está implícito na documentação do Planilhas Google:
-
Microsoft Excel
TRUE assumes the first column in the table is sorted either numerically or alphabetically, and will then search for the closest value.
-
Planilhas Google :
If is_sorted
is TRUE
or omitted, the nearest match (less than or equal to the search key) is returned