¿Cómo obtener VLOOKUP para devolver el * último * partido?

12

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!

Torben Gundtofte-Bruun
fuente

Respuestas:

3

Puede usar una fórmula de matriz para obtener datos del último registro coincidente.

=INDEX(IF($A$1:$A$20="c",$B$1:$B$20),MAX(IF($A$1:$A$20="c",ROW($A$1:$A$20))))

Ingrese la fórmula usando Ctrl+ Shift+ Enter.

Esto funciona como INDEX/ MATCHconstrucción de a VLOOKUP, pero con un condicional MAXusado en lugar de MATCH.

Tenga en cuenta que esto supone que su tabla comienza en la fila 1. Si sus datos comienzan en una fila diferente, deberá ajustar la ROW(...)parte restando la diferencia entre la fila superior y 1.

Excellll
fuente
Estoy confundido acerca de esa "c" literal: creo que la evaluación siempre es falsa, entonces, ¿qué hace realmente?
Torben Gundtofte-Bruun
Probé su sugerencia (y verifiqué que se aceptara como una fórmula de matriz). Supongo que Col A es beneficiario y B es categoría, ¿verdad? Desafortunadamente, LibreOffice devuelve "ERR: 502" que se traduce en "Argumento no válido: el argumento de la función no es válido. Por ejemplo, un número negativo para la función SQRT (), para esto utilice IMSQRT ()". Verifiqué que todas las funciones existen con ese nombre en LibreOffice, pero me pregunto si LibreOffice IFno puede manejar matrices.
Torben Gundtofte-Bruun
Lo sentimos, la literal "c" era solo el nombre del beneficiario que deseaba coincidir. Esa fue una reliquia de mis datos de muestra con los que estaba jugando. Supongo que se reemplazará con una referencia de celda en su hoja.
Excellll
@ TorbenGundtofte-Bruun Care para compartir la fórmula que está utilizando? Es posible que pueda solucionarlo si puedo verlo. Además, siempre puede intentar recorrer la fórmula con 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.
Excellll
Mi fórmula original es sencilla, por eso no es adecuada :-) =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.
Torben Gundtofte-Bruun
2

(Respondiendo aquí como una pregunta separada para los datos ordenados).

Si se ordenaron los datos , podría usarlos VLOOKUPcon el range_lookupargumento TRUE(u omitido, ya que es el predeterminado), que se describe oficialmente para Excel como "buscar coincidencia aproximada".

En otras palabras, para datos ordenados:

  • establecer el último argumento en FALSEdevuelve el primer valor, y
  • establecer el último argumento en TRUEdevuelve 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í VLOOKUPy HLOOKUP), 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), donde nestá la longitud de la matriz, y la condición invariante del bucle es que A[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 vuelve k. 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 ):

Puede usar la función LOOKUP () para buscar un valor dentro de una matriz de datos ordenados y devolver el valor correspondiente contenido en esa posición dentro de otra matriz. Si el valor de búsqueda se repite dentro de la matriz, devuelve la última coincidencia encontrada . Este comportamiento es verdadero para las funciones VLOOKUP (), HLOOKUP () y LOOKUP ().

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

    VERDADERO asume que la primera columna de la tabla está ordenada numéricamente o alfabéticamente, y luego buscará el valor más cercano .

  • Hojas de cálculo de Google :

    Si is_sortedes TRUEu omite, se devuelve la coincidencia más cercana ( menor o igual que la clave de búsqueda)

Nils von Barth
fuente
¡Ese fósforo más cercano me estaba volviendo loco!
dukedave
1

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:

=MAX(IF($A$1:$A$20="c",$B$1:$B$20,)

Nuevamente, ingrese la fórmula usando CTRL + MAYÚS + ENTRAR

El stich
fuente
0

Tuve una oportunidad en el valor más frecuente. No estoy seguro de si funcionaría en libreOffice, pero parece funcionar en Excel

= ÍNDICE ($ B $ 2: $ B $ 9, MATCH (MAX (- ($ A $ 2: $ A $ 9 = D2) * COUNTIFS ($ B $ 2: $ B $ 9, $ B $ 2: $ B $ 9, $ A $ 2 : $ A $ 9, D2)), - ($ A $ 2: $ A $ 9 = D2) * CONDADOS ($ B $ 2: $ B $ 9, $ B $ 2: $ B $ 9, $ A $ 2: $ A $ 9, D2 ), 0))

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 ("B" y MAX (- ($ A $ 2: $ A $ 9 = D2) * ROW ($ A $ 2: $ A $ 9)))

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

gtwebb
fuente
0
=LOOKUP([payee field] , [payee range] , [category range])

Esto te dará el último valor

¿Recibo puntos de bonificación por llegar 3 años tarde?

DavePenn
fuente
-1

Tienes #DIV/0!errores porque deberías escribir tu fórmula como:

=LOOKUP(2;IF(([payee range] = [search value]);1;"");[category range])

esto funcionará y encontrará la última coincidencia.

([payee range] = [search value]) : matriz booleana VERDADERO / FALSO

IF(([payee range] = [search value]);1;"") : matriz pseudobooleana 1 / ""

=LOOKUP(2; {pseudo-boolean matrix 1/""} );[category range]): siempre volver a la última 1posición

Samuel
fuente
LOOKUPfunciona solo en una lista ordenada, el resultado de su comparación dará como resultado una lista de 1sy espacios de una manera no ordenada, por lo que no dará el resultado correcto.
Máté Juhász