Imprimir página | Cerrar ventana

Tratamiento de errores erróneo?

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=86743
Fecha de impresión: 27/Marzo/2026 a las 04:08


Tema: Tratamiento de errores erróneo?
Publicado por: Kublai
Asunto: Tratamiento de errores erróneo?
Fecha de publicación: 25/Julio/2023 a las 10:13
Buenos días.
Tengo el siguiente código, al que le he puesto un tratamiento de errores con una etiqueta al final con opciones para los distintos errores que creo que se pueden producir, pero no se por qué motivo no hace dicho tratamiento de errores y cuando se produce un error me abre la ventana de depuración, como si no existiera la etiqueta.
El código es un sub de un módulo que se activa desde un evento de un botón de un formulario y hace llamadas a otro procedimento sub (guardar_como).  Este es el código:


Sub ceexcred()

On Error GoTo etiqueta

terminado = False


' Rutas de origen y destino
Dim ruta_origen As String, plantilla As String, plantilla_origen As String
ruta_origen = CurrentProject.Path & "\_PLANTILLAS\"
plantilla = "Certificado de Existencia crédito.docx"
plantilla_origen = ruta_origen & plantilla
    
Dim ruta_destino As String, plantilla_destino As String
ruta_destino = frm!diet_ruta.Value & "\"
plantilla_destino = ruta_destino & plantilla
    
' Copia la plantilla a la ruta de destino
On Error Resume Next
FileCopy plantilla_origen, plantilla_destino
If err.Number <> 0 Then
    MsgBox "Error al copiar la plantilla. Asegúrate de que la ruta de destino exista.", vbExclamation
    err.Clear
    Exit Sub
End If
On Error GoTo 0


'' Nombre y ruta del archivo original
strFileName = plantilla
    
' Lanzamiento de Word
Set AppWord = New Word.Application
AppWord.Visible = True
    
    
' Apertura de la carta modelo
'    On Error Resume Next ' Ignorar errores
'    Set DocWord = AppWord.Documents.Open(strFilePath & "\" & strFileName)
    Set DocWord = AppWord.Documents.Open(plantilla_destino)

'    If err.Number <> 0 Then ' Ocurrió un error al abrir el documento
'        MsgBox "Error al abrir el documento de Word. Asegúrate de que el archivo no esté abierto.", vbExclamation
'        err.Clear
'        Set DocWord = Nothing
''        Set objWord = Nothing
'        Exit Sub
'    End If
'
'    On Error GoTo 0 ' Reanudar el manejo de errores normal
    
'   Datos a marcadores
With DocWord.Bookmarks

        .Item("Consejeria1").Range.Text = textfirma_Consejeria1
        .Item("Consejeria2").Range.Text = textfirma_Consejeria2
        .Item("presup_firmante").Range.Text = textfirma_presup_firmante
        .Item("presup_cargo").Range.Text = textfirma_presup_cargo
        .Item("Consejeria11").Range.Text = textfirma_Consejeria1
        .Item("Consejeria21").Range.Text = textfirma_Consejeria2
        .Item("CA").Range.Text = textfirma_CA
        .Item("Organismo").Range.Text = frm!diet_organismo
        .Item("Programa").Range.Text = frm!diet_programa
        .Item("Subconcepto").Range.Text = frm!diet_subconcepto
        .Item("Tipo_gasto").Range.Text = tipo_gasto
        .Item("Proyecto").Range.Text = frm!diet_proyecto
        .Item("Importe_total").Range.Text = Format(frm!diet_importe_total, "#,##0.00 €")
       
End With

terminado = True

MsgBox "Guarde el documento en su ruta de T:\, para evitar sobreescribir la plantilla"

'Direcciona ruta del documento
Dim rutaPorDefecto As String
rutaPorDefecto = frm!diet_ruta.Value

guardar_como AppWord, rutaPorDefecto

