martes, 5 de abril de 2016

VBA: Buscar un valor aproximado en un rango en Excel.

En un comentario de esta entrada del blog (ver) un lector preguntaba por la forma de realizar una búsqueda aproximada (por exceso) de un valor dado.

Si partimos de estos datos en el rango B2:M10

VBA: Buscar un valor aproximado en un rango en Excel.



Deberemos retocar la función personalizada (UDF) del post anterior.. incorporándole un bucle DO...LOOP para localizar el siguiente valor superior al buscado más próximo.
Al no saber cuál es la diferencia de esa aproximación, he optado por incluir una salido del bucle cuando la diferencia llegue al valor buscado +10.
El bucle comenzaría con
DO
'la búsqueda por fila y columna..
LOOP UNTIL x=10


Así añadiremos nuestro código en un módulo estándar de nuestro explorador de proyectos:

Function busqueda(valor)
'función que busca un valor APROXIMADO dado en el rango B2:M10.
'iniciamos un contador que usaremos como diferencia a partir del valor dado
x = 1

Do
'c recorre las columnas de la matriz, de la 2ª a la 13ª.
For c = 2 To 13
    'f recorre las filas de la matriz, de la 2ª a la 10ª.
    For f = 2 To 10
        'si encontramos el valor aproximado nos detenemos
        'y salimos de la función
        If Cells(f, c).Value = valor + x Then
            busqueda = Cells(f, 1).Value
            Exit Function
        End If
    Next f
Next c
x = x + 1
'detenemos el bucle en una aproximación de +10
Loop Until x = 10
End Function



OJO, devuelve la primera coincidencia!!

3 comentarios:

  1. Hola, a veces quiero encontrar valores identicos pero con signos contrarios, es decir uno positivo y el otro negativo, con que funcion o que herramienta en Excel puedo usar para lograr esto.-

    ResponderEliminar
    Respuestas
    1. Hola Concepción,
      existe una función ABS que devuelve el valor absoluto del valor, por ejemplo,
      en A1 = -10
      en B1 = 10
      en C1:
      =ABS(A1)=ABS(B1)
      lo que devolverá VERDADERO, esto es, indica si son 'iguales'

      Espero te sirva
      Saludos

      Eliminar