Interceptación de errores con Visual Basic para Aplicaciones

Seleccione idioma Seleccione idioma
Id. de artículo: 146864 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

Cuando se produce un error en tiempo de ejecución en una macro de Microsoft Visual Basic para Aplicaciones, aparece un mensaje de error en la pantalla y la macro se detiene o se comporta de forma imprevisible.

Para evitar que la aplicación se bloquee o se comporte de forma imprevisible, puede incluir código de macro que intercepte el error e indique a la macro cómo debe controlarlo. El proceso de interceptar y controlar un error en tiempo de ejecución se denomina "interceptación de errores". El conjunto de instrucciones que indica a la aplicación cómo controlar el error se denomina "rutina de control de errores" o "controlador de errores".

Más información

Microsoft proporciona ejemplos de programación con fines ilustrativos únicamente, sin ninguna garantía, ya sea expresa o implícita. Esto incluye, entre otras, las garantías implícitas de comerciabilidad e idoneidad para un fin determinado. En este artículo se da por supuesto que ya conoce el lenguaje de programación que se muestra, así como las herramientas empleadas para crear y depurar procedimientos. Los ingenieros de soporte técnico de Microsoft pueden explicarle la funcionalidad de un determinado procedimiento, pero no modificarán estos ejemplos para ofrecer mayor funcionalidad ni crearán procedimientos adaptados a sus necesidades específicas. Mientras el código de Visual Basic se está ejecutando, puede encontrar varios tipos de errores que se pueden interceptar. Puede aprovechar la interceptación de errores de Microsoft Excel si utiliza las funciones e instrucciones siguientes.

Instrucción On Error

La instrucción On Error hace que Visual Basic para Aplicaciones empiece o deje de interceptar errores. La instrucción On Error también especifica un conjunto de instrucciones que se ejecutarán si se encuentra un error.

Para obtener información adicional al respecto, consulte los artículos siguientes en Microsoft Knowledge Base:
141571 Cómo usar la instrucción "On Error" para manejar errores en una macro

Función Err

La función Err devuelve el número del error encontrado.

Ejemplo de uso de la función Err:
   Msgbox "El número de error más reciente es " & Err & _ ". El texto del mensaje es: " & Error(Err)
				
