Archive

Posts Tagged ‘Manejo de errores’

Controlar comportamiento de la tecla ESC (Cancelar) con EnableCancelKey en Excel

December 9, 2011 Leave a comment

Complementando mi Lista incompleta de tips para programar macros en Excel, añado un procedimiento llamado EnableCancelKey dependiente del objeto Application, el cual nos permite controlar el comportamiento de la tecla Cancelar en nuestras macros.

Cancelar macro usando ESC con mensaje personalizado

Si lo que deseamos es que cuando nuestra macro dure demasiado, el usuario tenga la opción de Cancelar la acción, pero con la salvedad de que podemos personalizar un mensaje de aviso que sustituya al clásico error de vba cuando cancelamos una macro.

Código

Sub EnableCancelKey1()
    Dim i As Double
    'Cuando se genere un error nos mandará a la etiqueta ManejoError
    On Error GoTo ManejoError
    Application.EnableCancelKey = xlErrorHandler
    'Damos la opción al usuario de poder cancelar la acción de la macro
    MsgBox "El siguiente código puede tomar mucho tiempo: " & _
           "presionar ESC para cancelar", vbInformation, "EXCELeINFO"
    For i = 1 To 100000
        ActiveSheet.Range("A" & i).Value = i
    Next i
    '
ManejoError:
    If Err = 18 Then
        MsgBox "La acción se ha cancelado", vbExclamation, "EXCELeINFO"
    End If
End Sub

Evitar el uso de la tecla ESC

Existe también la opción de que impidamos que el usuario haga uso de la tecla ESC para cancelar la macro, pero tal acción debe programarse con cuidado, ya que si se corre una macro con un ciclo infinito, no se podrá cancelar la macro.

Código

Sub EnableCancelKey2()
    Dim i As Double
    'Deshabilitamos el uso de la tecla ESC
    Application.EnableCancelKey = xlDisabled
    MsgBox "La siguiente macro no podrá cancelarse", vbInformation, "EXCELeINFO"
    For i = 1 To 100000
        ActiveSheet.Range("A" & i).Value = i
        Application.StatusBar = Range("A" & i).Value
    Next i
    Application.StatusBar = False
End Sub

No ejecutar macro cuando no hay archivos abiertos en Excel

November 19, 2010 Leave a comment

Twittear este post Compartir en Facebook

Una de las claves para una buena macro, es el manejo de errores, aunque este tema no se limita solamente a las macros, sino a la programación en general. Cuántas veces no utilizamos aplicaciones donde vemos que sucede un error y la aplicación, en lugar de mandarnos un aviso con el error específico, simplemente se cierra. Esto es molesto.

Para el tema de las macros, sino hacemos estructuras correctas de manejo de errores, Excel no se cierra, pero sí la aplicación nos manda un error propio de Visual Basic para operaciones, pero regularmente la explicación del error es en lenguaje técnico, no apto para todos los usuarios finales de la macro.

Un caso muy marcado es cuando abrimos Excel, pero cerramos todos los archivos. Si tenemos complementos (add-ins) instalados que crean menúes para manejar sus macros, no todos se deshabilitan cuando no hay ningún archivo abierto, entonces cuando elegimos alguna opción de ese menú, nos manda un error de vba.

clip_image002

Este error regularmente ocurre cuando en nuestro código se asignó una variable con Set con se utilizó un objeto con With.

clip_image002[4]

Este error ocurre cuando en nuestro código se intenta manipular un rango.

Lo ideal sería que Excel enviara un mensaje con un texto similar a “No hay ningún archivo abierto”. Para realizarlo, debemos ingresar un bloque de código dentro de nuestra macro que cuente el número de archivos abiertos y si encuentra 1 o menos de 1, lance el error. Decimos que cuente por menos 1, por que el archivo PERSONAL.xls, regularmente está oculto, pero aún así se cuenta como archivo abierto.

Ejemplo de macro:

Sub Macro_ejemplo()
If Application.Workbooks.Count <= 1 Then
GoTo fin
Else
'Con fin de ejemplificar, se manda un mensaje informativo
MsgBox "Hay por lo menos un archivo abierto", vbInformation, "EXCELeINFO"
'Aquí se podrán las instrucciones necesarias para la macro
End If
Exit Sub
fin:
MsgBox "No hay ningún archivo abierto", vbExclamation, "EXCELeINFO"
End Sub

Nota: esta macro será funcional cuando se hagan add-ins propios que sean manipulables mediante un menú.

Categories: Excel, vba Tags: , ,