domingo, junio 01, 2014

Búsqueda horizontal con COINCIDIR

Lo más memoriosos de mis lectores seguramente recordarán la épica nota sobre búsqueda con la función COINCIDIR en columnas múltiples. En esa nota señalábamos que  la función COINCIDIR nos permite calcular la posición que ocupa un elemento determinado en un rango, pero que si el rango de búsqueda comprende más de una columna (o fila), la función da un resultado de error.
En la nota mostrábamos dos formas de realizar la búsqueda con COINCIDIR a lo largo de varias columnas: con fórmulas y con macros.

Ahora consideremos este problema: dada esta matriz de valores numéricos


queremos encontrar en qué fila aparece por primera vez el número 8. Como puede apreciarse el 8 aparece por primera vez en la fila 2.

Si aplicamos la fórmula que postulamos en la nota anterior, veremos que recibimos un resultado erróneo: ka fórmula da el resultado 3 cuando debería ser 2.

=SI.ERROR(COINCIDIR(H4,C4:C13,0),SI.ERROR(COINCIDIR(H4,D4:D13,0),SI.ERROR(COINCIDIR(H4,E4:E13,0),"ND")))
La fórmula realiza la búsqueda en el primer vector y si no encuentra una coincidencia, realiza la búsqueda en el segundo vector y así sucesivamente. Es decir, la búsuqeda en la matriz es "vertical", cuando lo que queremos hacer es una búsqueda "horizontal".

La solución obvia es usar vectores "horizontales", por ejemplo =SI.ERROR(COINCIDIR(H4,C4:E4,0),SI.ERROR(COINCIDIR(H4,C5:E5,0)....etc. El inconveniente de esta fórmula es obvio: en lugar de tres funciones COINCIDIR, tendríamos que combinar 10 funciones, tantas como las filas de la tabla. Imaginemos ahora una tabla con 1000 filas!

La solución en este caso es usar una función definida por el usuario que llamaremos "fila_celda"

Function fila_celda(Valor_Buscado, Matriz_Busqueda As Range)
    Dim rngCell As Range
  
    For Each rngCell In Matriz_Busqueda
        If rngCell.Value = Valor_Buscado Then
            fila_celda = rngCell.Row - Matriz_Busqueda(1).Row + 1
            Exit Function
        End If
    Next rngCell
   
    fila_celda = "inexistente"

End Function


Esta función usa dos argumentos: Valor_buscado y Matriz_Busqueda



La función realiza la búsqueda a lo largo de las filas como puede verse en el vector del argumento Matriz?Busqueda: 11,1,11;9,8,3;...(nótese el uso de la coma y el punto y coma).

El código de la función debe guardarse en un módulo común del editor de Vb. Para que estpe disponibles para todos los cuadernos abiertos, podemos guardarlo en el libro Personal.

Una vez guardada, la función aparecerá en el asistente de las funciones bajo la categoría "Definida por el usuario"

1 comentario:

  1. Otra posible solución mediante el uso de formulas seria mediante el uso del la función mínimo en combinación de la función coincidir y para el caso que no encuentre el numero le asignamos el numero de filas + 1 así usando el condicional SI, de modo de que si el valor mínimo es igual a el numero de filas +1 nos devulve un N/A y en caso contrario nos dará el valor mínimo de las tres coincidencias.

    =SI(MIN(SI.ERROR(COINCIDIR(H4;C4:C13;0);FILAS(C4:C13)+1);SI.ERROR(COINCIDIR(H4;D4:D13;0);FILAS(D4:D13)+1);SI.ERROR(COINCIDIR(H4;E4:E13;0);FILAS(E4:E13)+1))=FILAS(C4:C13)+1;"N/A";MIN(SI.ERROR(COINCIDIR(H4;C4:C13;0);FILAS(C4:C13)+1);SI.ERROR(COINCIDIR(H4;D4:D13;0);FILAS(D4:D13)+1);SI.ERROR(COINCIDIR(H4;E4:E13;0);FILAS(E4:E13)+1)))

    ResponderBorrar

Nota: sólo los miembros de este blog pueden publicar comentarios.