'Una vez guardado el word con los datos, borra la plantilla en ruta destino
Kill plantilla_destino

Exit Sub
etiqueta:

If err.Number = 76 Then
    MsgBox "Ha introducido una ruta no válida para guardar los archivos de este expediente"
    Firmantes
    normativa
End If

If err.Number = 94 Then
    MsgBox "Ha dejado en blanco algún dato imprescindible para el documento. Revíselo."
    Firmantes
    normativa
End If

If err.Number = 70 Then
    MsgBox "Tiene abierto en word el documento destino. Ciérrelo y vuelva a intentarlo."
    Firmantes
    normativa
End If


End Sub

No se qué es lo que he hecho mal para que al producirse un error no pase por la etiqueta. Os agradecería una ayudita. Muchas gracias.



Respuestas:
Publicado por: Mihura
Fecha de publicación: 25/Julio/2023 a las 10:15
Hace lo que debe, yo veo ahí un:

Error Resume Next


-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Kublai
Fecha de publicación: 25/Julio/2023 a las 10:22
He comentado la línea del On error resume next  y la del On error goto 0 y sigue haciendo lo mismo. No pasa por la etiqueta


Publicado por: Mihura
Fecha de publicación: 25/Julio/2023 a las 10:26
¿Puedes 'pegar' el código tal cuál está ahora?

-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Kublai
Fecha de publicación: 25/Julio/2023 a las 10:28

Sub ceexcred()

On Error GoTo etiqueta

terminado = False


' Rutas de origen y destino
Dim ruta_origen As String, plantilla As String, plantilla_origen As String
ruta_origen = CurrentProject.Path & "\_PLANTILLAS\"
plantilla = "Certificado de Existencia crédito.docx"
plantilla_origen = ruta_origen & plantilla
    
Dim ruta_destino As String, plantilla_destino As String
ruta_destino = frm!diet_ruta.Value & "\"
plantilla_destino = ruta_destino & plantilla
    
' Copia la plantilla a la ruta de destino
'On Error Resume Next
FileCopy plantilla_origen, plantilla_destino
If err.Number <> 0 Then
    MsgBox "Error al copiar la plantilla. Asegúrate de que la ruta de destino exista.", vbExclamation
    err.Clear
    Exit Sub
End If
'On Error GoTo 0


'' Nombre y ruta del archivo original
strFileName = plantilla
    
' Lanzamiento de Word
Set AppWord = New Word.Application
AppWord.Visible = True
    
    
' Apertura de la carta modelo
'    On Error Resume Next ' Ignorar errores
'    Set DocWord = AppWord.Documents.Open(strFilePath & "\" & strFileName)
    Set DocWord = AppWord.Documents.Open(plantilla_destino)

'    If err.Number <> 0 Then ' Ocurrió un error al abrir el documento
'        MsgBox "Error al abrir el documento de Word. Asegúrate de que el archivo no esté abierto.", vbExclamation
'        err.Clear
'        Set DocWord = Nothing
''        Set objWord = Nothing
'        Exit Sub
'    End If
'
'    On Error GoTo 0 ' Reanudar el manejo de errores normal
    
'   Datos a marcadores
With DocWord.Bookmarks

        .Item("Consejeria1").Range.Text = textfirma_Consejeria1
        .Item("Consejeria2").Range.Text = textfirma_Consejeria2
        .Item("presup_firmante").Range.Text = textfirma_presup_firmante
        .Item("presup_cargo").Range.Text = textfirma_presup_cargo
        .Item("Consejeria11").Range.Text = textfirma_Consejeria1
        .Item("Consejeria21").Range.Text = textfirma_Consejeria2
        .Item("CA").Range.Text = textfirma_CA
        .Item("Organismo").Range.Text = frm!diet_organismo
        .Item("Programa").Range.Text = frm!diet_programa
        .Item("Subconcepto").Range.Text = frm!diet_subconcepto
        .Item("Tipo_gasto").Range.Text = tipo_gasto
        .Item("Proyecto").Range.Text = frm!diet_proyecto
        .Item("Importe_total").Range.Text = Format(frm!diet_importe_total, "#,##0.00 €")
       
