Estou acostumado a trabalhar com o VLOOKUP, mas desta vez tenho um desafio. Não quero o primeiro valor correspondente, mas o último. Quão? (Estou trabalhando com o LibreOffice Calc, mas uma solução do MS Excel deve ser igualmente útil.)
O motivo é que tenho duas colunas de texto com milhares de linhas, digamos que uma seja uma lista de beneficiários de transações (Amazon, Ebay, empregador, supermercado etc.) e a outra é uma lista de categorias de gastos (salários, impostos, casa, aluguel, etc.). Algumas transações não têm a mesma categoria de gastos todas as vezes, e eu quero escolher a usada mais recentemente. Observe que a lista não está classificada por nenhuma coluna (de fato por data) e não quero alterar a ordem de classificação.
O que tenho (excluindo o tratamento de erros) é a fórmula usual de "primeira correspondência":
=VLOOKUP(
[payee field] , [payee+category range] , [index of category column] ,
0 )
Eu já vi soluções como essa, mas recebo #DIV/0!
erros:
=LOOKUP(2 , 1/( [payee range] = [search value] ) , [category range] )
A solução pode ser qualquer fórmula, não necessariamente VLOOKUP. Também posso trocar as colunas beneficiário / categoria. Apenas nenhuma alteração na coluna de classificação, por favor.
Pontos de bônus por uma solução que escolhe o valor mais frequente do que o último!
fonte
IF
não pode lidar com matrizes.Evaluate Formula
para ver qual parte da fórmula está gerando o erro. Esse recurso existe no Excel, e eu ficaria surpreso se o LibreOffice Calc não tivesse o mesmo recurso.=VLOOKUP(J1061;$J$2:$K$9999;2;0)
onde a coluna J contém beneficiários e a coluna K as categorias. Retorna a primeira correspondência conforme o esperado.(Respondendo aqui como nenhuma pergunta separada para dados classificados.)
Se os dados foram classificados, você pode usar
VLOOKUP
orange_lookup
argumentoTRUE
(ou omitido, já que é o padrão), que é descrito oficialmente no Excel como "pesquisa por correspondência aproximada".Em outras palavras, para dados classificados:
FALSE
retornar o primeiro valor eTRUE
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
eHLOOKUP
), 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)
, onden
está o comprimento da matriz, e a condição invariante do loop é queA[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 retornak
. 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 ):
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
Planilhas Google :
fonte
Se os valores na matriz de pesquisa são seqüenciais (ou seja, você está procurando o maior valor, como a data mais recente), você nem precisa usar a função INDIRETO. Experimente este código simples:
Novamente, insira a fórmula usando CTRL + SHIFT + ENTER
fonte
Eu tentei o valor mais frequente. Não tenho certeza se funcionaria no libreOffice, mas parece funcionar no excel
A coluna A seria o beneficiário, a coluna B seria a categoria, D2 é o beneficiário pelo qual você deseja filtrar. Não sei por que está colocando quebras de linha extras na função acima.
Minha função para encontrar a última célula seria a seguinte:
Indireto permite-me especificar a coluna que quero retornar e encontrar a linha diretamente (para que não precise subtrair o número de linhas de cabeçalho).
Ambas as funções precisam ser inseridas usando Ctrl + shift + enter
fonte
Isso te dará o último valor
Recebo pontos de bônus por estar 3 anos atrasado?
fonte
Você obteve
#DIV/0!
erros porque prefere escrever sua fórmula como:isso funcionará e será encontrado na última partida.
([payee range] = [search value])
: matriz booleana TRUE / FALSEIF(([payee range] = [search value]);1;"")
: matriz pseudo-booleana 1 / ""=LOOKUP(2; {pseudo-boolean matrix 1/""} );[category range])
: sempre retornar última1
posiçãofonte
LOOKUP
funciona apenas na lista classificada, a saída do seu confronto resultará em uma lista de se1
espaços de maneira não classificada, portanto, não dará o resultado correto.