La tabla siguiente contiene una lista de los códigos de error interceptables que puede encontrarse al utilizar la función Err.
   Código de error   Mensaje de error ----------   ------------- 3            Return sin GoSub 5            Llamada al procedimiento no válida 6            Desbordamiento 7            Memoria insuficiente 9            Subíndice fuera de rango 10           Definición duplicada (versiones 5.0 y 7.0) 10           Esta matriz es fija o se encuentra temporalmente bloqueada (versión 97) 11           División por cero 13           No coinciden los tipos 14           Espacio para cadenas insuficiente 16           Fórmula de cadena demasiado compleja (versiones 5.0 y 7.0) 16           Expresión demasiado compleja (versión 97) 17           No se puede realizar la operación solicitada 18           Se produjo una interrupción por parte del usuario 20           Resume sin Error 28           Espacio de pila insuficiente 35           Sub o Function no definida (versiones 5.0 y 7.0) 35           Sub, Function o Property no definida (versión 97) 47           Demasiados clientes de aplicación DLL (versión 97) 48           Error al cargar la biblioteca DLL 49           Convención de llamada a archivo DLL no válida 51           Error interno 52           Nombre o número de archivo incorrecto 53           Archivo no encontrado 54           Modo de archivo incorrecto 55           El archivo ya está abierto 57           Error de E/S del dispositivo 58           El archivo ya existe 59           Longitud de registro incorrecta 61           Disco lleno 62           La entrada superó el final de línea 63           Número de registro incorrecto 67           Demasiados archivos 68           Dispositivo no disponible 70           Permiso denegado 71           Disco no preparado 74           No se puede cambiar el nombre con una unidad de disco diferente 75           Error de acceso a la ruta o al archivo 76           No se encuentra la ruta de acceso 91           Variable de objeto no establecida (versiones 5.0 y 7.0) 91           Variable de objeto o de bloque With no establecida (versión 97) 92           Bucle For no inicializado 93           Cadena modelo no válida 94           Uso no válido de Null 95           Error definido por el usuario (versiones 5.0 y 7.0 únicamente) 298          No se pudo cargar la DLL del sistema (versión 97) 320          No se pueden utilizar nombres de dispositivo de caracteres en los nombres de archivo especificados (versión 97) 321          Formato de archivo no válido (versión 97) 322          No se puede crear el archivo temporal necesario (versión 97) 323          No se puede cargar el módulo; formato no válido (versiones 5.0 y 7.0) 325          Formato no válido en archivo de recursos (versión 97) 327          No se encontró el valor de datos indicado (versión 97) 328          Parámetro no válido; no se pueden escribir matrices (versión 97) 335          No se pudo tener acceso al Registro del sistema (versión 97) 336          Componente ActiveX no registrado correctamente (versión 97) 337          Componente ActiveX no encontrado (versión 97) 338          El componente ActiveX no se ejecutó correctamente (versión 97) 360          Objeto ya cargado (versión 97) 361          No se puede cargar o descargar este objeto (versión 97) 363          El control ActiveX especificado no se encuentra (versión 97) 364          Se descargó el objeto (versión 97) 365          No se puede descargar dentro de este contexto (versión 97) 368          El archivo especificado está obsoleto. Este programa requiere una versión más reciente (versión 97) 371          El objeto especificado no puede utilizarse como una forma propietaria de Show (versión 97) 380          Valor de propiedad no válido (versión 97) 381          Índice de matriz de propiedad no válido (versión 97) 382          Property Set no se puede ejecutar en tiempo de ejecución (versión 97) 383          Property Set no se puede utilizar con una propiedad de sólo lectura (versión 97) 385          Se necesita un índice de matriz de propiedad (versión 97) 387          Property Set no permitido (versión 97) 393          Property Get no se puede ejecutar en tiempo de ejecución (versión 97) 394          Property Get no se puede ejecutar en una propiedad de sólo escritura (versión 97) 400          Formulario ya mostrado; no se puede mostrar de forma modal (versión 97) 402          El código debe cerrar primero el formulario modal superior (versión 97) 419          Denegado el permiso para utilizar el objeto (versión 97) 422          Propiedad no encontrada (versión 97) 423          No se encuentra la propiedad ni el método 424          Se requiere un objeto 425          Uso de objeto no válido (versión 97) 429          El componente ActiveX no puede crear un objeto o devolver una referencia a este objeto (versión 97) 430          La clase no admite Automatización OLE 430          La clase no admite Automatización (versión 97) 432          No se encontró el nombre del archivo o de la clase durante la operación de Automatización (versión 97)

   438          El objeto no admite esta propiedad o método 440          Error de Automatización 440          Error de Automatización (versión 97) 442          Se ha perdido la conexión a la biblioteca de tipos o biblioteca de objetos para el proceso remoto (versión 97) 443          El objeto de Automatización no tiene un valor predeterminado (versión 97) 445          El objeto no acepta esta acción 446          El objeto no admite argumentos con nombre 447          El objeto no admite la configuración regional actual 448          Argumento con nombre no encontrado 449          Argumento no opcional 449          Argumento no opcional o asignación de propiedad no válida (versión 97) 450          Número incorrecto de argumentos 450          El número de argumentos es erróneo o asignación de propiedad no válida (versión 97) 451          Es un objeto, no una colección 452          Número ordinal no válido 453          No se encuentra la función de biblioteca DLL especificada 454          No se encuentra el recurso del código 455          Error al bloquear el recurso de código 457          Esta clave ya está asociada con un elemento de esta colección (versión 97) 458          La variable utiliza un tipo no compatible en Visual Basic (versión 97) 459          Este componente no admite eventos (versión 97) 460          Formato de Portapapeles no válido (versión 97) 461          El formato especificado no coincide con el formato de los datos (versión 97) 480          No se puede crear imagen AutoRedraw (versión 97) 481          Imagen no válida (versión 97) 482          Error de impresora (versión 97) 483          El controlador de impresora no admite la propiedad especificada (versión 97) 484          Problema al obtener información de impresora del sistema. Asegúrese de que la impresora esté configurada correctamente (versión 97) 485          Tipo de imagen no válido (versión 97) 486          No se puede imprimir imagen del formulario en este tipo de impresora (versión 97) 735          No se puede guardar el archivo en el directorio temporal (versión 97) 744          No se encuentra el texto de la búsqueda (versión 97) 746          Los reemplazos son demasiado largos (versión 97) 1000         nombreDeClase no tiene la propiedad nombreDePropiedad (versiones 5.0 y 7.0) 1001         nombreDeClase no tiene el método nombreDeMétodo (versiones 5.0 y 7.0) 1002         Falta un argumento necesario: nombreDeArgumento (versiones 5.0 y 7.0) 1003         Número de argumentos no válido (versiones 5.0 y 7.0) 1004         Error en el método nombreDeMétodo de la clase nombreDeClase (versiones 5.0 y 7.0) 1005         No se puede asignar la propiedad nombreDePropiedad de la clase nombreDeClase (versiones 5.0 y 7.0) 1006         No se puede obtener la propiedad nombreDePropiedad de la clase nombreDeClase

                (versiones 5.0 y 7.0) 31001        Memoria insuficiente (versión 97) 31004        No hay ningún objeto (versión 97) 31018        Clase no establecida (versión 97) 31027        No se puede activar el objeto (versión 97) 31032        No se puede crear el objeto incrustado (versión 97) 31036        Error al guardar en archivo (versión 97) 31037        Error al cargar desde archivo (versión 97)
				
