(Respondendo aqui como nenhuma pergunta separada para dados classificados.)
Se os dados foram classificados, você pode usar VLOOKUP
o range_lookup
argumento TRUE
(ou omitido, já que é o padrão), que é descrito oficialmente no Excel como "pesquisa por correspondência aproximada".
Em outras palavras, para dados classificados:
- definir o último argumento para
FALSE
retornar o primeiro valor e
- definir o último argumento para
TRUE
retornar o último valor.
Isso é em grande parte indocumentado e obscuro, mas data de VisiCalc (1979) e hoje é válido pelo menos no Microsoft Excel, LibreOffice Calc e Google Sheets. Em última análise, é devido à implementação inicial do LOOKUP
VisiCalc (e daí VLOOKUP
e HLOOKUP
), quando não havia um quarto parâmetro. O valor é encontrado pela pesquisa binária , usando o limite esquerdo inclusivo e o limite direito exclusivo (uma implementação comum e elegante), o que resulta nesse comportamento.
Tecnicamente, isso significa que se inicia a pesquisa com o intervalo candidato [0, n)
, onde n
está o comprimento da matriz, e a condição invariante do loop é que A[imin] <= key && key < A[imax]
(o limite esquerdo é <= o destino, o limite direito, que inicia um após o final, é > a meta; para validar, verifique os valores nos pontos de extremidade antes ou verifique o resultado depois) e divida e escolha sucessivamente o lado que preservar esse invariante: por exclusão, um lado o fará, até que você atinja um intervalo com 1 termo [k, k+1)
, e o algoritmo então retorna k
. Não precisa ser uma correspondência exata (!): É apenas a correspondência mais próxima abaixo. No caso de correspondências duplicadas, isso resulta em retornar a última correspondência, pois exige que o próximo valor seja maiordo que a chave (ou o final da matriz). No caso de duplicatas, você precisa de algum comportamento, e isso é razoável e fácil de implementar.
Esse comportamento é explicitamente explicado neste artigo antigo da Base de Dados de Conhecimento da Microsoft (ênfase adicionada): "XL: Como retornar a primeira ou a última correspondência em uma matriz" ( Q214069 ):
Você pode usar a função LOOKUP () para procurar um valor em uma matriz de dados classificados e retornar o valor correspondente contido nessa posição em outra matriz. Se o valor da pesquisa for repetido na matriz, ele retornará a última correspondência encontrada . Esse comportamento é verdadeiro para as funções VLOOKUP (), HLOOKUP () e LOOKUP ().
Segue documentação oficial para algumas planilhas; em nenhum dos casos o comportamento de "última correspondência" é declarado, mas está implícito na documentação do Planilhas Google:
Microsoft Excel
TRUE assume que a primeira coluna da tabela está classificada numericamente ou alfabeticamente e, em seguida, procurará o valor mais próximo .
Planilhas Google :
Se is_sorted
for TRUE
ou omitido, a correspondência mais próxima ( menor ou igual à chave de pesquisa) será retornada