Lección 18: Función GoTo en VBA.

goto-vba

Escrito por Administrador

8 de septiembre de 2021

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.

Sub Leccion18_1()

'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.

Sub Leccion18_2()

'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.

Sub Leccion18_3()

'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.

total-operaciones-matematicas-macros

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.

Range("C4:C18").Font.ColorIndex = 1

Ahora comenzamos el bucle desde i = 4 hasta 18.

'Comenzamos un bucle desde 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.

'Si el valor de la celda es igual a "Jose" entonces

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.

'Si el valor de la celda es igual a "Jose" entonces

If Cells(5, "C").Value = "Jose" Then                                      

Quinta iteración (i = 8). Comprobamos si la celda C8 contiene la palabra “Jose”. ¡Afirmativo!

'Si el valor de la celda es igual a "Jose" entonces

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).

'Colorea el texto de la celda en rojo

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á:

total-operaciones-matematicas-macros

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.

Range("C4:C18").Font.ColorIndex = 1

Comenzamos el bucle desde i = 4 hasta 18.

'Comenzamos un bucle desde 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.

'Si el valor de la celda es igual a "Jose" entonces

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.

'Si el valor de la celda es igual a "Jose" entonces

If Cells(5, "C").Value = "Jose" Then                                    

Quinta iteración (i = 8). Comprobamos si la celda C8 contiene la palabra “Jose”. ¡Afirmativo!

'Si el valor de la celda es igual a "Jose" entonces

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.

'Colorea el texto de la celda en rojo

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.

'Si el valor de la celda es igual a "Jose" entonces

If Cells(9, "C").Value = "Jose" Then                                     

Decimotercera iteración (i = 16). Comprobamos si la celda C16 contiene la palabra “Jose”. ¡Afirmativo!

'Si el valor de la celda es igual a "Jose" entonces

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.

'Colorea el texto de la celda en rojo

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.

'Si el valor de la celda es igual a "Jose" entonces

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.

'Si el valor de la celda es igual a "Jose" entonces

If Cells(18, "C").Value = "Jose" Then       

Hemos obtenido el siguiente resultado:

total-operaciones-matematicas-macros

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.

'Comenzamos un bucle desde 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.

'Si el valor de las celdas G4 y H4 coincide con algún usuario de la tabla

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!

'Si el valor de las celdas G4 y H4 coincide con algún usuario de la tabla

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).

'Asigna la profesión de ese usuario a la celda I4

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.

total-operaciones-matematicas-macros
total-operaciones-matematicas-macros

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”.

total-operaciones-matematicas-macros

Con esto llegamos al final de la decimoctava lección, en la que has aprendido a utilizar la función Goto en VBA.

Finalmente, desear que te esté gustando el curso y pedirte que me plantees cualquier duda que te surja. También puedes proponerme macros que te interese desarrollar y las voy incluyendo en el temario, soy todo oídos. Nos vemos en el próximo capítulo.

Descarga el archivo del ejemplo

« L17. Comando AdvancedFilter Unique.

L19. Identificar máximo/mínimo de un rango con macros. »

0 comentarios

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

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

Quizá te interese,

Contacto