Access VBA: gestionar un error

He elaborado un código para que al modificar algún dato en un formulario se actualice automáticamente un informe en pdf en el drive.

Cuando el informe existe, el nuevo informe se sobrescribe sobre el antiguo. La intención es que este siempre actualizado.

El problema me surge, si al intentar sobrescribir el archivo antiguo, este está abierto, me da error 2501. Quiero solucionarlo provocando un mensaje de atención para advertir que se cierre el archivo para que pueda volver a intentarlo.

En parte me funciona bien, si no hay error todo va bien, si surge el error me lanza el mensaje y al cerrar el archivo lo reintenta. Pero el problema me surge cuando no cierro el archivo y doy a aceptar en el cuadro de mensaje (ya se que no tiene mucho sentido, pero me gustaría dejarlo completo), en este caso al volver a intentarlo, no me funciona el salto del error (On error goto).

Pensaba que podía ser porque el error anterior permanecía en memoria, por lo que he intentado añadir la línea Error. Clear, pero sigue sin funcionar.

Sub ExportarDrive_InformeCliente()
DoCmd.RunCommand acCmdSaveRecord
Var_Subcarpeta_Drive = DLookup("[Nombre]", "Comerciales", "Id_Comercial= '" & Var_Id_Comercial & "'")
Var_NombreCliente_Drive = DLookup("[Nombre Comercial]", "Tabla_Clientes", "Referencia=" & Cliente_Drive)
Var_Cliente_PuntoVenta = DLookup("[Punto de venta]", "Tabla_Clientes", "Referencia=" & Cliente_Drive)
Var_Activo_Drive = DLookup("[Activo]", "Tabla_Clientes", "Referencia=" & Cliente_Drive)
If Var_Cliente_PuntoVenta = True Then
    Nombre_Fichero_Drive = Var_NombreCliente_Drive & " - Informe Clientes.pdf"
    Ruta_Directorio_Drive = "C:\Users\Jon\Google Drive\Informes Comerciales\"
    Ruta_Fichero_Drive = Ruta_Directorio_Drive & Var_Subcarpeta_Drive & "\" & Nombre_Fichero_Drive
    DoCmd.SetWarnings False 'Desactiva el mensaje de ACCESS de que se van a agregar registros
    If Dir(Ruta_Directorio_Drive, vbDirectory) = "" Then
        ChDir Ruta_Directorio_Drive
        MkDir Var_Subcarpeta_Drive
    Else
    End If
Reinicio:
    On Error GoTo Advertencia
        DoCmd.OutputTo acOutputReport, "Informe Clientes para comercial", "PDFFormat(*.pdf)", Ruta_Fichero_Drive, , "", 0, acExportQualityPrint
        DoCmd.SetWarnings True  'Vuelve a activar los mensajesDim Var_Subcarpeta As String
        GoTo Saltar_Advertencia
Advertencia:
    RespuestaAdvertencia = MsgBox("El archivo está abierto, cierralo para continuar", 48, "Atención")
        Err.Clear
        GoTo Reinicio
Saltar_Advertencia:
Else
End If
End Sub

1 Respuesta

Respuesta
2

Prueba con "Resume Reinicio", a ver qué tal.

Aunque he de decirte que no me "gusta" mucho el sistema que usas para gestionar el error...

Gracias, funciona bien.

De todas formas, estoy dispuesto a escuchar sugerencias y a aprender, pero ten en cuenta que se muy poco de programación, de ahí que voy haciendo mis módulos en base a la intuición, ayuda del access y por supuesto, en una gran parte gracias a vosotros.

Lo primero que has de saber para gestionar errores es el número de error a controlar, pues de otra forma, sea cual sea el error te va a saltar siempre el mismo mensaje.

En segundo lugar, yo colocaría el on error... como primera línea, así te aseguras de capturar cualquier error (solo gestiona los que siguen a esa línea de código).

Te pongo un enlace a un artículo de Neckkito, para que tengas una visión global de la gestión de errores y no alargarme aquí explicando lo mismo: http://siliconproject.com.ar/neckkito/index.php/manuales/mini-guia-depuracion-vba

Yo habría hecho tu código así:

Sub ExportarDrive_InformeCliente()
On Error Goto sol_err
DoCmd.RunCommand acCmdSaveRecord
Var_Subcarpeta_Drive = DLookup("[Nombre]", "Comerciales", "Id_Comercial= '" & Var_Id_Comercial & "'")
Var_NombreCliente_Drive = DLookup("[Nombre Comercial]", "Tabla_Clientes", "Referencia=" & Cliente_Drive)
Var_Cliente_PuntoVenta = DLookup("[Punto de venta]", "Tabla_Clientes", "Referencia=" & Cliente_Drive)
Var_Activo_Drive = DLookup("[Activo]", "Tabla_Clientes", "Referencia=" & Cliente_Drive)
If Var_Cliente_PuntoVenta = True Then
    Nombre_Fichero_Drive = Var_NombreCliente_Drive & " - Informe Clientes.pdf"
    Ruta_Directorio_Drive = "C:\Users\Jon\Google Drive\Informes Comerciales\"
    Ruta_Fichero_Drive = Ruta_Directorio_Drive & Var_Subcarpeta_Drive & "\" & Nombre_Fichero_Drive
    DoCmd.SetWarnings False 'Desactiva el mensaje de ACCESS de que se van a agregar registros
    If Dir(Ruta_Directorio_Drive, vbDirectory) = "" Then
        ChDir Ruta_Directorio_Drive
        MkDir Var_Subcarpeta_Drive
    End If
Reinicio:
    DoCmd.OutputTo acOutputReport, "Informe Clientes para comercial", "PDFFormat(*.pdf)", Ruta_Fichero_Drive, , "", 0, acExportQualityPrint
    DoCmd.SetWarnings True  'Vuelve a activar los mensajes
Salida:
   Exit Sub
sol_err:
   If Err.Number=2501 Then
      MsgBox "El archivo está abierto, cierralo para continuar", 48, "Atención"
       Resume Reinicio
   Else
      MsgBox "Se ha producido el error " & Err.NUmber & ":" & vbcrlf & Err.description, vbOkOnly, "ERROR"
      Resume Salida
   End If
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas