Stampa file su stampante diversa dalla predefinita

di il
23 risposte

Stampa file su stampante diversa dalla predefinita

Ciao, ho questo codice e non riesco a stampare su una stampante che sia diversa dalla predefinita (il file viene sempre stampato sulla stampante predefinita)

Dim strDefaultPrinter As String

'prendi nota della stampante predefinita
strDefaultPrinter = Application.Printer.DeviceName

' cambia la stampante
Set Application.Printer = Application.Printers("\\DTC01\TA261ci_COMMERCIALE")

'stampa il file
ShellDocument "C:\Users\marco\Desktop\a.pdf", "Print", , , START_HIDDEN

'ritorna sulla stampante predefinita
Set Application.Printer = Application.Printers(strDefaultPrinter)
dove sbaglio?


questo il codice nel modulo
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)
Public Enum StartWindowState
START_HIDDEN = 0
START_NORMAL = 4
START_MINIMIZED = 2
START_MAXIMIZED = 3
End Enum

Public Function ShellDocument(sDocName As String, _
Optional ByVal Action As String = "Open", _
Optional ByVal Parameters As String = vbNullString, _
Optional ByVal Directory As String = vbNullString, _
Optional ByVal WindowState As StartWindowState) As Boolean
Dim Response
Response = ShellExecute(&O0, Action, sDocName, Parameters, Directory, WindowState)
Select Case Response
Case Is < 33
ShellDocument = False
Case Else
ShellDocument = True
End Select
End Function

23 Risposte

  • Re: Stampa file su stampante diversa dalla predefinita

    Beh non sbagli. Hai compreso cosa fa esattamente quel frammento di programma?
  • Re: Stampa file su stampante diversa dalla predefinita

    Si (o almeno penso)
    prendo la stampante predefinita
    cambio stampante predefinita
    stampo il file ---> se c'è qualche errore non stampa
    rimetto la stampante predefinita vecchia
  • Re: Stampa file su stampante diversa dalla predefinita

    ocrot ha scritto:


    ...
    cambio stampante predefinita
    ...
    Ma non lo puoi fare con il modello ad oggetti di Access perché quella funzione di stampa non ha nulla a che vedere con Access, cioè detto in altro modo non stai lanciano una stampa di un report (o stampando un foglio di calcolo se stessi usando Excel o un documento di Word da Word, il concetto è lo stesso).
    Devi agire a livello di "sistema operativo" (mi esprimo così per rendere l'idea che devi "uscire da Access" )
    In giro ho trovato un po' di codici che mettono mano alla stampante predefinita.
    Metto alcuni link ma ti dico fin d'ora che non ho mai provato quelle strade (non ne ho mai avuto il bisogno) e non ne garantisco la bontà o meglio ancora che siano la via più sicura.
    https://www.mrexcel.com/forum/excel-questions/1026854-set-windows-default-printer-vba-alternative-solutions-welcomed-post4928264.html#post4928264
    https://myengineeringworld.net/2018/07/get-set-default-printer-vba.html
    (non farti trarre in inganno dal fatto che gira dentro Excel, è lo stesso discorso di prima, te ne accordi dal fatto che ci sono righe molto diverse da solito)
  • Re: Stampa file su stampante diversa dalla predefinita

    ocrot ha scritto:


    Si (o almeno penso)
    prendo la stampante predefinita
    cambio stampante predefinita
    stampo il file ---> se c'è qualche errore non stampa
    rimetto la stampante predefinita vecchia
    Secondo me non hai capito invece...!
    Stai modificando la DefaultPrinter di Access come Application... poi stampi dal S.O. che invece ha la sua stampante come Default che non c'entra nulla con quella di Access...!
    Quindi se devi stampare da S.O. su una Stampante predefinita diversa dalla DEFAULT ti suggerisco di usare WSH per cambiarla/ripristinarla:
    
    CreateObject("WScript.Network").SetDefaultPrinter "NomeStampante"
    Immagino sia una cosa Temporanea, quindi prima LEGGI la [GetDefaultPrinter] memorizzi, la cambi, stampi e ripristini... in modo SINCRONO... se possibile...

    P.S. scusa Phil... non avevo letto tutto...
  • Re: Stampa file su stampante diversa dalla predefinita

    Perfetto, grazie!

    devo solo mettere un timer o qualcosa per attendere qualche secondo
    
    CreateObject("WScript.Network").SetDefaultPrinter "\\DTC01\TA261ci_COMMERCIALE"
    ShellDocument "C:\Users\marco\Desktop\a.pdf", "Print", , , START_HIDDEN
    MsgBox ("sTAMPATO")
    CreateObject("WScript.Network").SetDefaultPrinter "\\DTC01\TA261ci_MAGAZZINO"
    la stampa viene stampata su magazzino,
    quindi va talmente veloce che riporta già la predefinita sulla stampante magazzino prima che proceda con la stampa

    ho verificato questo se metto un punto di interruzione sulla msgbox è tutto ok

    cosa mi consigliate? timer o altro?
  • Re: Stampa file su stampante diversa dalla predefinita

    Probabilmente ci sara un argomento che invece di fare stampa immediata(start_hidden) farà anteprima di stampa...

    ps: in genere i problemi legati alla velocita di esecuzione sono esattamente quelli opposti alla TROPPA VELOCITA:D ahahhaha (solo per ridere)
  • Re: Stampa file su stampante diversa dalla predefinita

    ocrot ha scritto:


    Perfetto, grazie!

    devo solo mettere un timer o qualcosa per attendere qualche secondo
    
    CreateObject("WScript.Network").SetDefaultPrinter "\\DTC01\TA261ci_COMMERCIALE"
    ShellDocument "C:\Users\marco\Desktop\a.pdf", "Print", , , START_HIDDEN
    MsgBox ("sTAMPATO")
    CreateObject("WScript.Network").SetDefaultPrinter "\\DTC01\TA261ci_MAGAZZINO"
    la stampa viene stampata su magazzino,
    quindi va talmente veloce che riporta già la predefinita sulla stampante magazzino prima che proceda con la stampa

    ho verificato questo se metto un punto di interruzione sulla msgbox è tutto ok

    cosa mi consigliate? timer o altro?
    Ci sono vari modi..., tipo quello di aprire un Processo con API(OpenProcess) ed attenderne l'esecuzione tramite API(WaitForSingleObject)...
    Quì trovi qualche spunto ma devi mettercidel tuo e non so se sia intuitivo.

    Alternativa molto meno tecnica, anzi proprio non bellissima ma funzionale è questa:
    
    #If VBA7 Then  
        Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) 'For 64 Bit Systems  
    #Else  
        Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds as Long) 'For 32 Bit Systems  
    #End If  
    
    Sleep 1000 'ritardo in Millosecondi quindi 1s
  • Re: Stampa file su stampante diversa dalla predefinita

    CicciusPrime ha scritto:


    Probabilmente ci sara un argomento che invece di fare stampa immediata(start_hidden) farà anteprima di stampa...
    Hai guardato la GUIDA...?
    Probabilmente no...
  • Re: Stampa file su stampante diversa dalla predefinita


    Ci sono vari modi..., tipo quello di aprire un Processo con API(OpenProcess) ed attenderne l'esecuzione tramite API(WaitForSingleObject)...
    Quì trovi qualche spunto ma devi mettercidel tuo e non so se sia intuitivo.
    ci penso su, la prima cosa che mi viene in mente è se la stampante è esistente ed è ok
    ma anche accesa, qualcuno ha qualche idea su questo?

    non vorrei che non finisca lo spooling e non mi esca dal wait for
  • Re: Stampa file su stampante diversa dalla predefinita

    @Alex ha scritto:


    CicciusPrime ha scritto:


    Probabilmente ci sara un argomento che invece di fare stampa immediata(start_hidden) farà anteprima di stampa...
    Hai guardato la GUIDA...?
    Probabilmente no...
    Assolutamente no...

    cercavo solo di intuire una possibilità
  • Re: Stampa file su stampante diversa dalla predefinita

    ocrot ha scritto:



    Ci sono vari modi..., tipo quello di aprire un Processo con API(OpenProcess) ed attenderne l'esecuzione tramite API(WaitForSingleObject)...
    Quì trovi qualche spunto ma devi mettercidel tuo e non so se sia intuitivo.
    ci penso su, la prima cosa che mi viene in mente è se la stampante è esistente ed è ok
    ma anche accesa, qualcuno ha qualche idea su questo?

    non vorrei che non finisca lo spooling e non mi esca dal wait for
    Ma prima devi fare un PING alla stampante... ovviamente... cosa fai lanci nel vuoto...?
    Se la stampante di rete risponde, allora stampi.
  • Re: Stampa file su stampante diversa dalla predefinita

    CicciusPrime ha scritto:


    Assolutamente no...
    cercavo solo di intuire una possibilità
    Intuire...?
    E' un nuovo sistema di valutazione tecnica...?
    Suggerisco di maturarne la funzionalità in solitudine non condividerlo nel Forum è un peccato.
    Ci sono le GUIDE TECNICHE in rete, non ci si affida al caso soprattutto se si da un suggerimento.
  • Re: Stampa file su stampante diversa dalla predefinita

    @Alex ha scritto:


    ocrot ha scritto:



    Ci sono vari modi..., tipo quello di aprire un Processo con API(OpenProcess) ed attenderne l'esecuzione tramite API(WaitForSingleObject)...
    Quì trovi qualche spunto ma devi mettercidel tuo e non so se sia intuitivo.
    ci penso su, la prima cosa che mi viene in mente è se la stampante è esistente ed è ok
    ma anche accesa, qualcuno ha qualche idea su questo?

    non vorrei che non finisca lo spooling e non mi esca dal wait for
    Ma prima devi fare un PING alla stampante... ovviamente... cosa fai lanci nel vuoto...?
    Se la stampante di rete risponde, allora stampi.
    Grazie,
    poniamo che sia una stampante locale collegata alla porta usb?

    oppure una stampante di rete wireless con un ip dinamico?
    cosa suggeriresti?
  • Re: Stampa file su stampante diversa dalla predefinita

    Se hai il NOME, andrai a Pingare con l'HOSTNAME...
    Se è collegata sulla USB è sempre necessario avere il suo Driver installato, quindi appare tra i dispositivi PRINTER, testabili via API.
    Quando installi un Driver, puoi accedere tramite le DLL di winspool, ed ottenere i dati della singola Stampante, incluso il suo Handle, con il quale la puoi verificare...!
    Sicuro di volerti infilare in questo BUCO...?

    Usare le API è assai complesso e te lo sconsiglio, serve veramente una conoscenza non base.

    Potresti provare però ad usare l'Oggetto PRINTER di Access, isanziando appunto un Oggetto sulla Stampante di cui parli, che ovviamente ha un PrinterName che deve essere sempre quello, e gestisci l'Errore conseguente.
    Se non hai ERRORE la stampante teoricamente è accessibile...
    
    Dim prtDefault As Printer 
    ' Se la stampante non è raqggiungibile quì dovrebbe generare ERRORE...
    Set prtDefault =Application.Printers("nomeDellaStampante") 
     
    With prtDefault 
     MsgBox "Device name: " & .DeviceName & vbCr _ 
     & "Driver name: " & .DriverName & vbCr _ 
     & "Port: " & .Port 
    End With  
    Credo, ma non ne sono certo... possa funzionare...
Devi accedere o registrarti per scrivere nel forum
23 risposte