Estoy acostumbrado a trabajar con VLOOKUP pero esta vez tengo un desafío. No quiero el primer valor coincidente, sino el último. ¿Cómo? (Estoy trabajando con LibreOffice Calc pero una solución MS Excel debería ser igualmente útil).
La razón es que tengo dos columnas de texto con miles de filas, digamos que una es una lista de beneficiarios de transacciones (Amazon, Ebay, empleador, supermercado, etc.) y la otra es una lista de categorías de gastos (salarios, impuestos, hogar, alquiler, etc.). Algunas transacciones no tienen la misma categoría de gasto cada vez, y quiero obtener la más reciente. Tenga en cuenta que la lista no está ordenada por ninguna columna (de hecho, por fecha), y no quiero cambiar el orden de clasificación.
Lo que tengo (excluyendo el manejo de errores) es la fórmula habitual de "primer partido":
=VLOOKUP(
[payee field] , [payee+category range] , [index of category column] ,
0 )
He visto soluciones como esta, pero obtengo #DIV/0!
errores:
=LOOKUP(2 , 1/( [payee range] = [search value] ) , [category range] )
La solución puede ser cualquier fórmula, no necesariamente BUSCARV. También puedo intercambiar las columnas de beneficiario / categoría. Simplemente no hay cambio en la columna de clasificación, por favor.
¡Puntos de bonificación para una solución que elige el valor más frecuente en lugar del último!
fuente
IF
no puede manejar matrices.Evaluate Formula
para ver qué parte de la fórmula está generando el error. Esta función existe en Excel, y me sorprendería si LibreOffice Calc no tiene la misma función.=VLOOKUP(J1061;$J$2:$K$9999;2;0)
donde la columna J contiene beneficiarios y la columna K las categorías. Devuelve el primer partido como se esperaba.(Respondiendo aquí como una pregunta separada para los datos ordenados).
Si se ordenaron los datos , podría usarlos
VLOOKUP
con elrange_lookup
argumentoTRUE
(u omitido, ya que es el predeterminado), que se describe oficialmente para Excel como "buscar coincidencia aproximada".En otras palabras, para datos ordenados:
FALSE
devuelve el primer valor, yTRUE
devuelve el último valor.Esto es en gran parte indocumentado y oscuro, pero data de VisiCalc (1979), y hoy se mantiene al menos en Microsoft Excel, LibreOffice Calc y Google Sheets. En última instancia es debido a la aplicación inicial de
LOOKUP
en VisiCalc (y de allíVLOOKUP
yHLOOKUP
), cuando no había cuarto parámetro. El valor se encuentra mediante la búsqueda binaria , utilizando el límite izquierdo inclusivo y el límite derecho exclusivo (una implementación común y elegante), lo que resulta en este comportamiento.Técnicamente, esto significa que uno comienza la búsqueda con el intervalo candidato
[0, n)
, donden
está la longitud de la matriz, y la condición invariante del bucle es queA[imin] <= key && key < A[imax]
(el límite izquierdo es <= el objetivo, el límite derecho, que comienza uno después del final, es > el objetivo; para validar, verifique los valores en los puntos finales antes, o verifique el resultado después), y biseccione y elija sucesivamente el lado que conserve este invariante: por exclusión, un lado lo hará, hasta que llegue a un intervalo con 1 término[k, k+1)
, y el algoritmo luego vuelvek
. Esto no necesita ser una coincidencia exacta (!): Es solo la coincidencia más cercana desde abajo. En caso de coincidencias duplicadas, esto devuelve la última coincidencia, ya que requiere que el siguiente valor sea mayorque la clave (o el final de la matriz). En caso de duplicados, necesita algún comportamiento, y esto es razonable y fácil de implementar.Este comportamiento se indica explícitamente en este antiguo artículo de Microsoft Knowledge Base (énfasis agregado): "XL: Cómo devolver la primera o la última coincidencia en una matriz" ( Q214069 ):
La documentación oficial para algunas hojas de cálculo sigue; en ninguno de los dos se indica el comportamiento de "última coincidencia", pero está implícito en la documentación de Google Sheets
Microsoft Excel
Hojas de cálculo de Google :
fuente
Si los valores en la matriz de búsqueda son secuenciales (es decir, está buscando el valor más grande, como la fecha más reciente), ni siquiera necesita usar la función INDIRECTA. Prueba este código simple:
Nuevamente, ingrese la fórmula usando CTRL + MAYÚS + ENTRAR
fuente
Tuve una oportunidad en el valor más frecuente. No estoy seguro de si funcionaría en libreOffice, pero parece funcionar en Excel
La columna A sería el beneficiario, la columna B sería la categoría, D2 es el beneficiario por el que desea filtrar. No estoy seguro de por qué está poniendo saltos de línea adicionales en la función anterior.
Mi función para encontrar la última celda sería la siguiente:
Indirecto me permite especificar la columna que quiero devolver y encontrar la fila directamente (por lo que no necesito restar el número de filas de encabezado.
Ambas funciones deben ingresarse usando Ctrl + shift + enter
fuente
Esto te dará el último valor
¿Recibo puntos de bonificación por llegar 3 años tarde?
fuente
Tienes
#DIV/0!
errores porque deberías escribir tu fórmula como:esto funcionará y encontrará la última coincidencia.
([payee range] = [search value])
: matriz booleana VERDADERO / FALSOIF(([payee range] = [search value]);1;"")
: matriz pseudobooleana 1 / ""=LOOKUP(2; {pseudo-boolean matrix 1/""} );[category range])
: siempre volver a la última1
posiciónfuente
LOOKUP
funciona solo en una lista ordenada, el resultado de su comparación dará como resultado una lista de1
sy espacios de una manera no ordenada, por lo que no dará el resultado correcto.