jueves, 28 de marzo de 2019

VBA: Rellenar un formulario PDF desde Excel

Hace un par de semanas un lector preguntaba por la manera de completar varios formularios guardados en pdf desde una base de datos en una hoja de cálculo...
Hoy veremos un procedimiento bastante sencillo si tenemos una versión de Adobe Acrobat (no Reader!!).


Obviamente tenemos nuestro formulario creado, a modo de ejemplo con cinco campos:
'Nombre'
'Email'
'Fecha registro'
'Ciudad origen'
y 'Núm expediente'

VBA: Rellenar un formulario PDF desde Excel



Tener identificado los nombres de los diferentes campos del formulario es fundamental.. ya que la macro los identificará para su cumplimentación...

Por otra parte, en la hoja de cálculo tenemos una tabla 'TblDatos' con la información a trasladar

VBA: Rellenar un formulario PDF desde Excel



Insertamos un módulo estándar, y en esta ventana de código añadiremos nuestra macro:

Sub RellenarFormularioPDF()
'OJO!! solo funciona con Adobe ACROBAT, NO con Reader !!!

'Declaramos las variables
Dim stRutaPDF As String, nombreForm As String, stRutaCompletaPDF As String
Dim stRutaGuardadoPDF As String

Dim objAcrobatApp As Object, objAcrobatAVDoc As Object, objAcrobatPDDoc As Object
Dim objJSO As Object
    
Application.ScreenUpdating = False
'la ruta del formulario a completar
stRutaPDF = "E:\excelforo\"
nombreForm = "FormWord_PDF.pdf"
stRutaCompletaPDF = stRutaPDF & nombreForm

'Recorremos los registros en la tabla
For Each dato In Range("TblDatos[Nombre]")
    On Error Resume Next        'controlamos posibles errores al crear el objeto Acrobat o el documento pdf
    'Iniciamos al aplicación Acrobat
    Set objAcrobatApp = CreateObject("AcroExch.App")
    'Creamos el objeto AVDoc (el documento pdf)
    Set objAcrobatAVDoc = CreateObject("AcroExch.AVDoc")
    
        'Comprobamos si el objeto Acrobat ya existiera o generase algún tipo de error...
    If Err.Number <> 0 Then
        MsgBox "No podemos crear el objeto Acrobat", vbCritical
        'liberamos memoria antes de salir del procedimiento.
        Set objAcrobatApp = Nothing: Set objAcrobatAVDoc = Nothing
        Exit Sub
    End If
    On Error GoTo 0             'damos por acabado posibles errores
    
    'Abrimos el pdf con el formulario a rellenar.
    If objAcrobatAVDoc.Open(stRutaCompletaPDF, "") = True Then
        'Declaramos el obejto PDDoc
        Set objAcrobatPDDoc = objAcrobatAVDoc.GetPDDoc
        'declaramos el Objeto Java Script
        Set objJSO = objAcrobatPDDoc.GetJSObject
        
        On Error Resume Next
        'Comenzamos a rellenar los campos del formulario para cada registro
        'recuperamos el dato de la tabla de la hoja de cálculo...
        'los pasamos como texto/string para evitar fallos.
        objJSO.GetField("Nombre").Value = CStr(dato.Value)
        objJSO.GetField("Email").Value = CStr(dato.Offset(0, 1).Value)
        objJSO.GetField("Fecha registro").Value = CStr(dato.Offset(0, 2).Value)
        objJSO.GetField("Ciudad origen").Value = CStr(dato.Offset(0, 3).Value)
        objJSO.GetField("Núm expediente").Value = CStr(dato.Offset(0, 4).Value)
            
        If Err.Number <> 0 Then
            'si aparece algún error, cerramos el doc sin guardar y salimos de Acrobat!!!
            objAcrobatAVDoc.Close True
            objAcrobatApp.Exit
            
            'liberamos memoria y salimos
            Set objJSO = Nothing
            Set objAcrobatPDDoc = Nothing: Set objAcrobatAVDoc = Nothing
            Set objAcrobatApp = Nothing
            Exit Sub
        End If
        On Error GoTo 0
        
        'Generamos la ruta de lo spdf guardados
        stRutaGuardadoPDF = stRutaPDF & dato & ".pdf"
                
        'Guardamos el formulario como pdf y un nombre personalizado
        objAcrobatPDDoc.Save 1, stRutaGuardadoPDF

        'cerramos el formualrio pdf sin guardar cambios
        objAcrobatAVDoc.Close True
        
        'y cerramos la aplicación (Acrobat) para finalizar
        objAcrobatApp.Exit
           
        'liberamos memoria
        Set objJSO = Nothing
        Set objAcrobatPDDoc = Nothing: Set objAcrobatAVDoc = Nothing: Set objAcrobatApp = Nothing
        
    Else
        
        MsgBox "No podemos abrir el fichero...", vbCritical, "Algo ocurre con el fichero o su ruta."
        
        'Cerramos Acrobat
        objAcrobatApp.Exit
        
        'liberamos memoria
        Set objAcrobatAVDoc = Nothing: Set objAcrobatApp = Nothing
        Exit Sub
        
    End If
Next dato

Application.ScreenUpdating = True

'mensaje final de completado.
MsgBox "Todos los formularios se han rellenado correctamente!", vbInformation, "ok... proceso acabado"
    
End Sub



Tras ejecutar la macro sinningún error podemos comprobar cómo se han generado los distintos pdf con los datos rellenos...

VBA: Rellenar un formulario PDF desde Excel



8 comentarios:

  1. Eres grande, gracias por compartir tus conocimientos, saludos.

    ResponderEliminar
  2. Buenos días Ismael, He intentado realizar el procedimiento que indicas, pero me detecta un error en esta línea (For Each dato In Range("TblDatos[Nombre]")). No se como nombrar la tabla de datos para que no me de el error. ¿Alguna sugerencia?

    ResponderEliminar
    Respuestas
    1. Hola,
      para dar nombre a la tabla solo actívala (selecciona una de sus celdas) y desde la Barra de herramientas de tablas > pestaña Diseño > grupo Propiedades > campo Nombre tabla

      Saludos

      Eliminar
  3. Muchas gracias por el aporte, tengo un problema al ejecutar la macro me sale error "No podemos crear el objeto Acrobat". Tengo el Adobe Acrobat Pro DC y Excel 2016.

    Saludos.

    ResponderEliminar
    Respuestas
    1. Hola Aitor,
      has activado las referencias/bibliotecas de Acrobat desde el editor de VB en Excel???
      Slds

      Eliminar
    2. Hola Ismael,

      Siento responder tan tarde, tengo activas las referencias de Acrobat. Continúo con el error.

      Saludos.

      Eliminar
    3. Qué raro
      ¿puedes enviarme el fichero a excelforo@gmail.com?

      Slds

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.