La necesidad de una instrucción de bifurcación en el código.
En un procedimiento, el código o la aplicación en la que se ejecuta el código puede encontrar problemas inesperados o no funcionar como espera. Para estar seguros, podemos transferir el control del programa a una línea específica, omitiendo el bloque de código propenso a errores.
Este tipo de bifurcación nos ayuda a omitir cada bloque de código o incluso rehacer un bloque de código de una línea anterior si la acción esperada no se ha llevado a cabo y es necesario repetir los pasos del programa.
La declaración de ramificación Goto
Ir es una declaración de bifurcación popular disponible para su uso en la mayoría de los lenguajes de programación. En VBA, podemos usar esta instrucción para mover el control del programa a cualquier línea (hacia adelante o hacia atrás) dentro del mismo sub procedimiento.
Sintaxis de la instrucción goto
Goto <line>
El parámetro line
puede ser una etiqueta o un número de línea
Una etiqueta es cualquier palabra con dos puntos para una línea de código. Cuando se usa una etiqueta en la instrucción Goto, el control se transfiere a la línea que comienza con esa etiqueta.
Programas de muestra
Validar la edad para ver si es realista
Este es un programa de muestra que válida la edad. Si la edad no es realista, el control se transfiere a la línea etiquetada como «Line_no1».
Sub Goto_demo() Dim age Line_no1: age = InputBox("Enter your age") If age > 110 Then MsgBox "It is impossible. Try again" Goto Line_no1 End If 'Rest of the code can go here End Sub
Visualización de error con Ir a etiqueta
Sub Goto_demo1() ' handling error at any line in the code using this label On Error Goto I_handle_error ' declare variables Dim a, b ' initialize variables a = "Hello World" b = Split(a, " ") ' Try to display a value out of the array's upperbound MsgBox b(2) ' label and content I_handle_error: Debug.Print "There is an error " & Err.Number & vbCrLf & Err.Description End Sub
La salida está disponible en la siguiente captura de pantalla. Como puede ver, se detecta el error «Subíndice fuera del alcance».
Vaya a usar 0 en lugar del número de línea real o una etiqueta
Ir a 0 habilita el proceso de depuración normal.
Quizás se pregunte qué diferencia hace esta declaración y por qué es incluso útil.
Imagine un escenario en el que se usa «On Error Resume Next» al comienzo del programa para omitir errores conocidos que deben ignorarse. Pero después de los 100 mi línea de código, sospechamos que hay algunos errores que deben rastrearse.
Entonces, en este caso, podemos poner esta declaración «Si el error va a 0» antes de ese 100. Utilizar mi regla a la normal manejo de errores y para evitar que el compilador ignore los próximos errores.
Esta declaración esencialmente deshabilita o revierte el efecto de «on error resume next».
Otro ejemplo con Goto 0
Como en el ejemplo anterior, primero usamos «Reanudar siguiente en caso de error» para ignorar los errores. El programa ignora todos los errores hasta que encuentra la instrucción «On Error Goto 0». Después de esta línea, los errores se muestran en tiempo de ejecución como de costumbre.
Sub Goto_demo2() ' skip the normal error handling process On Error Resume Next ' declare variables Dim a, b ' initialize variables a = "Hello World" b = Split(a, " ") ' Try to display a value out of the array's upperbound - error will be skipped Debug.Print b(2) ' Display a proper value Debug.Print b(0) ' enable the normal error handling On Error Goto 0 ' Try running the below error prone code. Debug.Print b(10) End Sub
Instrucción Goto que vuelve a ejecutar un bloque de código
Sub chk_weight() ' declare variables Dim allwed_wt, current_wt, flag ' assign values in kg allwed_wt = 10 flag = 0 'set a label to start again if weight is not within limits ' CInt is used to convert the string to a number checkagain: current_wt = CInt(InputBox(" Please enter the weight of your baggage")) ' check if the weight is within limits ' display appropriate message to the passenger If current_wt <= allwed_wt Then MsgBox "The weight of your baggage is within the permitted limit. No further action is required." Else MsgBox "The weight of your baggage is more than the permitted limit. Please remove some baggage now as the current weight will be asked again." 'Goto the block of code that gets input and validates the weight of baggage Goto checkagain End If End Sub
Ir a la instrucción con un número de línea
Dado el ejemplo anterior, la etiqueta «Verificar de nuevo» se puede reemplazar con el número de línea respectivo 89, como se muestra en la imagen a continuación. Sin embargo, a medida que continuamos manteniendo el código agregando y eliminando líneas de código en nuestros módulos o procedimientos, los números de línea pueden cambiar.
Por eso, no es una buena práctica usar números de línea en sus instrucciones Goto Siempre es recomendable crear y utilizar etiquetas en su lugar.
Conclusión
Goto es una declaración de rama muy popular que se usa en muchos lenguajes de programación junto con condiciones. Usada sabiamente, esta declaración puede ayudarlo a ahorrar tiempo, evitar errores innecesarios, capturar o depurar errores desconocidos y mantener su código organizado.