Macro para genear un pdf por cada línea de excel

Se que se ha tratado el tema pero, después de haber probado algunas de las soluciones que proponéis, no consigo obtener el resultado querido.

Expono mi caso.

Tengo un excel con columnas que van desde A - J y 800 líneas.

Partiendo de la base de que tengo el formulario que quiero rellenar con éstas líneas, quiero generar una macro para rellenar un pdf por cada línea, y que el nombre de cada pdf generado, sea el de la columna B.

2

2 Respuestas

4.409.275 pts. Sancho, si los perros ladran ...

H o l a:

Ya no entendí.

¿El formulario lo tienes en excel?

Puedes poner imágenes con ejemplos de lo que tienes.

Vuelvo a exponerlo.

Tengo un excel con esta estructura. En el que hay 800 líneas.

Con los datos de excel se necesita rellenar el siguiente formulario pdf. Un pdf por cada línea que hay en el excel. Y a su vez, el nombre de cada pdf generado debe ser el de la columna A.

Por ejemplo, para el primer formulario generado se exportarían los datos de la línea 2. Y el nombre del fichero debe ser 38134100.pdf

Gracias por sus rápidas respuestas

Te anexo la macro para llenar el pdf. Hay que afinar ciertos detalles, pero para afinarlos necesito que hagas una prueba con 2 registros, así como los tienes en tu imagen. En tu archivo de "mantenimientos y revisiones" pon la siguiente macro en un módulo:

Sub EnviarDatosAPdf()
'Por.Dante Amor
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    Set h1 = Sheets("Hoja1")
    '
    ruta = "C:\trabajo\formato\"
    ruta2 = "C:\trabajo\pedidos\"
    arch = "carta.pdf"
    For i = 2 To h1.Range("A" & Rows.Count).End(xlUp).Row
        arch2 = h1.Cells(i, "A") & ".pdf"
        FileCopy ruta & arch, ruta2 & arch2
        ActiveWorkbook.FollowHyperlink ruta2 & arch2
        Application.Wait Now + TimeValue("00:00:05")
        DoEvents
        For j = h1.Columns("A").Column To h1.Columns("I").Column
            DoEvents
            SendKeys "{TAB}", True
            DoEvents
            h1.Cells(i, j).Copy
            DoEvents
            SendKeys "^v", True
            DoEvents
        Next
        '
        SendKeys "^s", True
        DoEvents
        Application.Wait Now + TimeValue("00:00:05")
        'SendKeys "{ENTER}", True
        'DoEvents
        'SendKeys "{TAB}", True
        'DoEvents
        'SendKeys "{ENTER}", True
        'DoEvents
        'Application. Wait Now + TimeValue("00:00:05")
        'DoEvents
        SendKeys "^q", True
        DoEvents
        Application. Wait Now + TimeValue("00:00:05")
        DoEvents
        h1.Cells(i, "K") = "Procesado"
    Next
    Application.ScreenUpdating = True
    MsgBox "Archivos pdf creados"
End Sub

Tienes que hacer algunos ajustes en la macro.

En esta línea pon la carpeta donde tienes tu archivo con el formato pdf:

ruta = "C:\trabajo\formato\"

En esta otra pon la carpeta donde quieres guardar todos los pdf, puede ser la misma ruta que la anterior, pero tienes que indicarlo:

ruta2 = "C:\trabajo\pedidos\"

En esta otra línea pon el nombre de tu archivo pdf que tiene el formulario:

arch = "carta.pdf"

Lo que hace la macro es copiar tu archivo formulario.pdf con el nuevo nombre de la columna A, llenar los datos que están en la fila, guardar el nuevo pdf, cerrarlo y seguir con la siguiente línea.


Realiza la prueba con 2 registros y me comentas qué es lo que sucedió.

Sal u dos

Hola de nuevo, realicé la prueba.

Abre pdf, rellena los campos, cierra pdf y lo envia a la carpeta de destino.

Lo que no hace bien es lo siguiente.

Te muestro el archivo excel con el que realice la prueba.

Pues bien, lo que rellenó la macro fue este pdf con los siguientes datos.

Me copia en todos los campos, el ultimo valor de la tabla.

Gracias

Vamos a ocupar otra alternativa.


La otra opción es que en la "Hoja2" crees el formato, quedarías más o menos así:

En esa hoja2 establecerías los colores, las líneas el ancho de hoja, es decir, todo el formato de tu pdf.

En la hoja1 seguirán tus datos tal cual los tienes.


La macro sería la siguiente:

Sub CrearPdfs()
'Por.Dante Amor
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    Set h1 = Sheets("Hoja1")
    Set h2 = Sheets("Hoja2")
    '
    ruta2 = "C:\trabajo\pedidos\"
    For i = 2 To h1.Range("A" & Rows.Count).End(xlUp).Row
        arch2 = h1.Cells(i, "A") & ".pdf"
        h2.[B4] = h1.Cells(i, "A")
        h2.[E4] = h1.Cells(i, "B")
        h2.[G4] = h1.Cells(i, "C")
        h2.[B5] = h1.Cells(i, "D")
        h2.[G5] = h1.Cells(i, "E")
        h2.[B6] = h1.Cells(i, "F")
        h2.[B6] = h1.Cells(i, "G")
        h2.[B7] = h1.Cells(i, "H")
        h2.[G7] = h1.Cells(i, "I")
        '
        h2.ExportAsFixedFormat Type:=xlTypePDF, _
            Filename:=ruta2 & arch2, _
            Quality:=xlQualityStandard, IncludeDocProperties:=True, _
            IgnorePrintAreas:=False, OpenAfterPublish:=False
    Next
    MsgBox "Archivos generados"
End Sub

El pdf se vería así:


Prueba y me comentas.


':)
S a l u d o s . D a n t e A m o r
':) Si es lo que necesitas. Recuerda valorar la respuesta. G r a c i a s.

Si te das cuenta en lo que adjuntas, la dirección no se copia; En el campo dirección se copia el valor pob2. Y eso mismo me ocurre a mi.

Aun así, el formulario es mucho más extenso que lo que te adjunto.

El formulario a rellenar seria algo así, con cuadros de texto y checkbox. No se si puede realizarse todo este formulario en excel. Pues debe llevar esta misma estructura sin ningún tipo de modificación.

Gracias por tu atención :)

H o l a:

Solamente es un detalle.

Hay que cambiar en la macro esta línea:

h2.[B6] = h1.Cells(i, "G")

Por esta:

h2.[G6] = h1.Cells(i, "G")

La macro completa quedaría así:

Sub CrearPdfs()
'Por.Dante Amor
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    Set h1 = Sheets("Hoja1")
    Set h2 = Sheets("Hoja2")
    '
    ruta2 = "C:\trabajo\pedidos\"
    For i = 2 To h1.Range("A" & Rows.Count).End(xlUp).Row
        arch2 = h1.Cells(i, "A") & ".pdf"
        h2.[B4] = h1.Cells(i, "A")
        h2.[E4] = h1.Cells(i, "B")
        h2.[G4] = h1.Cells(i, "C")
        h2.[B5] = h1.Cells(i, "D")
        h2.[G5] = h1.Cells(i, "E")
        h2.[B6] = h1.Cells(i, "F")
        h2.[G6] = h1.Cells(i, "G")
        h2.[B7] = h1.Cells(i, "H")
        h2.[G7] = h1.Cells(i, "I")
        '
        h2.ExportAsFixedFormat Type:=xlTypePDF, _
            Filename:=ruta2 & arch2, _
            Quality:=xlQualityStandard, IncludeDocProperties:=True, _
            IgnorePrintAreas:=False, OpenAfterPublish:=False
    Next
    MsgBox "Archivos generados"
End Sub

Claro que se podría poner ese formulario en excel y sería mucho más sencillo llenarlo desde excel y generar cada uno de los pdf.


Crea el formulario en excel tal y como quieres el pdf.


Si quieres te ayudo con la creación del formulario, y desde luego, con el llenado y generación de cada uno de los pdfs.

Valora esta respuesta y crea una nueva pregunta, procura poner en la nueva pregunta todo el detalle de lo que tienes y de lo que esperas como resultado.

Sal u dos

10.975 pts.

Estas dos macros te serán útil para lo que necesitas por favor califica si es de tu ayuda.

Sub TestExportAsFixedFormat()

Dim rng As Range
Set rng = Range("A1:E10") 'Aquí especificas el rango que necesitas mandar a PDF.
SetupRangeData rng
Dim fileName As String
fileName = "D:\Export.pdf" ' Aqui la ruta que deseas que se guarde.
rng.ExportAsFixedFormat Type:=xlTypePDF, _
fileName:=fileName, Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=True, _
From:=1, To:=1, OpenAfterPublish:=False

'Si colocas en true el OpenAfterPublish te abrirá el PDF a penas sea creado
End Sub

Sub SetupRangeData(rng As Range)
rng.Formula = "=RANDBETWEEN(1, 100)"
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas