Nos queda por comentar una serie de estructuras de control muy parecidas entre ellas, por lo que lo haremos de foma conjunta. Muy pronto comprenderéis el motivo. Las estructuras son:

While – Wend

Do – While – Loop

Do – Until – Loop

Todas ellas son estructuras pensadas para realizar iteraciones hasta que se cumpla una condición; esa es su principal característica, la condición será cualquiera:

  • encontrar una celda vacia (IsEmpty(ActiveCell)
  • que se cumpla una condición (ActiveCell.value = «ENTORNO»)
  • o cualquier otra

Los bucles while, correran mientras se cumplan la condicion, mientras que los until lo haran hasta que se cumpla la condición.

Con esta nuevas herramientas, vamos a ver como conseguiríamos encontrar un dato dentro de una hoja; aquí está la macro:

 
    Dim x As String
      Dim found As Boolean
      Range("A2").Select ' indica la primera linea
      x = "test"    'indica la variable a buscar
      found = False 'inicializa la respuesta a false
      ' buscara hasta que se encuentre una celda en blanco
      Do Until IsEmpty(ActiveCell) Or found
        ' Comprueba si la celda contiene el valor buscado
         If ActiveCell.Value = x Then
            found = True
         Else   'si no encontrado, avanza celda y continua
            ActiveCell.Offset(1, 0).Select
        End If
      Loop
   ' Check for found.
      If found Then
         MsgBox "El valor se encuentra en " & ActiveCell.Address
      Else
         MsgBox "El valor no existe"
      End If

Como podéis ver, el bucle se inicia con la instrucción

Do Until IsEmpty(ActiveCell) Or found

o sea que realizará todas las instrucciones que hay hasta el loop mientras no se cumpla una de las dos condiciones que le hemos puesto.

Cuando el bucle termina, a continuación de la instrucción Loop, hacemos una comparación para averiguar si hemos salido porque hemos encontrado el texto, o porque hemos llegado al final de la lista

Esta pequeña macro, la podemos mejorar, y hacer que nos sirva para utilizarla en más sitios; para ello, empezaremos por hablar de lo que es una función. Hasta ahora, para escribir una macro, hemos estado utilizando la palabra Sub, que corresponde a Subrutina. Una subrutina,puede ser llamada desde cualquier sitio, pero no puede devolver parámetros a la orden que la llama, por el contrario, una función puede devolver un valor a quien la utiliza, además, en las macros no hemos estado utilizando parámetros, pero para ésta función, los necesitamos. Los parámetros son datos que se pasan a la función en la instrucción que los llama, vamos a ver como queda nuestra subrutina convertida en función.

Function buscar(x As String) As Boolean
      Dim found As Boolean
      found = False 'inicializa la respuesta a false
      ' buscara hasta que se encuentre una celda en blanco
      Do Until IsEmpty(ActiveCell) Or found
        ' Comprueba si la celda contiene el valor buscado
         If ActiveCell.Value = x Then
            found = True
         Else   'si no encontrado, avanza celda y continua
            ActiveCell.Offset(1, 0).Select
        End If
      Loop
      buscar = found
End Function

Veamos las diferencias:

En la primera linea escribimos

Function buscar(x As String) As Boolean

Declaramos una función en ves de una Subrutina, que se llama buscar, y que espera un parámetro de tipo string que dentro de la función tendrá como nombre x. Por ultimo, le indicamos que devolverá un valor Booleano (Verdadero/Falso)

Retiramos de dentro de la función las linea

Dim x As String

porque la definición la estamos haciendo al definir el parámetro buscar(x As String).

También retiramos las lineas que nos seleccionaban el área de trabajo, y el valor de x; la primera, porque esperamos que la selección la hagan fuera, y la segunda, porque el valor de x nos lo pasaran por parámetro.

Por último, como nuestra función debe retornar Verdadero o Falso, retiramos las lineas que generan los mensajes, y nos limitamos a igualar el nombre de la función a la variable que contiene el resultado de la búsqueda:

buscar = found

Esto hará que la función devuelva el resultado encontrado.

Vamos a ver ahora como utilizaríamos esta función:

Sub trabajo()
    Range("A1:A20").Select
    If buscar("test") Then
        MsgBox "El valor se encuentra en " & ActiveCell.Address
    Else
        MsgBox "El valor no existe"
    End If
End Sub

Esta vez hemos definido una macro (trabajo) que lo que hace es seleccionar un rango, y llamar a la función buscar con la string a buscar (test).

La llamada la hace dentro de la condición de un if porque la función devuelve un valor booleano y el if lo utilizará para lanzar el mensaje de verdadero o falso.

 

 

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.