Para obtener información adicional al respecto, consulte el artículo siguiente en Microsoft Knowledge Base:
142138 OFF: Una explicación de errores capturables en Visual Basic para Aplicaciones

Función Error

La función Error devuelve el mensaje de error correspondiente a un número de error determinado.

Ejemplo de uso de la función Error:
   Msgbox "El texto del mensaje del error es: " & Error(Err)
				

Instrucción Error

La instrucción Error simula la aparición de un error permitiéndole asignar un número de error personalizado a la función Err. Estos valores de error definidos por el usuario son valores que usted define para sus procedimientos y que siempre se almacenan en variables del tipo de datos Variant. Un uso frecuente de este tipo de valor de error es en los procedimientos que aceptan varios argumentos y devuelven un valor. Por ejemplo, suponga que el valor devuelto sólo es válido si los argumentos quedan dentro de un cierto intervalo. Su procedimiento puede probar los argumentos que el usuario proporciona y, si los argumentos no están en el intervalo aceptable, puede hacer que el procedimiento devuelva el valor de error adecuado.

Error es un subtipo del tipo de datos Variant y cuando se utiliza el término "valor de error", normalmente significa que una variable es del tipo Variant y que contiene un valor que Visual Basic para Aplicaciones reconoce como un error definido por el usuario. Los valores de error se utilizan en un procedimiento para indicar que se han producido condiciones de error. A diferencia de los errores normales en tiempo de ejecución, estos errores no interrumpen el código porque se reconocen como variables normales y no como errores. Sus procedimientos pueden comprobar estos valores de error y realizar las acciones correctivas adecuadas.

También puede utilizar la instrucción Error para simular errores en tiempo de ejecución. Esto es especialmente útil cuando está probando aplicaciones o cuando desea tratar una condición determinada como equivalente a un error en tiempo de ejecución. Es posible simular cualquier error en tiempo de ejecución de Visual Basic para Aplicaciones proporcionando el código para el error en una instrucción Error. También puede utilizar la instrucción Error para crear sus propios errores definidos por el usuario proporcionando un código de error que no corresponda a un error en tiempo de ejecución de Visual Basic para Aplicaciones. Anteriormente en este artículo se incluye una tabla que contiene una lista de los errores integrados (bajo la sección "Función Err"). Ahora, Visual Basic para Aplicaciones no utiliza todos los números disponibles para los errores integrados. En futuras versiones de Visual Basic para Aplicaciones aumentarán los números internos a medida que se agreguen más errores integrados. Se recomienda que empiece sus números de error en 50000 y que avance hasta 65535 para evitar posibles conflictos en el futuro.

Ejemplo de uso de la instrucción Error para simular errores en tiempo de ejecución:
   Sub Test()

      On Error Resume Next Error 50000          'establecer el valor de Err en 50000

      If Err = 50000 Then MsgBox "se produjo mi propio error" End If

   End Sub
				
Cuando se ejecute la macro Test, recibirá un cuadro de mensajes que contendrá "ocurrió mi propio error" como mensaje.

Función CVErr

La función CVErr se utiliza para crear valores de error. La función CVErr toma un argumento que debe ser un entero o una variable que contenga un entero.
   NoRadius = CVErr(2010)

   NotANumber = 2020 InvalidArgument = CVErr(NotANumber)
				
Ejemplo de uso de la función CVErr:
   Public NoRadius, NotANumber

   Sub AreaOfCircle() Const PI = 3.142 NoRadius = CVErr(2010) NotANumber = CVErr(2020) Radius = CheckData(InputBox("Escriba el radio: ")) If IsError(Radius) Then Select Case Radius Case NoRadius MsgBox "Error: No se ha indicado ningún radio." Case NotANumber MsgBox "Error: El radio no es un número." Case Else MsgBox "Error desconocido." End Select Else MsgBox "El área del círculo es " & (PI * Radius ^ 2) End If End Sub

   Function CheckData(TheRadius) If Not IsNumeric(TheRadius) Then CheckData = NotANumber ElseIf TheRadius = 0 Then CheckData = NoRadius Else CheckData = TheRadius End If End Function
				

