Excel.Macros: Otros bucles

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.

 

 

Acerca de Miguel Garcia

Programador, Desarrollador web, Formador en distintas areas de informatica y director de equipos multidisciplinares.
Esta entrada fue publicada en Excel, Formacion y etiquetada , , . Guarda el enlace permanente.

Deja un comentario

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