El peligro de END es que en la mayoría de los programas estamos llamando a varias rutinas y funciones. Programación de buena estructura usa el principal de "encapsulation" (¿encapsular?).
(Pequeño ejemplo.) Un esquéleto se vería:
- rutina principal
- subrutina1
- subrutina2
- función1
- función2
- sub-subrutina3
- sub-subrutina4
- subrutina5
- subrutina6
Suponemos que decidimos poner un END en función3, cualquiera limpieza que sub-subrutina 3, subrutina2 y la rutina principal tienen que hacer ya no va a ejecutar porque END se paró todo.
Un ejemplo: haga un UserForm bien sencilla, dos controls tipo TextBox y dos botones.
En el módulo de código para el formulario:
<font face=Courier New><SPAN style="color:#00007F">Option</SPAN> <SPAN style="color:#00007F">Explicit</SPAN><br><br><SPAN style="color:#00007F">Private</SPAN> <SPAN style="color:#00007F">Sub</SPAN> CommandButton1_Click()<br> Me.Hide<br><SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">Sub</SPAN><br><br><SPAN style="color:#00007F">Private</SPAN> <SPAN style="color:#00007F">Sub</SPAN> CommandButton2_Click()<br> MsgBox "voy a terminar", vbCritical, "¡ALTO!"<br> <SPAN style="color:#00007F">End</SPAN><br><SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">Sub</SPAN><br><br><SPAN style="color:#00007F">Private</SPAN> <SPAN style="color:#00007F">Sub</SPAN> UserForm_Terminate()<br> MsgBox "limpieza del formulario", vbInformation, "Userform"<br><SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">Sub</SPAN></FONT>
Y en un módulo normal:
<font face=Courier New><SPAN style="color:#00007F">Option</SPAN> <SPAN style="color:#00007F">Explicit</SPAN><br><br><SPAN style="color:#00007F">Sub</SPAN> RutinaMadre()<br> MsgBox "actividad de manipular datos", vbInformation, "Principal"<br> SubProc1<br> MsgBox "actividad de limpieza", vbInformation, "Principal"<br><SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">Sub</SPAN><br><br><SPAN style="color:#00007F">Private</SPAN> <SPAN style="color:#00007F">Sub</SPAN> SubProc1()<br> MsgBox "actividad de manipular datos", vbInformation, "Sub 1"<br> SubProc2<br> MsgBox "actividad de limpieza", vbInformation, "<SPAN style="color:#00007F">Sub</SPAN> 1"<br><SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">Sub</SPAN><br><br><SPAN style="color:#00007F">Private</SPAN> Sub SubProc2()<br> <SPAN style="color:#00007F">Dim</SPAN> ufNuevo <SPAN style="color:#00007F">As</SPAN> UserForm1<br> MsgBox "actividad de manipular datos", vbInformation, "Sub 2"<br> <SPAN style="color:#00007F">Set</SPAN> ufNuevo = <SPAN style="color:#00007F">New</SPAN> UserForm1<br> ufNuevo.Show<br> MsgBox ufNuevo.TextBox1.Text, vbInformation, "Textbox 1"<br> <br> MsgBox ufNuevo.TextBox2.Text, vbInformation, "Textbox 2"<br> <br> Unload ufNuevo<br> MsgBox "actividad de limpieza", vbInformation, "<SPAN style="color:#00007F">Sub</SPAN> 2"<br> <br><SPAN style="color:#00007F">End</SPAN> Sub<br></FONT>
Ahora compare el comportamiento con seleccionar botón 1 y botón 2. Con END ninguna de las limpiezas corre.