ENABLECANCELKEY ??

11/12/2007 - 20:29 por Orfao | Informe spam
Hola foristas!
Debo evitar que por error el usuario detenga la ejecucion de codigo
En algunos casos uso Esc para salir de ciertos controles...
Probe colocando Application.EnableCancelKey = xlDisabled al principio del
codigo luego de la instruccion Sub "mimacro"() en cada moddulo. y luego,
cuando requiera el uso del teclado lo activo con
Application.EnableCancelKey = xlInterrupt y/o al salir del macro justo antes
de End Sub.

Ese es el metodo? o deberia hacerlo de alguna otra manera. ?
Me alimento del conocimiento de todos
 

Leer las respuestas

#1 Héctor Miguel
12/12/2007 - 06:46 | Informe spam
hola, moises !

Debo evitar que por error el usuario detenga la ejecucion de codigo
En algunos casos uso Esc para salir de ciertos controles...
Probe colocando Application.EnableCancelKey = xlDisabled al principio del codigo
luego de la instruccion Sub "mimacro"() en cada moddulo. y luego, cuando requiera el uso del teclado
lo activo con Application.EnableCancelKey = xlInterrupt y/o al salir del macro justo antes de End Sub.
Ese es el metodo? o deberia hacerlo de alguna otra manera. ?



1) (teoricamente al menos) deshabilitar la propiedad .EnableCancelKey sirve para permitir (o no)
una interrupcion del usuario con macros que al ejecutarse no debieran estar interactuando con el usuario

2) si utiizas la tecla {esc} para "salir" de ciertos controles, los eventos de los controles "esperan" la interaccion del usuario
(es un caso distinto de macros en ejecucion que NO requieren la interaccion del usuario, como loops extensos o similares)

3) esiste tambien la propiedad Application.Interactive (True/False) <= consulta la ayuda en linea de vba-excel <= OJO

te paso al final del presente (hasta donde se) el como "debiera" implementarse un manejo de errores con .EnableCancelKey
y si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.

=
para evitar que se interrumpa la ejecucion del codigo estando una macro en ejecucion...
si el usuario presiona {ctrl}+{pausa} o {escape} se produce un error 18 en tiempo de ejecucion (operacion cancelada por el usuario)
y para que sea detectado por la propiedad EnableCancelKey, se debe incluir un manejo de errores en el codigo
-> revisa en la ayuda [vba] los comentarios acerca de 'cuidados especiales' en su uso

ejemplo1: usa un libro "de prueba" para este ejemplo, el libro se auto-destruye a partir del dia 2 de mayo de 2007
-> haciendo caso omiso al usuario si este llegara a pulsar {ctrl}+{break} al mostrarse el mensaje :D

Private Sub Workbook_Open()
If Date <= DateSerial(2007, 5, 1) Then Exit Sub
Application.EnableCancelKey = xlErrorHandler
On Error GoTo Ver_Error
MsgBox "Se autodestruira el archivo !!!"
Application.DisplayAlerts = False
Me.ChangeFileAccess xlReadOnly
Kill Me.FullName
Me.Close False
Ver_Error:
If Err = 18 Then Resume
End Sub

ejemplo2: lineas de codigo de uso mas "generico" (adaptable a otras eventualidades/necesidades/...)
p.e. si (solamente) quieres desaparecer el dialogo de la pregunta-confirmacion...

' ... otras lineas de tu codigo ...
On Error GoTo Ver_Error
Application.EnableCancelKey = xlErrorHandler
' ... otras lineas de tu codigo ...
Ver_Error:
If Err <> 18 Then Resume ' si el usuario intento detener el codigo... el codigo... NO le hace caso :))

ejemplo3: un formulario como "pantalla de presentacion" con la opcion de saltarla (musica/video/informacion/...)
(solo requiere de un commandbutton1 para proveer un boton de llamada al proceso de cancelacion opcional:
dado que que mientras un codigo esta en ejecucion... no hay forma de lanzar otro de manera 'quasi'-simultanea,
habria que esperar a que algun ciclo se tome un respiro para que se pueda detectar (p.e.) un click en el boton de cancelacion
ademas, para que un manejo de errores interprete un click cuya intencion sea dar un efecto de (intento de) cancelacion...
el objeto clickado debera lanzar el codigo de error 18 (un intento del usuario por cancelar un codigo en ejecucion)

en el modulo de codigo del formulario ==Private Declare Sub Retardo Lib "kernel32" Alias "Sleep" (ByVal Milisegundos As Long)
Private Sub UserForm_Activate()
If MsgBox("Deseas saltar la presentacion ?", _
vbYesNo + vbQuestion + vbDefaultButton2, _
"Presentando...") = vbYes Then Unload Me: Exit Sub
MsgBox "Para terminar la presentacion en cualquier momento:" & vbCr & _
"Pulsa {Esc} o... -> {Ctrl} + {Break}", vbInformation, "Estas ""avisado""..."
Application.EnableCancelKey = xlErrorHandler
On Error GoTo Ver_Error
Dim Sig As Byte
For Sig = 1 To 50
Retardo 250
Next
Salida:
Unload Me
Exit Sub
Ver_Error:
If Err = 18 Then _
If MsgBox("Deseas terminar con la presentacion ?", _
vbYesNo + vbQuestion, "Confirma por favor...") = vbNo Then Resume
GoTo Salida
End Sub
Private Sub CommandButton1_Click()
Err.Raise 18
End Sub

Preguntas similares