En esta lección quiero enseñarte a utilizar la función Goto de VBA, ya que te servirá para realizar saltos de programa en función de las condiciones del mismo.
En VBA, la función Goto significa, “ve hasta”. Con este comando vamos a dar un salto desde la línea de programa donde nos encontremos hasta donde pongamos la meta.
Su sintaxis es la siguiente:
Goto meta
(código que no se va a ejecutar)
meta:
Como ves, hemos saltado una parte del código que no se va a ejecutar. Normalmente lo utilizaremos cuando se cumpla una determinada condición, bien para salir de un bucle, bien para irnos a una determinada parte del programa.
A continuación, te dejo los enlaces a los temas donde explico el uso de condicionales IF y bucles FOR, por si te interesan.
Vamos a ver un par de ejemplos prácticos sobre cómo utilizar la función Goto en VBA. Uno sencillo y otro un poquito más elaborado.
En primer lugar, crea un nuevo libro, abre el editor VBA e inserta 3 módulos. Después, copia en ellos las siguientes macros.
Macro 1. Colorear un solo nombre usando la función GoTo.
'Macro que colorea de rojo el primer nombre "Jose" que encuentra en la columna C de arriba hacia abajo
Range("C4:C18").Font.ColorIndex = 1
'Comenzamos un bucle desde 4 hasta 18
For i = 4 To 18
'Si el valor de la celda es igual a "Jose" entonces
If Cells(i, "C").Value = "Jose" Then
'Colorea el texto de la celda en rojo
Cells(i, "C").Font.ColorIndex = 3
'Saltamos fuera del bucle hasta la meta
GoTo meta
End If
Next
meta:
End Sub
Macro 2. Colorear todos los nombres sin usar la función GoTo.
'Macro que colorea de rojo TODOS los nombres "Jose" que encuentra en columna C de arriba hacia abajo
Range("C4:C18").Font.ColorIndex = 1
'Comenzamos un bucle desde 4 hasta 18
For i = 4 To 18
'Si el valor de la celda es igual a "Jose" entonces
If Cells(i, "C").Value = "Jose" Then
'Colorea el texto de la celda en rojo
Cells(i, "C").Font.ColorIndex = 3
'El siguiente comando no se ejecuta, luego NO saltamos fuera del bucle hasta la meta
'GoTo meta
End If
Next
'meta:
End Sub
Macro 3. Rellenar una celda en función de otras.
'Macro que rellena la profesión I4 en función de los valores introducidos en G4 y H4
'Comenzamos un bucle desde 4 hasta 18
For i = 4 To 18
'Si el valor de las celdas G4 y H4 coincide con algún valor de la tabla entonces
If Cells(4, "G").Value = Cells(i, "C").Value And Cells(4, "H").Value = Cells(i, "D") Then
'Asigna la profesión de ese usuario a la celda I4
Cells(4, "I").Value = Cells(i, "E").Value
'Salta a meta
GoTo meta
End If
Next
'Este mensaje se muestra si no hemos saltado a meta porque no se ha cumplido la condición, es decir, no se ha encontrado el usuario
MsgBox "No existe usuario"
meta:
End Sub
Rellena la hoja de cálculo como se muestra en la figura. También, tendrás que crear 3 botones y asignarles las macros anteriores.
Como resultado, la primera de las macros, va a buscar en la columna nombre (de arriba hacia abajo) la primera palabra “José” y la va a marcar en color rojo. A continuación, vamos a destripar el código comando a comando.
En primer lugar, como a lo mejor hemos ejecutado alguna macro antes de tiempo, colorea de negro los nombres de la columna C.
Ahora comenzamos el bucle desde i = 4 hasta 18.
For i = 4 To 18
Primera iteración (i = 4). Comprobamos si la celda C4 contiene la palabra “Jose” y, como no es así, sumamos una unidad a i.
If Cells(4, "C").Value = "Jose" Then
Segunda iteración (i = 5). Comprobamos si la celda C5 contiene la palabra “Jose” y, como no es así, sumamos una unidad a i.
If Cells(5, "C").Value = "Jose" Then
…
Quinta iteración (i = 8). Comprobamos si la celda C8 contiene la palabra “Jose”. ¡Afirmativo!
If Cells(8, "C").Value = "Jose" Then
Por lo tanto, coloreamos de rojo el texto de la celda C8 y saltamos con la función Goto de VBA hasta meta, luego salimos del bucle (date cuenta de que la etiqueta meta: está fuera del bucle, es decir, por debajo del comando next).
Cells(8, "C").Font.ColorIndex = 3
'Saltamos fuera del bucle hasta la meta
GoTo meta
End If
Next
meta:
End Sub
Así, el resultado será:
La segunda macro es muy parecida a la primera, pero en este caso hemos omitido el comando goto en el código VBA (realmente no lo hemos quitado, le hemos puesto la comilla delante y el compilador interpreta que no hay que ejecutarlo). Con esto, lo que pasará es que se van a colorear de rojo todas las palabras “Jose” de la columna C.
A continuación, la destripamos.
Como en la macro anterior, coloreamos de negro los nombres de la columna C.
Comenzamos el bucle desde i = 4 hasta 18.
For i = 4 To 18
Primera iteración (i = 4). Comprobamos si la celda C4 contiene la palabra “Jose” y, como no es así, sumamos una unidad a i.
If Cells(4, "C").Value = "Jose" Then
Segunda iteración (i = 5). Comprobamos si la celda C5 contiene la palabra “Jose” y, como no es así, sumamos una unidad a i.
If Cells(5, "C").Value = "Jose" Then
…
Quinta iteración (i = 8). Comprobamos si la celda C8 contiene la palabra “Jose”. ¡Afirmativo!
If Cells(8, "C").Value = "Jose" Then
Por lo tanto, coloreamos de rojo el texto de la celda C8 y sumamos una unidad a i.
Cells(8, "C").Font.ColorIndex = 3
Sexta iteración (i = 9). Comprobamos si la celda C9 contiene la palabra “Jose” y, como no es así, sumamos una unidad a i.
If Cells(9, "C").Value = "Jose" Then
…
Decimotercera iteración (i = 16). Comprobamos si la celda C16 contiene la palabra “Jose”. ¡Afirmativo!
If Cells(16, "C").Value = "Jose" Then
Por lo tanto, coloreamos de rojo el texto de la celda C16 y sumamos una unidad a i.
Cells(16, "C").Font.ColorIndex = 3
Decimocuarta iteración (i = 17). Comprobamos si la celda C17 contiene la palabra “Jose” y, como no es así, sumamos una unidad a i.
If Cells(17, "C").Value = "Jose" Then
Decimoquinta iteración (i = 18). Comprobamos si la celda C18 contiene la palabra “Jose” y, como no es así, sumamos una unidad a i. Como i = 19 se termina el bucle y la macro.
If Cells(18, "C").Value = "Jose" Then
Hemos obtenido el siguiente resultado:
Por último, la tercera macro va a rellenar la celda I4 con la profesión de la persona que contienen las celdas G4 y H4, y con el comando Goto de VBA saltaremos al final de la misma. En caso de no existir, no saltaremos y aparecerá un msgbox indicándonoslo.
A continuación, analizamos la macro.
Comenzamos el bucle desde i = 4 hasta 18.
For i = 4 To 18
Primera iteración (i = 4). Comprobamos si las celdas C4 y D4 coinciden con el usuario introducido en las celdas G4 y H4 (Adela Salazar en el ejemplo) y, como no es así, sumamos una unidad a i.
If Cells(4, "G").Value = Cells(4, "C").Value And Cells(4, "H").Value = Cells(4, "D") Then
…
Séptima iteración (i = 10). Comprobamos si las celdas C10 y D10 coinciden con el usuario introducido en las celdas G4 y H4 (Adela Salazar en el ejemplo). ¡Afirmativo!
If Cells(4, "G").Value = Cells(10, "C").Value And Cells(4, "H").Value = Cells(10, "D") Then
Por lo tanto, copiamos el valor de la celda C10 en la celda I4, saltamos hasta meta y salimos del bucle (date cuenta de que la etiqueta meta: está fuera del bucle, es decir, por debajo del comando next).
Cells(4, "I").Value = Cells(10, "E").Value
'Salta a meta
GoTo meta
End If
Next
'Este mensaje se muestra si no hemos saltado a meta porque no se ha cumplido la condición, es decir, no se ha encontrado el usuario
MsgBox "No existe usuario"
meta:
End Sub
En la primera figura se han rellenado las celdas G4 y H4 con un usuario de la tabla. En la segunda aparece el resultado al ejecutar la tercera macro.
Si introducimos ahora un usuario que no existe, va a correr el bucle FOR al completo, y como no va a encontrar resultado, saldrá del bucle y ejecutará el comando msgbox, mostrándonos el aviso “No existe usuario”.
Con esto llegamos al final de la decimoctava lección, en la que has aprendido a utilizar la función Goto en VBA.
Por último, quiero invitarte a compartir tus dudas en los comentarios o en el foro. Intentaré ayudarte en todo lo que pueda, y así aprenderemos todos.
Nos vemos en el próximo capítulo.
Si te ha servido y quieres donar
Descarga el archivo del ejemplo
« L17. Comando AdvancedFilter Unique.
L19. Identificar máximo/mínimo de un rango con macros. »
0 comentarios