Cuando esté desarrollando una macro para que otros la utilicen, es posible que desee agregar un método para que el usuario salga de la macro antes de que finalice y aún así mantenga el control de lo que hace la macro. Ctrl + Break detendrá una macro, pero no se cierra correctamente, ya que permite al usuario ver el código en el Editor de VBA.

Hay varias formas de abordar este problema. La primera es crear un mensaje «¿quieres salir?» En tu macro y luego hacer que el macro muestre el mensaje periódicamente. Por ejemplo, considere el siguiente código:

Do ...



'    your code goes here

Counter = Counter + 1     If Counter Mod 25 = 0 Then         If MsgBox("Stop Macro?", vbYesNo) = vbYes Then End     End If Loop

La macroconstrucción se basa en la premisa de que tiene una serie de pasos que desea repetir una y otra vez, mediante el uso de una estructura Do …​ Loop. Cada vez que pasa por el bucle, se incrementa el valor de Contador. Cada 25 veces a lo largo del ciclo, el mensaje «¿detener macro?» Aparece el mensaje y el usuario tiene la oportunidad de salir.

Este enfoque es fácil de implementar y puede funcionar bastante bien para algunos propósitos. El mayor inconveniente de este enfoque, sin embargo, es que no permite la inmediatez: el usuario debe esperar para salir de la macro hasta que se hayan producido al menos 25 iteraciones.

Otro enfoque es «ocultar» el código VBA y aplicarle una contraseña.

Haga esto siguiendo estos pasos desde el Editor de VBA:

  1. Elija la opción Propiedades de VBAProject en el menú Herramientas. El editor muestra el cuadro de diálogo Propiedades del proyecto.

  2. Asegúrese de que se muestre la pestaña Protección. (Ver figura 1)

  3. Elija la casilla de verificación Bloquear proyecto para visualización.

  4. En el cuadro Contraseña, ingrese la contraseña que desee utilizar para proteger la macro.

  5. En el cuadro Confirmar contraseña, ingrese la misma contraseña por segunda vez.

  6. Haga clic en Aceptar.

Cierre el Editor de VBA, luego guarde el libro de trabajo. Con el proyecto de VBA protegido, el usuario aún puede hacer clic en Ctrl + Break para detener la macro, pero no podrá acceder al código del programa real. Solo podrán elegir entre los botones Continuar o Finalizar, los cuales protegen su código. Como beneficio adicional, este enfoque también impide que el usuario vea su código mediante el uso de opciones de menú, barra de herramientas o cinta.

Quizás el mejor enfoque, sin embargo, es crear un controlador de errores que esencialmente se hará cargo cada vez que el usuario presione Esc o Ctrl + Break. El controlador que se ejecuta puede preguntarle al usuario si realmente quiere salir, y luego cerrarlo correctamente si lo hace. Aquí hay un código de ejemplo que muestra cómo se hace esto:

Sub Looptest()

Application.EnableCancelKey = xlErrorHandler     On Error GoTo ErrHandler

Dim x As Long     Dim y As Long     Dim lContinue As Long

y = 100000000     For x = 1 To y Step 1     Next

Application.EnableCancelKey = xlInterrupt     Exit Sub

ErrHandler:

If Err.Number = 18 Then         lContinue = MsgBox(prompt:=Format(x / y, "0.0%") & _           " complete" & vbCrLf & _           "Do you want to Continue (YES)?" & vbCrLf & _           "Do you want to QUIT? [Click NO]", _           Buttons:=vbYesNo)

If lContinue = vbYes Then             Resume         Else             Application.EnableCancelKey = xlInterrupt             MsgBox ("Program ended at your request")

Exit Sub         End If     End If

Application.EnableCancelKey = xlInterrupt End Sub

Observe que este ejemplo usa el método EnableCancelKey, asignándole el nombre de la etiqueta a la que se debe saltar si se presiona la tecla cancelar (Esc o Ctrl + Break). En este caso, se salta a ErrHandler y se le pregunta al usuario qué hacer. Si el usuario elige salir, la macro se cierra correctamente.

Observe que lo primero que se hace después de la etiqueta ErrHandler es verificar si la propiedad Number del objeto Err es igual a 18. Si lo es, sabrá que se presionó una tecla de cancelación. Si no es así, se produjo algún otro tipo de error, y debe manejarse de la manera que sea apropiada para su macro.

_Nota: _

Si desea saber cómo usar las macros descritas en esta página (o en cualquier otra página de los sitios ExcelTips), he preparado una página especial que incluye información útil.

link: / excelribbon-ExcelTipsMacros [Haga clic aquí para abrir esa página especial en una nueva pestaña del navegador].

ExcelTips es su fuente de formación rentable en Microsoft Excel.

Este consejo (139) se aplica a Microsoft Excel 2007, 2010, 2013, 2016, 2019 y Excel en Office 365. Puede encontrar una versión de este consejo para la interfaz de menú anterior de Excel aquí:

link: / excel-Aborting_a_Macro_and_Retaining_Control [Abortando una macro y reteniendo el control].