Utilizar valores de error integrados

Hay siete valores de error integrados en Microsoft Excel. En la tabla siguiente se muestra el número de error (constante), el valor de error literal y el valor de error convertido.
Número de error (Constante)   Valor de error literal     Valor de error convertido -----------------------------------------------------------------------

xlErrDiv0                   [#¡DIV/0!]               CVErr(xlErrDiv0) xlErrNA                     [#N/A]                  CVErr(xlErrNA) xlErrName                   [#¿NOMBRE?]                CVErr(xlErrName) xlErrNull                   [#¡NULO!]                CVErr(xlErrNull) xlErrNum                    [#¡NUM!]                 CVErr(xlErrNum) xlErrRef                    [#¡REF!]                 CVErr(xlErrRef) xlErrValue                  [#¡VALOR!] CVErr(xlErrValue)
				
El trabajo con estos valores de error de hoja de cálculo integrados se realiza de la misma forma que con los errores definidos por el usuario: como números convertidos en valores de error mediante la función CVErr. La única diferencia es que para los errores de hoja de cálculo, Visual Basic para Aplicaciones proporciona los números de error como constantes integradas y también proporciona valores de error literales. Estos elementos no se proporcionan para los valores de error definidos por el usuario. Los valores de error literales deben especificarse entre corchetes como se muestra en la tabla anterior.

Ejemplo de uso de valores de error integrados:
   Function Commission(SharesSold,PricePerShare) If Not (IsNumeric(SharesSold) And IsNumeric(PricePerShare)) Then Commission = CVErr(xlErrNum) Else TotalSalePrice = ShareSold * PricePerShare If TotalSalePrice <= 15000 Then Commission = 25 + 0.03 * SharesSold Else Commission = 25 + 0.03 * (0.9 * SharesSold) End If End If End Function
				

Centralizar el código de control de errores

Cuando agregue código de control de errores a sus macros de Visual Basic para Aplicaciones, descubrirá que se controlan los mismos errores una y otra vez. Puede reducir el tamaño del código y el esfuerzo necesario para escribir código si escribe algunos procedimientos a los que el código de control de errores pueda llamar para controlar las situaciones de error frecuentes.

A continuación se ofrece un ejemplo de un procedimiento de función que muestra un mensaje correspondiente al error que se ha producido y, donde sea posible, permite al usuario especificar qué acción se realizará a continuación eligiendo un botón determinado. Después devuelve el número del código al procedimiento que lo llamó.
   Public Const RESUME_STATEMENT = 0   'Resume Public Const RESUME_NEXT = 1        'Resume Next Public Const UNRECOVERABLE = 2      'Error irrecuperable Public Const UNRECOGNIZED = 3       'Error no reconocido Public Const ERR_DEVICEUNAVAILABLE = 68 Public Const ERR_BADFILENAMEORNUMBER = 52 Public Const ERR_PATHDOESNOTEXIST = 76 Public Const ERR_BADFILEMODE = 54


  Function FileErrors(errVal As Integer) As Integer Dim MsgType As Integer, Msg As String, Response As Integer MsgType = vbExalamation Select Case errVal Case ERR_DEVICEUNAVAILABLE     'Error 68 Msg = "Ese dispositivo no está disponible." MsgType = MsgType + vbAbortRetryIgnore Case BADFILENAMEORNUMBER      'Errores 64 y 52 Msg = "Ese nombre de archivo no es válido." MsgType = MsgType + vbOKCancel Case PATHDOESNOTEXIST      'Error 76 Msg = "Esa ruta de acceso no existe." MsgType = MsgType + vbOKCancel Case BADFILEMODE      'Error 54 Msg = "No se puede abrir el archivo para ese tipo de acceso." MsgType = MsgType + vbOKCancel Case Else FileErrors = UNRECOGNIZED Exit Function End Select Response = MsgBox(Msg, MsgType, "Error de disco") Select Case Response Case vbOK, vbRetry FileErrors = RESUME_STATEMENT Case vbIgnore FileErrors = RESUME_NEXT Case vbCancel, vbAbort FileErrors = UNRECOVERABLE Case Else FileErrors = UNRECOGNIZED End Select End Function
				

Controlar interrupciones por parte del usuario

Un usuario puede interrumpir un procedimiento de Visual Basic para Aplicaciones si presiona CTRL+INTER o ESC (COMANDO+PUNTO en Macintosh). Es posible deshabilitar las interrupciones para los procedimientos en las aplicaciones terminadas. Sin embargo, si no deshabilita las interrupciones por parte del usuario en el procedimiento terminado, puede asegurarse de que se notifica al procedimiento cuándo se ha producido una interrupción para que pueda cerrar los archivos, desconectarse de los recursos compartidos o restaurar las variables modificadas antes de devolver el control de la aplicación al usuario.

Puede interceptar las interrupciones por parte del usuario en sus procedimientos si establece la propiedad EnableCancelKey en xlErrorHandler. Cuando esta propiedad está establecida, todas las interrupciones generarán un error en tiempo de ejecución número 18, que se puede interceptar mediante una instrucción On Error. Puede controlar el error para detener el procedimiento y salir del programa. Si se utiliza la instrucción Resume para continuar con el procedimiento después de un error en tiempo de ejecución interceptado, se omitirá la interrupción.

También es posible omitir completamente las interrupciones por parte del usuario si se establece la propiedad EnableCancelKey en xlDisabled. En este estado, Microsoft Excel pasa por alto todos los intentos por parte del usuario para interrumpir el procedimiento en ejecución. Para restaurar el procesamiento de interrupciones predeterminado, cambie la configuración de la propiedad EnableCancelKey a xlInterrupt. Para impedir que un procedimiento deshabilite permanentemente las interrupciones por parte del usuario, Microsoft Excel restaura siempre la configuración predeterminada de la propiedad EnableCancelKey a xlInterrupt cada vez que el procedimiento finaliza su ejecución. Para garantizar que las interrupciones se controlan correctamente dentro del código, debe deshabilitar explícitamente o interceptar las interrupciones cada vez que se ejecute el procedimiento. Hay que destacar que sólo puede utilizarse un controlador de interrupciones para cada procedimiento y que se utiliza el mismo controlador para todos los errores en tiempo de ejecución encontrados por ese procedimiento.

En el ejemplo siguiente se muestra un procedimiento que necesita mucho tiempo para completarse. Si un usuario interrumpe el procedimiento, se interceptará un error. La interrupción por parte del usuario confirma primero que realmente se debe detener el procedimiento y a continuación sale del procedimiento de manera ordenada.
   Sub ProcessData() 'Configurar una captura de interrupciones por parte del usuario como un error en tiempo de ejecución On Error GoTo UserInterrupt Application.EnableCancelKey = xlErrorHandler

      'Iniciar una tarea de larga duración For x = 1 to 1000000 For y = 1 to 10 Next y Next x

      Exit Sub UserInterrupt: If Err = 18 Then If MsgBox ("¿Desea dejar de procesar registros?", vbYesNo) = vbNo Then 'Continuar con la ejecución en el punto donde se interrumpió el procedimiento Resume Else 'Controlar otros errores que se produzcan MsgBox Error(Err) End If End If End Sub
				
Si ejecuta la macro ProcessData y presiona rápidamente CTRL+INTER, aparecerá un cuadro de mensajes que le preguntará si desea dejar de procesar registros. Si hace clic en Sí, aparecerá otro cuadro de mensajes con el texto "Se produjo una interrupción por parte del usuario". Si hace clic en Aceptar en este cuadro de mensajes, la macro terminará. Si hace clic en No en el primer cuadro de mensajes, la macro continuará.

Instrucción Resume

La instrucción Resume reanuda la ejecución del código una vez que haya finalizado una rutina de control de errores.

Referencias

Excel 97

Para obtener más información acerca de cómo interceptar errores de macro, haga clic en la ficha Índice en la Ayuda de Visual Basic para Microsoft Excel 97, escriba el texto
interceptar errores
y haga doble clic en el texto seleccionado para ir al tema "Errores interceptables".

Excel 7.0

Para obtener más información acerca de cómo interceptar errores de macro, haga clic en la ficha Índice en la Ayuda de Microsoft Excel 7.0, escriba el texto
interceptar errores
y haga doble clic en el texto seleccionado para ir al tema "Interceptación de errores".

Excel 5.0

En el capítulo 9, "Control de errores y valores de error", del "Manual del usuario de Visual Basic", versión 5.0, consulte los temas siguientes:
  • "Impedir que el código se detenga o actúe de forma imprevisible"
  • "Crear valores de error que no interrumpan el código"
  • "Utilizar los valores de error integrados de Microsoft Excel"
  • "Técnicas avanzadas de control de errores"

Propiedades

Id. de artículo: 146864 - Última revisión: lunes, 19 de septiembre de 2011 - Versión: 3.0
La información de este artículo se refiere a:
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft Excel 95 Standard Edition
  • Microsoft Excel 5.0 Standard Edition
  • Microsoft Excel 5.0 para Macintosh
Palabras clave: 
kbdtacode kbhowto kbprogramming KB146864

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com