End With

terminado = True

MsgBox "Guarde el documento en su ruta de T:\, para evitar sobreescribir la plantilla"

'Direcciona ruta del documento
Dim rutaPorDefecto As String
rutaPorDefecto = frm!diet_ruta.Value

guardar_como AppWord, rutaPorDefecto

'Una vez guardado el word con los datos, borra la plantilla en ruta destino
Kill plantilla_destino

Exit Sub
etiqueta:

If err.Number = 76 Then
    MsgBox "Ha introducido una ruta no válida para guardar los archivos de este expediente"
    Firmantes
    normativa
End If

If err.Number = 94 Then
    MsgBox "Ha dejado en blanco algún dato imprescindible para el documento. Revíselo."
    Firmantes
    normativa
End If

If err.Number = 70 Then
    MsgBox "Tiene abierto en word el documento destino. Ciérrelo y vuelva a intentarlo."
    Firmantes
    normativa
End If


End Sub



Publicado por: Mihura
Fecha de publicación: 25/Julio/2023 a las 10:53
¿No tendrás un error resume next en dónde lances la sub ceexcred?

-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Kublai
Fecha de publicación: 25/Julio/2023 a las 11:06
En el evento click del botón que lanza la sub ceexcred no había ningún On error resume next.
Sí había uno en el evento load del formulario, pero ya lo he comentado también y aún así no he conseguido nada...
De todas formas, la instrucción de inicio del sub (on error goto etiqueta) no anularía cualquier resume next?



Publicado por: Mihura
Fecha de publicación: 25/Julio/2023 a las 11:27
Anterior si.

En otro formulario -en blanco-, create una sub que tenga un error, por ejemplo meter 1.000.000 en un integer     ¿ te funciona el control de errores ?


-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Kublai
Fecha de publicación: 25/Julio/2023 a las 11:48
He hecho lo que me dices: formulario en blanco y botón con el código que sigue. Y tampoco pasa por la etiqueta. El código es:

Private Sub Comando0_Click()
On Error GoTo etiqueta

Dim num As Integer
num = 1E+30

Exit Sub

etiqueta:


If err.Number = 6 Then
    MsgBox "ha pasado por la etiqueta"
End If



End Sub



Publicado por: Mihura
Fecha de publicación: 25/Julio/2023 a las 12:59
Probablemente tengas algo 'superior' que esté interceptando el control de errores.
Si no encuentras nada, prueba a crearte una B.D. en blanco e importa solo lo que necesites para poder probarlo en ella, a ver que ocurre.


-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Kublai
Fecha de publicación: 25/Julio/2023 a las 13:06
He creado una BD en blanco, he importado el formulario este último con el error de desbordamiento y estamos en las mismas: no pasa por la etiqueta.
La versión de officce que tengo es la 2021. Puede tener algo que ver?


Publicado por: Mihura
Fecha de publicación: 25/Julio/2023 a las 14:19
No sé que decirte ...

-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: pitxiku
Fecha de publicación: 26/Julio/2023 a las 09:08
¿Has usado la ejecución paso a paso o puesto puntos de interrupción? Porque el último control de errores sólo hará algo cuando se produzca el error 6.

También puedes usar un Else para los errores no identificados:

[Code]
Private Sub Comando0_Click()
On Error GoTo etiqueta

Dim num As Integer
num = 1E+30

Exit Sub

etiqueta:

If err.Number = 6 Then
    MsgBox "ha pasado por la etiqueta y es el error de desbordamiento"
Else
    MsgBox "ha pasado por la etiqueta y es el error no identificado " & Err
End If

'También se puede limpiar el error
Err.Clear
End Sub


