Lección 18: Función GoTo y End para macros.

Escrito por Administrador

24 de agosto de 2021

En esta lección vas a aprender cómo hacer saltos de programa en función de las condiciones del mismo. Es muy sencillo. ¡Vamos allá!

La función que os presento hoy es Goto, que 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.

La 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. Vamos a ver un par de ejemplos prácticos, uno sencillo y otro un poquito más elaborado.

Crea un nuevo libro, abre el editor VBA e inserta 3 módulos. Copia en ellos las siguientes macros.

Macro 1

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

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

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

Ahora rellena la hoja de cálculo como se muestra en la figura. Tendrás que crear 3 botones y asignarles las macros anteriores.

total-operaciones-matematicas-macros

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. No va a seguir buscando y finalizará aquí la macro. 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”. Negativo. 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”. Negativo. 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                          

Entonces, coloreamos de rojo el texto de la celda C8 y saltamos 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

                        

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

Destripamos esta macro también para que quede bien claro.

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

Entonces, 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”. Negativo. 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                                

Entonces, 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”. Negativo. 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”. Negativo. 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

La tercera macro va a rellenar la celda I4 con la profesión de la persona que contienen las celdas G4 y H4. En caso de no existir, aparecerá un msgbox indicándonoslo.

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

Entonces, copiamos el valor de la celda C10 en la celda I4 y saltamos hasta meta, luego 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 rellanado 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. Espero que te esté gustando el curso y 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