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'
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
Insertamos un módulo estándar, y en esta ventana de código añadiremos nuestra macro:
Tras ejecutar la macro sinningún error podemos comprobar cómo se han generado los distintos pdf con los datos rellenos...
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'
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
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...
Eres grande, gracias por compartir tus conocimientos, saludos.
ResponderEliminargracias a ti
Eliminar;-)
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?
ResponderEliminarHola,
Eliminarpara 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
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.
ResponderEliminarSaludos.
Hola Aitor,
Eliminarhas activado las referencias/bibliotecas de Acrobat desde el editor de VB en Excel???
Slds
Hola Ismael,
EliminarSiento responder tan tarde, tengo activas las referencias de Acrobat. Continúo con el error.
Saludos.
Qué raro
Eliminar¿puedes enviarme el fichero a excelforo@gmail.com?
Slds