Saltar al contenido

La forma correcta de usar la instrucción Goto en VBA

vba goto 01 error output La forma correcta de usar la instrucción Goto en VBA

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

Sintaxis de la instrucción goto

Goto <line>

El parámetro line puede ser un 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 valida 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 &gt; 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 " &amp; Err.Number &amp; vbCrLf &amp; 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».

"Ocurrió un error 9 Subíndice fuera de rango"

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.

Error de tiempo de ejecución '9': primer ejemplo de subíndice fuera de rango.

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 100mi 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. utilizarmi 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.

Error de tiempo de ejecución '9': ventana emergente para subíndice fuera de rango.
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 &lt;= 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.

Una instrucción Goto con un número de línea: no haga esto.

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.