Imprimir archivos pdf desde una lista en excel que esta linkeada

Buena
Necesito tu ayuda
Tengo un listado en una hoja excel con el nombre de archivo PDF, están linkeados a los archivos en una carpeta llamada activos. Ubicada en c:\mis documentos\
Necesito que lea el contenido de la primera celda e imprima el archivo en impresora. Una vez impreso el archivo lo cierre y baje a la siguiente celda y realize la misma acción hasta que encuentre la primera celda en blanco y termina la acción.
Espero haberme explico bien he intentado realizar una macro pero, no me ha resultado.

3 Respuestas

Respuesta
2

Para que funcione en sistemas de 64 bits sería de esta forma:

Public Declare PtrSafe Function TerminateProcess Lib "kernel32" ( _
ByVal hProcess As Long, _
ByVal uExitCode As Long) As Long
Public Declare PtrSafe 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)
Sub ImprimirPDFs()
Dim CeldaInicial As String
Dim rutaPDF As String
Dim i As Integer
Dim idProcess As Long
Dim hnd As Long
CeldaInicial = "B3"
Do While Sheets("SHEET1").Range(CeldaInicial).Offset(i).Hyperlinks.Count > 0
rutaPDF = Empty
rutaPDF = Sheets("SHEET1").Range(CeldaInicial).Offset(i).Hyperlinks(1).Address
If rutaPDF <> Empty Then
idProcess = Shell("C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe /p /h """ & rutaPDF & """", vbMinimizedNoFocus)
DoEvents
hnd = OpenProcess(PROCESS_TERMINATE, True, idProcess)
TerminateProcess hnd, 0
End If
i = i + 1
Loop
End Sub
Yo tengo el problema que los márgenes no se respetan, pierdo un buen margen de impresión.

Respuesta
1

Lo que quieres hacer no se puede solo con macros, necesitas usar APIs de windows, este es un ejemplo de código muy sencillo que hace lo que quieres, debes ponerlo en un modulo.

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)
Sub ImprimirPDFs()
Dim CeldaInicial As String
Dim rutaPDF As String
Dim i As Integer
Dim idProcess As Long
Dim hnd As Long
CeldaInicial = "B3"
Do While Sheets("Hoja1").Range(CeldaInicial).Offset(i).Hyperlinks.Count > 0
rutaPDF = Empty
rutaPDF = Sheets("Hoja1").Range(CeldaInicial).Offset(i).Hyperlinks(1).Address
If rutaPDF <> Empty Then
idProcess = Shell("C:\Program Files (x86)\Adobe\Reader 9.0\Reader\AcroRd32.exe /p /h """ & rutaPDF & """", vbMinimizedNoFocus)
DoEvents
hnd = OpenProcess(PROCESS_TERMINATE, True, idProcess)
TerminateProcess hnd, 0
End If
i = i + 1
Loop
End Sub

En el procedimiento ImprimirPDFs puedes ver una variable llamada CeldaInicial, que almacena la celda donde esta el primer pdf, de ahí se va comprobando que la celda tenga un hipervínculo, si no tiene se termina la ejecución, si contiene hipervínculo, imprime el pdf al que apunta el hipervínculo y cuando termina de imprimir, cierra el pdf, y pasa a la celda de abajo, y se repute el ciclo.

Para imprimir los pdf se hace con la linea

idProcess = Shell("C:\Program Files (x86)\Adobe\Reader 9.0\Reader\AcroRd32.exe /p /h """ & rutaPDF & """", vbMinimizedNoFocus)

donde se pone la ruta del adobe reader, la cual debes cambiarla por la ruta donde tu tienes el adobe reader.

Debes notar que es un código muy simple ya que no se comprueba que el archivo sea realmente un pdf, tampoco se valida que se tenga instalado el adobe, tampoco se valida que el hipervínculo sea un archivo externo, entre otras cosas, pero es un buen punto de partida.

Respuesta

Todo perfecto. Pero necesitaría imprimir un rango de paginas.

He intentado primero abrir el pdf y luego imprimir el rango pero me imprime le excel y no el pdf:

'ActiveSheet.PrintOut From:=F, To:=T

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas