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

IFno puede manejar matrices.Evaluate Formulapara 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
VLOOKUPcon elrange_lookupargumentoTRUE(u omitido, ya que es el predeterminado), que se describe oficialmente para Excel como "buscar coincidencia aproximada".En otras palabras, para datos ordenados:
FALSEdevuelve el primer valor, yTRUEdevuelve 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
LOOKUPen VisiCalc (y de allíVLOOKUPyHLOOKUP), 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), dondenestá 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 última1posiciónfuente
LOOKUPfunciona solo en una lista ordenada, el resultado de su comparación dará como resultado una lista de1sy espacios de una manera no ordenada, por lo que no dará el resultado correcto.