Publicado por: Kublai
Fecha de publicación: 26/Julio/2023 a las 09:44
Es que creo que el problema lo tengo con el propio programa access porque, si bien el código donde he detectado el error era complejo y podía haber dificultad para detectar el fallo, he hecho lo que me comentó Mihura (crear un formulario sencillo con un botón, un error inducido como el desbordamiento) y sigue dando el mismo fallo (no hace caso a la instrucción On error goto etiqueta y nunca pasa por la etiqueta)


Publicado por: pitxiku
Fecha de publicación: 26/Julio/2023 a las 11:59
El tratamiento de errores que hay en tu último código hace lo siguiente:

Si se produce el error 6 lanza un mensaje

No hace nada más: ni borra el error, ni controla otros errores, ni lanza otros mensajes, nada.

Por eso pienso que te lanza el mensaje estándar de VBA, porque aunque llegue a la etiqueta no le dices que haga algo con el error. Llegas al final de esa subrutina y como sigues teniendo el error, salta el mensaje estándar.

Y por eso mi pregunta: ¿Has comprobado con puntos de interrupción y ejecución paso a paso que realmente no pasa por la etiqueta?


Publicado por: Kublai
Fecha de publicación: 26/Julio/2023 a las 12:25
Ejecutando paso a paso el error me lo da cuando asigno a la variable num el valor millonario. Ahí sale el mensaje estandard de error y me marca esa instrucción en amarillo y termina la ejecución sin pasar por la etiqueta.
Le he puesto Err.Clear al final de la etiqueta, pero no pasa por ella:

On Error GoTo etiq_error

Dim num As Integer
num = 1E+34

Exit Sub

etiq_error:

If err.Number = 6 Then
    MsgBox "ha habido un error de desbordamiento"
End If
err.Clear

End Sub



Publicado por: pitxiku
Fecha de publicación: 26/Julio/2023 a las 12:50
En el editor de VBA, ve al menú Herramientas --> Opciones. En el diálogo que aparece, pincha en la pestaña General. En el grupo "Interceptación de errores", ¿qué opción tienes activa? Para que el VBA use los "On Error..." debe estar seleccionada la opción "Interrumpir en errores no controlados":

https://learn.microsoft.com/es-es/office/vba/language/reference/user-interface-help/options-dialog-box#general-tab" rel="nofollow - Cuadro de diálogo Opciones | Microsoft Learn

Si no es esto, ya lo único que se me ocurre es que uses la opción de Reparar Access:

https://support.microsoft.com/es-es/office/reparar-una-aplicaci%C3%B3n-de-office-7821d4b6-7c1d-4205-aa0e-a6b40c5bb88b" rel="nofollow - Reparar una aplicación de Office - Soporte técnico de Microsoft


Publicado por: Kublai
Fecha de publicación: 27/Julio/2023 a las 07:50
Era eso!!!. Había otra opción señalada. Al activar la que me dices, todo funciona perfectamente.
Muchísimas gracias pitxiku por tu gran ayuda. Ya no sabía qué hacer.
Por mi parte, se puede cerrar este hilo. Gracias.


Publicado por: Mihura
Fecha de publicación: 27/Julio/2023 a las 09:04
Publicado originalmente por pitxiku pitxiku escribió:

En el editor de VBA, ve al menú Herramientas --> Opciones. En el diálogo que aparece, pincha en la pestaña General. En el grupo "Interceptación de errores", ¿qué opción tienes activa? Para que el VBA use los "On Error..." debe estar seleccionada la opción "Interrumpir en errores no controlados":

https://learn.microsoft.com/es-es/office/vba/language/reference/user-interface-help/options-dialog-box#general-tab" rel="nofollow - Cuadro de diálogo Opciones | Microsoft Learn


Yo buscándolo y no lo encontraba por ningún lado .... aisss Ouch

Gracias pitxiku.


-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es



Imprimir página | Cerrar ventana