Como enlistar archivos contenidos en una carpeta con macro y ordenar su impresión a selección.

Expertos hoy necesito me ayuden con lo siguiente:

Tengo 2 carpetas en las cuales tengo varios archivos pdf que son generados por mi macro. Quisiera crear un formulario con 2 listbox en donde cada una muestre todos los archivos contenidos en las carpetas, correspondientemente (archivos de carpeta 1 en listbox1 y archivos de carpeta 2 en listbox2), y que pudiera seleccionar en los listbox cualquier archivo y mandarlo a imprimir con un botón de comando. Se que esto es trabajo fácil para ustedes. Gracias de antemano. (He aprendido un montón con su ayuda). Felicidades al foro.

1 Respuesta

Respuesta
1

Te anexo el código

Antes de imprimir revisa lo siguiente:

  • La versión de programa Adobe, entra al explorador de archivos, sigue la ruta: Archivos de programa\ Adobe \ Reader . En mi ejemplo puse Reade 11.0, pero debes poner en la macro la versión que tú tengas.
  • Crea un botón para imprimir el archivo del listbox1 y otro botón para imprimir el archivo del listbox2.

Private Sub CommandButton1_Click()
' llamada a imprimir de listbox1
    Call Imprimir_Pdf(ListBox1, archivo)
End Sub
'
Private Sub CommandButton2_Click()
' llamada a imprimir de listbox2
    Call Imprimir_Pdf(ListBox2, archivo)
End Sub
'
Sub Imprimir_Pdf(lista, archivo)
'Imprime archivo según la lista
    If lista.ListCount = 0 Then
        MsgBox "No hay registros a imprimir"
        Exit Sub
    End If
    If lista.ListIndex = -1 Then
        MsgBox "Selecciona un registro a imprimir"
        Exit Sub
    End If
    archivo = lista.List(lista.ListIndex)
    ruta = "C:\Program Files\Adobe\Reader 11.0\Reader\"
    Shell ruta & "AcroRd32.exe /n /t " & archivo
    DoEvents
End Sub
'
Private Sub UserForm_Initialize()
'Por Dante Amor
    'Cargar lista de archivos de carpetas
    ruta1 = "C:\trabajo\archivos\"
    ruta2 = "C:\trabajo\pdfs\"
    '
    arch1 = Dir(ruta1 & "*.pdf")
    '
    Do While arch1 <> ""
        ListBox1.AddItem ruta1 & arch1
        arch1 = Dir()
    Loop
    arch2 = Dir(ruta2 & "*.pdf")
    Do While arch2 <> ""
        ListBox2.AddItem ruta2 & arch2
        arch2 = Dir()
    Loop
End Sub



'.[Sal u dos. Dante Amor. No olvides valorar la respuesta. 

Dante me da error al presionar el botón de imprimir me sale esto:

la dirección del archivo esta correcta porque en el listbox se ve (lo cual prefiero que no, quisiera que solo se muestre el nombre del archivo sin la ruta):

te aclaro que la impresión deseada es física (en  papel), no en pdf, el pdf ya esta creado en la ruta. 

Esta línea en la macro es para imprimir un pdf en papel

Shell ruta & "AcroRd32.exe /n /t " & archivo

Lo que hace la línea es abrir el archivo y después lo envía a imprimir.


Vamos a hacer una prueba.

Cambia esa línea en la macro por esta:

Shell ruta & "AcroRd32.exe " & archivo

Es solamente una prueba, quiero revisar que efectivamente se abra el archivo en Acrobat.


Revisa que en tus rutas, al final se encuentre la diagonal \, ejemplo:

 'Cargar lista de archivos de carpetas
    ruta1 = "C:\trabajo\archivos\"
    ruta2 = "C:\trabajo\pdfs\"

Al final está la diagonal \


Ya verifique las rutas y si tienen la diagonal \ , cambie la línea que dices y hace exactamente lo mismo, solo que ahora me aparece 7 veces la ventana de "error al abrir el documento..."

Puedes poner tu archivo pdf en una carpeta menos larga, por ejemplo, crea una carpeta en C: le pones por nombre prueba, te quedaría así:

ruta1 = "C:\prueba\"

Ahí en esa carpeta pon un archivo pdf y ejecuta la macro


Cuando abres un pdf se abre con el acrobat que está intentando utilizar la macro. Es decir, no tienes más de una versión de acrobat, tal vez, tienes una versión que no pueda abrir el archivo. No lo sé, esto se me ocurre, ya que yo no tengo problemas para abrir los archivos pdf desde excel y enviarlos a imprimir.

No entrego una macro sin antes probarla.

Dante supongo que si era ese el problema, porque en mi pc tengo también el photoshop de adobe, corrí la macro en otra pc donde solo esta el adobe pdf instalado y funciono bien, ahora solo me queda lo del nombre del archivo que se muestra en la listbox. ¿Hay otra manera que no sea cambiando a una ruta más corta? .

¿Es posible agregar un textbox donde escriba el cod y me filtre en ambos listbox solo los archivos con ese cod (en ambas listas los archivos tienen un código de numero).?

Para que solamente se muestre el archivo hay que declarar las variables ruta1 y ruta2 como globales:

Dim ruta1, ruta2
'
Private Sub CommandButton1_Click()
' llamada a imprimir de listbox1
    Call Imprimir_Pdf(ListBox1, archivo, ruta1)
End Sub
'
Private Sub CommandButton2_Click()
' llamada a imprimir de listbox2
    Call Imprimir_Pdf(ListBox2, archivo, ruta2)
End Sub
'
Sub Imprimir_Pdf(lista, archivo, carpeta)
'Imprime archivo según la lista
    If lista.ListCount = 0 Then
        MsgBox "No hay registros a imprimir"
        Exit Sub
    End If
    If lista.ListIndex = -1 Then
        MsgBox "Selecciona un registro a imprimir"
        Exit Sub
    End If
    archivo = lista.List(lista.ListIndex)
    ruta = "C:\Program Files\Adobe\Reader 11.0\Reader\"
    Shell ruta & "AcroRd32.exe /n /t " & carpeta & archivo
    'Shell ruta & "AcroRd32.exe " & archivo
    DoEvents
End Sub
'
Private Sub UserForm_Initialize()
'Por Dante Amor
    'Cargar lista de archivos de carpetas
    ruta1 = "C:\trabajo\archivos\"
    ruta2 = "C:\trabajo\pdfs\"
    '
    arch1 = Dir(ruta1 & "*.pdf")
    '
    Do While arch1 <> ""
        ListBox1.AddItem arch1
        arch1 = Dir()
    Loop
    arch2 = Dir(ruta2 & "*.pdf")
    Do While arch2 <> ""
        ListBox2.AddItem arch2
        arch2 = Dir()
    Loop
End Sub


Ya sabes que con gusto te ayudo con todas tus peticiones, valora esta respuesta y crea una nueva para cada petición.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas