Newsgroup: it.comp.appl.access
Titolo: Problematica nello stampare PDF da maschera

Caio a tutti,
Ho bisogno del vostro aiuto, per una banalità che “purtroppo” non mi fa andare avanti :
Per ogni record in una maschera dovrei stampare un PDF ben preciso.
Nel record ho creato un campo NomePDF dove ho inserito il nome del file.
Ho creato un pulsante che mi apre il pdf con la seguente istruzione:
 
Me.Application.FollowHyperlink (Me.Folder).
 
nel campo Folder viene ricostruito il path del file.
 
Il problema nasce quando devo far stampare in automatico lo stesso PDF insieme ad altri report.
Ho provato con il metodo Printer ma non è presente nel mio VBA, mi esce error 438  e non riesco(prob. sto invecchiando) ad associare la libreria corretta.
Come posso fare????
 
Grazie in anticipo...


Il Metodo Printer non credo esista da nessuna parte, eventualmente esiste l'oggetto Printer in VBA oppure il Comando PRINT...
 
Se devi stampare un Documento di cui hai in sostanza l'origine(REPORT) mi chiedo perchè stampare il PDF e non direttamente il REPORT...?
 
Detto questo puoi inviare il comando PRINT a SHELLEXECUTE come se da RightClick del Mouse sul File selezionassi "STAMPA"...
 
Quì trovi la soluzione:
https://www.ozgrid.com/forum/forum/help-forums/excel-vba-macros/147038-print-a-pdf-file-using-vba
 
 
@Alex

Il giorno venerdì 5 ottobre 2018 12:04:37 UTC+2, 
verrengia.dino....@gmail.com
 ha scritto:

Ciao Alex, grazie per la risposta, il odc in esame non è un report è un PDF, ho necessità di stampare (senza aprirlo) il pdf insieme ad altri report associati allo stesso record.
In sostanza quando pigio sul bottom stampa mi viene stampato il report "Report1" e il "Report2", vorrei venisse stampato il PDF, senza doverlo aprire come ho spiegato prima.
Grazie

 Grazie
 
La sequensa è questa:
REPORT1 ---> (generi un PDF1) --- (Vuoi stampare il cartaceo PDF1)...?
REPORT2 ---> (generi un PDF2) --- (Vuoi stampare il cartaceo PDF2)...?
 
Ti ripeto... e ti chiedo... perchè vuoi complicarti la vita...?
Io ti suggerisco di fare questo:
REPORT1 ---> (generi un PDF1)
        --->  Stampi il Cartaceo da REPORT1 con OpenReport(Hidden)
 
REPORT2 ---> (generi un PDF2)
        --->  Stampi il Cartaceo da REPORT2 con OpenReport(Hidden)
 
 
Stampare il PDF è più complicato per NULLA...!
 
Cosa non capiamo(reciprocamente) di questa cosa...?
 
@Alex

Il giorno venerdì 5 ottobre 2018 12:04:37 UTC+2, 
verrengia.dino....@gmail.com
 ha scritto:

Ciao Alex e grazie per il tempo che mi dedichi.
Probabilmente non mi spiego bene.
cercherò di essere più chiaro:
Per ogni record ho due report associati che vengono stampati:
Report1 e Report2
Insieme a questi due oggetti devo stampare un documento esterno ad Access, salvato in un Folder. Questo documento esterno è una compilazione manuale che viene scansionata in formato PDF e deve essere associata ad un record specifico.
Ribadisco, non un report presente in Access è un doc esterno.
Sono "stato spiegato"??Ahahahaha.....
E come dicevo sopra sul pulsante che manda in stampa i due report vorrei inserire un'istruzione che mi stampasse il PDF salvato nel Folder.
Rigrazie per la pazienza

 Rigrazie per la pazienza
 
Adesso ho capito...
Allora nella risposta sopra, nel LINK che ti ho allegato, hai le indicazioni per stampare quel File.PDF di cui parli...
 
@Alex

 nel campo Folder viene ricostruito il path del file.
Ok Ale, provo e ti faccio sapere


Il giorno venerdì 5 ottobre 2018 12:04:37 UTC+2, 
verrengia.dino....@gmail.com
 ha scritto:

Ciao Ale,
sto provando ad applicare le dritte che mi hai postato ieri, ma ho delle difficoltà.
Ho provato ad inserire la prima soluzione del link con le apposite variazioni di path e nome file ma non funziona.
Mi da questa segnalazione : "Tipi definiti dall'utente e istruzioni Declare non ammessi come membri Public di modulo di oggetto.
probabilmente sarà una mia dimenticanza ma....
Altra cosa, ma dei due codici postati tu quale inseriresti???
Grazie in anticipo per la risposta.

Se hai incollato il codice nella maschera... è normale in quanto il modulo della maschera è un.modulo di classe quindi non a certa dichiarazioni API di tipo PUBLIC.
Quel codice invece lo puoi mettere in un modulo standard... allora va bene.
Fai attenzione che quel codice andrebbe aggiornato alla versione di Office... con la dichiarazipne PTRSAFE delle API.
 
#If VBA7 Then
    Public Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
        (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#Else
    Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
        (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#End If
 
Ciao
@Alex

Il giorno venerdì 5 ottobre 2018 12:04:37 UTC+2, 
verrengia.dino....@gmail.com
 ha scritto:

Grazie mille Ale, la versione del mio Office è la 2010, ma il programma verrà installato su un Office 365 2016.
Provo e ti faccio sapere.
Buon week....

Il giorno venerdì 5 ottobre 2018 12:04:37 UTC+2, 
verrengia.dino....@gmail.com
 ha scritto:

Ciao Ale, scusa il ritardo , ma ho avuto problemi di "logistica".
Ho inserito il codice che mi hai postato ma mi da questo errore :"Errore di compilazione non valido all'esterno di una routine.
Sto sicuramente facendo un errore di fondo (forse è ora di andare in pensione)
ma non ne esco.
il codice che ti sto postando l'ho inserito in un modulo normale.
Porta pazienza e dimmi gentilmente dove sbaglio e cosa devo mettere nel modulo normale che ho chiamato "StampaDF" e cosa devo mettere nel modulo di classe cioè nella maschera in questione.
Ti ricordo che nel form ho creato un pulsante di comando dove sull'evento click  richiamo la funzione "PrintThisDoc". Il codice è questo :
If VBA7 Then
    Public Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
        (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Else
    Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
        (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
End If
 
 
 
 
Public Function PrintThisDoc(Formname As Long, FileName As String)
On Error Resume Next
Dim X As Long
X = ShellExecute(Formname, "Print", FileName, 0&, 0&, 3)
End Function
 
Sub testPrint()
Dim printThis
Dim strDir As String
Dim strFile As String
 
strDir = "C:\Prescrizioni\"
strFile = “Me. NomePrescrizione”
 
printThis = PrintThisDoc(0, strDir & strFile)
 
Aspetto un tuo gentile riscontro in merito e scusa per il sicuro errore "di fondo" nella mia gestione che non trovo.
 

Purtroppo questo accade in quanto non hai le idee chiare su quanto suggerito e purtroppo il COPIA/INCOLLA non funziona quasi mai... e tu commetti anche diversi ERRORI.
 
La dichiarazione API va gestita in Formattazione condizionale, io nel mio suggerimento avevo messo il Carattere [#] che tu hai rimosso... il motivo ora lo spiegherai tu...!!!!
 
Quindi questo codice che ti risuggerisco funziona, mettilo in un Modulo e ti basta chiamare :
 
Sub testPrint()
   Dim printThis As Long
   Dim strFile As String
 
   strFile = "C:\Prescrizioni\" & Me. NomePrescrizione
 
   printThis = PrintThisDoc(0, strFile) 
   If printThis <=32 then
     Msgbox "ERROR PRINT"
   End if
End Sub
 
 
Codice da mettere nel MODULO:
 
Option Compare Database
Option Explicit
 
#If VBA7 Then
    Public Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
        (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#Else
    Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
        (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#End If
 
Public Function PrintThisDoc(FileName As String) as Long
    On Error Resume Next
    PrintThisDoc = ShellExecute(0, "Print", FileName, 0&, 0&, 3)
End Function
 
La funzione [PrintThisDoc] che tu asegni alla Variabile [printThis] restituisce un valore... ha senso assegnare la chiamata solo se di quel valore restituito ci fai qualcosa altrimenti è tempo e memoria persa...!
 
Come indicato in questo Articolo, se la chiamata ha successo il valore deve essere >32, ovviamente puoi scendere nel dettaglio dell'errore identificando il valore restituito con gli Error Code relativi:
 
https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-shellexecutea
 
 
@Alex

Il giorno venerdì 5 ottobre 2018 12:04:37 UTC+2, 
verrengia.dino....@gmail.com
 ha scritto:

Grazie Ale per la risposta esaustiva.
Non ti dico perché ho tolto i diesis altrimenti mi "scomunichi.
Ho inserito il codice che mi hai postato in un modulo normale che ho chiamato PrintThisDoc, poi il codice con la routine testPrint l'ho inserito in un pulsante di comando e quando ho lanciato l'evento mi ha dato il seguente errore :
"Errore di compilazione, prevista variabile o routine e non modulo", andandomi a selezionare nella routine PrinThisDoc..
A questo punto ho preso la routine testPrint e l'ho inserita nel modulo di classe, cioè nel form in questione, mentre nel pulsante ho inserito:
Call PrinThisDoc.
Il buon Access però mi ha dato lo stesso errore.
So che se mi guidi ancora un po' arrivo alla conclusione, anche se sto facendo tantissima confusione.
Grazie per la "certosina" pazienza.

 Grazie per la "certosina" pazienza.
 
@Alex

Il giorno venerdì 5 ottobre 2018 12:04:37 UTC+2, 
verrengia.dino....@gmail.com
 ha scritto:

Ciao Alex grazie per la risposta e per la pazienza che ti sto facendo perdere.
Ho fatto come mi hai detto:
Nel modulo ho inserito il codice con le dichiarazioni API e la funzione PrinThisDoc, mentre nel form la Sub testPrint e nel pulsante nell'evento click ho inserito call testPrint() L'errore che esce adesso è "Errore di compilazione Numero errato di argomenti o assegnazione di proprietà non valida".
Da cosa può dipendere?? Non essere scurrile nella risposta.Ahaha...
Grazie