Como Registrar errores de macro y evitar el depurador

Hace tiempo hice una consulta sobre este tema pero por error borre la consulta, el asunto es el siguiente: quiero evitar que cuando se produce un error en la macro se abra el formulario con los botones de finalizar y depurar, en vez de eso quiero que;

1-Reinicie el formulario donde esta el error

2-muestre un msgbox   Y

3-Registre en una hoja llamada ERRORES; el error, el formulario y la linea de código con el problema.

Quien desee ayudarme puede trabajar sobre este ejemplo, yo lo sabre adaptar a mi formulario.

Ejemplo: El formulario solicita una clave, si la clave no es la indicada no hace nada, si es la clave correcta produce un error a propósito.

Private Sub CommandButton1_Click()
'ERROR A PROPOSITO PARA ENTRAR AL VBA
Dim clave As String
clave = TextBox1.Value
If clave <> "piernitas" Then
Exit Sub
Else
dsadsad.vdlkvsldvkmsd
End If
End Sub

1 respuesta

Respuesta
1

Te anexo un ejemplo

Private Sub CommandButton1_Click()
    'ERROR A PROPOSITO PARA ENTRAR AL VBA
    Dim clave As String
    clave = TextBox1.Value
    If clave <> "piernitas" Then
        Exit Sub
    Else
        On Error Resume Next
        dsadsad.vdlkvsldvkmsd
        If Err.Number <> 0 Then
            n_err = Err.Number
            d_err = Err.Description
            MsgBox "Error del programa: " & n_err & " : " & d_err
            On Error GoTo 0
            'REGISTRA EL ERROR
            Set he = Sheets("ERRORES")
            ue = he.Range("A" & Rows.Count).End(xlUp).Row + 1
            he.Cells(ue, "A").Value = n_err
            he.Cells(ue, "B").Value = d_err
            he.Cells(ue, "C").Value = Me.Name
            he.Cells(ue, "D").Value = "dsadsad.vdlkvsldvkmsd"
            'Regresa al textbox para capturar otra vez"
            TextBox1.SetFocus
        End If
    End If
End Sub

Considera que por cada línea de tu código deberás verificar si existe un error, para realizar el registro.


[Sal u dos

Excelente Dante gracias, ahora solo una duda, en este ejemplo sabemos que el error esta justo después del "else", pero en la realidad nunca sabre donde se puede producir el error, por ende me gustaría asegurar el registro del error desde el "if" por ejemplo en este caso justo después de la línea:

  If clave <> "piernitas" Then

Como te comenté:

Considera que por cada línea de tu código deberás verificar si existe un error, para realizar el registro.

Todo depende de cuántas verificaciones quieras hacer.

Lo que te puse es un ejemplo de cómo se debe verificar un error. Toma el ejemplo y aplícalo para cada una de las líneas de tu código donde quieras la verificación.

Te entiendo sin embargo 2 cosas ;

1- si tuviera una condición donde hubiera un error desde el "if" y luego otro error en el "else" me registraría solo el primer error o solo el ultimo?

2-en el código colocas que en la columna D de la hoja ERRORES me registre la instrucción donde se produce el error sin embargo en la realidad esa instrucción (con error) seria otra. Con este código siempre estaría registrando "dsadsad.vdlkvsldvkmsd" como el error para todo. Se me ocurre que para capturar el error de una mejor manera, lo ideal seria que en una columna se guarde el procedimiento (sub) de ese formulario , y en otra columna se registre el numero de la linea de código donde se  produjo el error. 

ejemplo:

Private Sub CommandButton1_Click() '*****EN UNA COLUMNA QUISIERA QUE GUARDE Sub CommandButton1_Click 
 1   'ERROR A PROPOSITO PARA ENTRAR AL VBA
 2   Dim clave As String
 3  clave = TextBox1.Value
 4   If clave <> "piernitas" Then
 5      Exit Sub
 6   Else
 7       On Error Resume Next
 8       dsadsad.vdlkvsldvkmsd '*****Y EN OTRA COLUMNA SE REGISTRE 8 POR SER LA 8VA LINEA DEL CÓDIGO
        If Err.Number <> 0 Then
            n_err = Err.Number
            d_err = Err.Description
            MsgBox "Error del programa: " & n_err & " : " & d_err
            On Error GoTo 0
            'REGISTRA EL ERROR
            Set he = Sheets("ERRORES")
            ue = he.Range("A" & Rows.Count).End(xlUp).Row + 1
            he.Cells(ue, "A").Value = n_err
            he.Cells(ue, "B").Value = d_err
            he.Cells(ue, "C").Value = Me.Name
            he.Cells(ue, "D").Value = "dsadsad.vdlkvsldvkmsd"
            'Regresa al textbox para capturar otra vez"
            TextBox1.SetFocus
        End If
    End If
End Sub

Nuevamente te comento, es un ejemplo. Tú debes adaptarlo a lo que necesites.

Cada que verifiques una línea, en el texto de la columna "D" lo debes cambiar por el correspondiente.

Así sería la estructura

If valor Then
    instruccion 1
    if error then
       registras error
       columna "D" "error en instruccion 1"
   end if
Else
   instruccion 2
   if error then
      registras error
      columna "D" error en instruccion 2"   
   end if
End If

¡Gracias! te entiendo, te entiendo. jejeje creo que estaba pidiendo mucho. Muchas gracias sirve 100%

¿Dante la línea "on error resume next" también debo copiarla en cada línea que quiero evaluar o basta con copiarla solo una vez al principio del sub.?

Te explico el funcionamiento y tú debes decidir en dónde utilizarla.

On Error Resume Next

Si durante la ejecución se encuentra algún error en la línea n, omite la ejecución de la línea n y pasa a la línea.

Cada que ocurra un error pasará a la siguiente línea, no importa si tienes 100 errores, siempre pasará a la siguiente línea.

Si ya no quieres que ocurra lo anterior, entonces, por así decirlo, para apagar el On Error Resume Next, tienes que poner la instrucción On Error Goto 0. Con esta instrucción, si ocurre un error, entonces la macro se detiene y te envía el mensaje a depurar.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas