Imprime PDF en orden de acuerdo a una columna de Excel.

Lo que necesito es imprimir un PDF, de acuerdo a una nomina.

Explicación:

En la hoja 1 en la columna A, tengo el nombre de la carpeta en donde se encuentran los archivos PDF, y en la columna G, tengo los numero de facturas.

Los archivos PDF, están guardados con el numero de la factura, en el disco C:

Lo que quiero que haga es que vaya a la columna G, tome el primer registro, que lo busque en la carpeta que tiene el nombre de la columna A, e imprima el PDF relacionado si no lo encuentra que copie el numero de factura no encontrado en la Hoja2. Lo importante es que todo esto debe ser en el mismo orden que se encuentra la columna G, así hasta que no queden registros que buscar.

1 respuesta

Respuesta
1

H o l a:

Te anexo la macro.

En esta línea de la macro tienes que poner la ruta y nombre del programa Adobe Reader que tengas:

pid = Shell("C:\Archivos de programa\Adobe\Reader 10.0\Reader\AcroRd32.exe /p /h """ & ruta & arch & """", vbMinimizedNoFocus)

En mi caso el Adobe Reader está en esta ruta:

"C:\Archivos de programa\Adobe\Reader 10.0\Reader\AcroRd32.exe

Para ver en cuál ruta está tu Adobe Reader, busca el icono de Adobe Reader en el escritorio de tu computadora, presiona click derecho y elige propiedades, copia el contenido del campo Destino y pégalo en la macro. Verifica que las comillas queden como en el ejemplo que te estoy enviando.


La macro:

Public Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Const PROCESS_TERMINATE As Long = (&H1) 'Para poder utilizar el handle para cerrar el proceso
Sub ImprimirPDFs()
'referencia: https://codigoexcel.wordpress.com/tag/imprimir/
'Act.Por.Dante Amor
    Dim i As Integer, j As Integer, pid As Long, hnd As Long, ruta As String, arch As String
    Set h1 = Sheets("Hoja1")
    Set h2 = Sheets("Hoja2")
    h2.Cells.Clear
    j = 2
    n = 1
    On Error Resume Next
    u = h1.Range("G" & Rows.Count).End(xlUp).Row
    Application.StatusBar = False
    For i = 2 To u
        Application.StatusBar = "Imprimiendo " & n & " de " & u
        n = n + 1
        ruta = h1.Cells(i, "A")
        If Right(ruta, 1) <> "\" Then ruta = ruta & "\"
        arch = h1.Cells(i, "G")
        If UCase(Right(arch, 4)) <> ".PDF" Then arch = arch & ".pdf"
        If Dir(ruta & arch) <> "" Then
            pid = Shell("C:\Archivos de programa\Adobe\Reader 10.0\Reader\AcroRd32.exe /p /h """ & ruta & arch & """", vbMinimizedNoFocus)
            DoEvents
            Application. Wait Now + TimeValue("00:00:07")
            DoEvents
            hnd = OpenProcess(PROCESS_TERMINATE, True, pid)
            DoEvents
            TerminateProcess hnd, 0
            DoEvents
            Application. Wait Now + TimeValue("00:00:07")
        Else
            h2.Cells(j, "G") = arch
            j = j + 1
        End If
    Next
    Application.StatusBar = False
    MsgBox "fin"
End Sub

En la "Hoja 1" pon tus datos, en la "Hoja 2" columna G te pondrá el nombre de los archivos que no fueron encontrados.


El proceso de impresión de un PDF depende de la velocidad en que se abra tu archivo pdf, se imprima y se cierre el pdf, por eso en la macro hay una instrucción para esperar este proceso de apertura y cierre del pdf, si encuentras que hay archivos que no se imprimieron, entonces debes incrementar el tiempo de espera, yo lo puse en 7 segundos, entonces cambia de 07 a 10 y vuelve a probar.

Application.Wait Now + TimeValue("00:00:07")

' : )
'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias
' : )

Gracias dante por tu pronta respuesta, pero la estoy probando, pero no hace, me parece que falta que vaya a la carpeta en donde se encuentran los archivos PDF.

Dante, en realidad tiene que ir a una carpeta que tiene sub carpetas con el nombre del archivo que se encuentra en la columna A de la hoja con datos, y desde ese punto debe ir a buscar el archivo que llama igual a la primera celda de la columna G, e imprimir PDF

Tienes que poner el nombre completo de la carpeta con sus subcarpetas, es decir, si el archivo está en la carpeta trabajo y en la supcarpeta facturas, entonces en la columna A tienes que poner

C:\trabajo\facturas\

Prueba poniendo un par de archivos en una carpeta en C: por ejemplo, crea una carpeta que se llame C:\Prueba\ entonces en la celda A2 pon la carpeta C:\Prueba\ y también la celda A3 pon la carpeta C:\Prueba\

En la celda G2 pon el nombre de un archivo pdf y en la celda G3 pon el nombre de otro archivo pdf

Ejecuta la macro.

Como te comenté el proceso de impresión es algo delicado, ya que se tiene que abrir otra aplicación que no es de excel y enviar a imprimir, por eso es preciso que realices unas pruebas.

En tu pregunta original no mencionaste que se tiene que buscar en subcarpetas, el nombre de la carpeta y la subcarpeta la tienes que poner en la columna A.

Realiza la prueba y me comentas.

Si se realiza la impresión de los PDF, no olvides valorar la respuesta.

Si quieres que la macro vaya a buscar en subcarpetas el nombre del archivo, crea una nueva pregunta y específicas lo que requieres y con todo gusto te apoyo.

Sal u dos

¡Gracias! Dante...eres seco, me ayudaste bastante, se demora un poco, pero la dejare corriendo dado que es muy extenso el listado, de verdad nuevamente me haz ayudado bastante.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas