Contenido
En VBA (Visual Basic for Applications), las instrucciones On…GoSub y On…GoTo se utilizan para desviar la ejecución del programa a diferentes líneas de código basándose en el valor de una expresión numérica. Sin embargo, es importante mencionar que estas instrucciones son consideradas obsoletas y resabios de versiones más antiguas de Basic. A pesar de ello, aquí te explico cómo funcionan:
On…GoSub
La instrucción On…GoSub es similar a GoSub, pero te permite elegir entre varios destinos (subrutinas) basándose en el valor de una expresión. Después de ejecutar la subrutina especificada, el control regresa a la línea siguiente a la llamada On…GoSub tras el Return.
Sub EjemploOnGoSub()
Dim Index As Integer
Index = 2 ' Supongamos que esta es alguna condición o expresión evaluada
On Index GoSub Line1, Line2, Line3
' ... código ...
Exit Sub
Line1:
' ... código para la etiqueta 1 ...
Return
Line2:
' ... código para la etiqueta 2 ...
Return
Line3:
' ... código para la etiqueta 3 ...
Return
End Sub
En este código, si Index es 2, la ejecución irá a la etiqueta Line2.
On…GoTo
La instrucción On…GoTo es similar a GoTo, pero te permite elegir entre varios destinos basándose en el valor de una expresión. A diferencia de GoSub, GoTo no regresa automáticamente, y generalmente se usa para saltar a diferentes partes de un procedimiento.
Sub EjemploOnGoto()
Dim Index As Integer
Index = 1 ' Supongamos que esta es alguna condición o expresión evaluada
On Index GoTo Label1, Label2, Label3
' ... código que podría no ejecutarse si el GoTo se activa...
Exit Sub
Label1:
' ... código para la etiqueta 1 ...
Exit Sub
Label2:
' ... código para la etiqueta 2 ...
Exit Sub
Label3:
' ... código para la etiqueta 3 ...
Exit Sub
End Sub
En este caso, si Index es 1, la ejecución irá a Label1.
Nota
Es altamente recomendable evitar el uso de GoTo y GoSub en programación moderna porque puede hacer que el código sea más difícil de leer, mantener y depurar (es mejor optar por estructuras de control más claras como If…Then…Else y bucles, y usar llamadas a subrutinas o funciones cuando sea apropiado). En caso de que se esté trabajando con código existente que utilice estas estructuras, entonces es importante entender su funcionamiento tal como se ha descrito.
Consejo práctico
Para los desarrolladores de VBA actuales, se prefiere adoptar la estrategia de modularización del código mediante la definición de procedimientos Sub o funciones Function y controlar el flujo del programa utilizando estructuras de control condicional (If…Then…Else, Select Case) y bucles (Do…Loop, For…Next), y se evita el uso de GoTo y GoSub.
Por ejemplo, en lugar de utilizar On…GoTo o On…GoSub, podrías hacer algo así:
Sub EjemploEstructurado()
Dim Index As Integer
Index = 2 ' Supongamos que esta es alguna condición o expresión evaluada
Select Case Index
Case 1
Call Procedimiento1
Case 2
Call Procedimiento2
Case 3
Call Procedimiento3
End Select
End Sub
Sub Procedimiento1()
' ... código para el procedimiento 1 ...
End Sub
Sub Procedimiento2()
' ... código para el procedimiento 2 ...
End Sub
Sub Procedimiento3()
' ... código para el procedimiento 3 ...
End Sub
Esta estructura es mucho más fácil de leer y mantener que las construcciones On…GoSub y On…GoTo.