objetos ejemplos descargar excel vba msdn

excel - ejemplos - Diferencia entre ''en error goto 0'' y ''en error goto-1''-VBA



vba excel descargar (4)

Aqui hay otro más

http://www.excelfox.com/forum/f23/error-goto-1-a-894/

Muestra un poco más sobre la diferencia entre GoTo 0 y GoTo -1

¿Alguien puede encontrar la diferencia entre ''On error goto -1'' y ''on error goto 0'' en VBA? Probé con google y msdn, pero no tuve suerte.


Es importante darse cuenta de que hay dos cosas distintas que ocurren cuando ocurre un error en VBA.

  1. El objeto de error tiene sus propiedades establecidas (es decir, err.number, err.desciption, err.source, etc.)

  2. La siguiente línea para ser ejecutada cambia.
    La línea que se ejecuta está determinada por la última declaración "On Error Goto" que se ejecutó, en su caso.

Estos son temas separados pero muy relacionados y usted escribirá lo que en efecto es código distinto pero entrelazado para administrarlos.

Cuando se produce CUALQUIER error o utiliza Err.Raise, el objeto Err está SIEMPRE configurado. Incluso si se ha utilizado "On Error Resmue next" o cualquier otra declaración de error On.

Entonces un código como este SIEMPRE podría ser utilizado:

Dim i as integer On error resume next i = 100/0 '' raises error if err.number <> 0 then '' respond to the error end if

Es realmente importante darse cuenta de que cuando el objeto de error tiene un valor distinto de cero para err.number, se ha generado una excepción Y que si luego intenta ejecutar cualquier instrucción "On Error Goto" al hacerlo, se generará un error y la ejecución será pasó a cualquier código que llamó al procedimiento actual. (o cuando no se llama por ningún código, se da el diálogo de error de VBA habitual). Tenga en cuenta que en este escenario "On Error Goto ALabel1" NO cambiaría la siguiente línea para que sea la línea con Label1: en ella.

p.ej

Sub ErrorTest() Dim dblValue As Double On Error GoTo ErrHandler1 dblValue = 1 / 0 ErrHandler1: debug.print "Exception Caught" debug.print Err.Number On Error GoTo ALabel1 dblValue = 1 / 0 Exit sub ALabel1: debug.print "Again caught it." End Sub

Una vez que la propiedad err.number se establece en cero, puede restablecerla a cero utilizando

On Error Goto -1

Tenga en cuenta que Err.Clear también lo restablece a cero, pero en realidad es equivalente a:

On Error Goto -1 On Error Goto 0

es decir, Err.Clear elimina un "En error Goto" que está actualmente en su lugar. Por lo tanto, es mejor utilizar:

On Error Goto -1

como usar Err.clear, a menudo necesitarías escribir

Err.Clear On Error Goto MyErrorHandlerLabel

Vale la pena señalar que Err.Clear se ejecuta implícitamente por VBA cada vez que ejecuta cualquier tipo de instrucción de resumen, salida de salida, función de salida, propiedad de salida o cualquier instrucción de error.

También puede configurar el objeto de error en cualquier número que desee utilizar

Número Err.Raise: =, Fuente: =, Descripción: =

Err.Raise es muy importante ya que le permite propagar un error al programa de llamada Y elevar sus propios números de error conocidos como "errores definidos por el usuario" que proporcionan un medio para decirle al programa de llamada que no puede continuar por un motivo lógico. (por ejemplo, una regla comercial se rompió).

Puede controlar qué línea de código se ejecuta a continuación usando declaraciones como

En caso de error Goto ALabelName en error Goto ANonZeroLineNumber y On Error Goto 0 ''Este es un caso especial ya que en efecto dice "dentro del alcance actual (típicamente un sub o función), en caso de que ocurra un error, devuelva el objeto de error a el código que llamó al sub o función actual.

El manejo de errores en VBA es complicado, especialmente porque las páginas de MSDN realmente no dan ejemplos completos de cómo se puede utilizar el manejo de errores.


Esta respuesta aborda la confusión entre el objeto de error y el controlador de errores.

El objeto de error se puede borrar usando Err.Clear . Esto no afecta el controlador de errores.

El controlador de errores se habilita utilizando On Error Goto <label> . Se activa cuando se produce un error.

Mientras el controlador de errores está activo , no puede asignar un nuevo controlador de errores. On Error Goto <label> no tendrá ningún efecto. VBA simplemente ignora el intento de asignar un nuevo controlador de errores.

El uso de Err.Clear no cancela el controlador de errores.

Saltar a un lugar diferente en el código usando Goto <label> no cancela el controlador de errores. Usar Goto <label> en un bloque de manejo de errores puede causar confusión y debe evitarse. Puede pensar que el controlador de errores ya no está activo cuando de hecho todavía está activo.

El efecto de un controlador de errores activo es que no puede asignar un nuevo controlador de errores. On Error Goto <label> no tendrá ningún efecto. VBA simplemente ignora el intento de asignar un nuevo controlador de errores. Cualquier error adicional no se controlará mientras el controlador de errores esté activo.

La única forma de salir de un controlador de error activo es:

  1. Resume
  2. Resume Next
  3. Resume <label>
  4. On error goto -1
  5. salir del procedimiento

El uso de cualquiera de estas formas para salir del controlador de errores también borrará el objeto de error.

Excelente fuente: Manejo de errores de Pearson en Chip VBA Pearson no menciona On error goto -1 en su artículo. Para citarlo:

Deliberadamente no incluí On Error GoTo -1 porque no sirve para nada y puede bloquear la aplicación completa de Excel a menos que se use exactamente de la manera correcta. Sí, en caso de error GoTo -1 es sintácticamente válido, pero es como darle una pistola a un adolescente borracho. Nada bueno saldrá de eso.

También puede manejar los errores en línea sin utilizar un controlador de errores que utiliza el objeto de error: MSDN Inline Error Handling


On Error GoTo 0 desactiva cualquier captura de errores actualmente presente en el procedimiento.

On Error GoTo -1 borra el manejo del error y lo establece en cero, lo que le permite crear otro error.

Ejemplo: En caso de error, vaya a -1

Después de que se GoTo ErrorFound el primer error, irá a GoTo ErrorFound que borrará el manejo de errores de la rutina y configurará uno nuevo, que irá a GoTo AnotherErrorFound cuando se encuentre un error.

Sub OnErrorGotoMinusOneTest() On Error GoTo ErrorFound Err.Raise Number:=9999, Description:="Forced Error" Exit Sub ErrorFound: On Error GoTo -1 ''Clear the current error handling On Error GoTo AnotherErrorFound ''Set a new one Err.Raise Number:=10000, Description:="Another Forced Error" AnotherErrorFound: ''Code here End Sub

Ejemplo: En caso de error, vaya a 0

Después de que se genera el primer error, recibirá el error ya que se ha deshabilitado el manejo de errores.

Sub OnErrorGotoZeroTest() On Error GoTo 0 Err.Raise Number:=9999, Description:="Forced Error" End Sub