Gestione stampe con VBA



  • Gestione stampe con VBA
    di Thomas (utente non iscritto) data: 02/07/2016 11:18:59

    Buongiorno,
    ho una richiesta particolare da fare. C'è un modo per lanciare con un'unica sessione di stampa due Range presenti su due fogli diversi di un file Excel?
    Mi spiego meglio: per esempio voglio stampare il range A1:L40 del foglio1 e il range A2:M50 del foglio2, il tutto utilizzando un solo printout (devo gestire una stampa fronte retro, utilizzando 2 istruzioni printout mi stamperebbe su due fogli diversi).
    Nel caso di range nello stesso foglio excel si riesce a fare ciò con la funzione "union", ma in fogli diversi non funziona.
    E' fattibile in qualche modo?
    Escludo chiaramente la soluzione del copia-incolla dei due range su un unico foglio
    Grazie



  • di Vecchio Frac data: 02/07/2016 12:07:00

    cit. "Escludo chiaramente la soluzione del copia-incolla dei due range su un unico foglio "
    ---> Perché? sarebbe la soluzione più semplice, indolore e in fin dei conti anche la più gestibile.
    Generi un foglio, imposti un riferimento a tale foglio, ci copi i range, stampi, elimini il foglio e sei a posto. Se disabiliti il refresh dello schermo neanche te ne accorgi.





  • di tho1984 data: 02/07/2016 13:33:46

    Ho escluso tale soluzione perchè sono fogli con formattazione diversa, per esempio la colonna A nel foglio1 ha una larghezza di 20 mentre nel foglio2 ha una larghezza di 30 e quindi non sono compatibili



  • di Vecchio Frac data: 02/07/2016 13:40:42

    Quindi devi conservare anche la formattazione originale.
    Non so perchè ma le cose vengono sempre fuori dopo, a tirarle con le tenaglie :)





  • di Vecchio Frac data: 02/07/2016 13:50:15

    Ti propongo l'idea che segue. Potrebbe anche funzionare.
    Magari ci vogliono degli aggiustamenti.
    In pratica creo un file pdf e lo lancio (forse si deve preimpostare la stampante predefinita sulla funzione fronte retro), poi lo elimino.
    Per test invece che "print" scrivi "open" così lo apri solamente (poi non so se si incavola perchè glielo killi da sotto i piedi, fai delle prove).
     
    Option Explicit
    
    Const SW_SHOW = 1
    Const SW_SHOWMAXIMIZED = 3
    
    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
    
    Sub test()
    Dim RetVal As Long
      
      ThisWorkbook.ExportAsFixedFormat xlTypePDF, "c:windows	emppippo.pdf"
      
      On Error Resume Next
      RetVal = ShellExecute(0, "print", "c:windows	emppippo.pdf", "", "", SW_SHOWMAXIMIZED)
      Kill "c:windows	emppippo.pdf"
    End Sub






  • di scossa data: 02/07/2016 14:06:20

    cit.: "Ho escluso tale soluzione perchè sono fogli con formattazione diversa, per esempio la colonna A nel foglio1 ha una larghezza di 20 mentre nel foglio2 ha una larghezza di 30 e quindi non sono compatibili"

    Ciao a tutti,

    un'alternativa semplice semplice (copio i due range e li incollo come "immagine") nel codice sotto.



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee.
    (George Bernard Shaw)


     
    Sub StamapImg()
      Dim wsTo As Worksheet
      Dim rngTo As Range
      Dim rngFrom As Range
      
      Set wsTo = ThisWorkbook.Worksheets.Add
      With wsTo
        .Range("A2").Select '<- o dove preferisci
        Set rngFrom = Worksheets("Foglio1").Range("A5:D20") '<- il range da stampare
        rngFrom.Copy
        .Pictures.Paste
        Set rngFrom = Worksheets("Foglio2").Range("A5:D20") '<- l'altro range da stampare
        .Range("A55").Select '<- o dove serve per andare sulla pagina successiva
        rngFrom.Copy
        .Pictures.Paste
        Application.CutCopyMode = False
        .PrintOut
        Application.DisplayAlerts = False
        wsTo.Delete
        Application.DisplayAlerts = True
      End With
      Set rngFrom = Nothing
      Set rngTo = Nothing
      Set wsTo = Nothing
      
    End Sub
    



  • di Vecchio Frac data: 02/07/2016 14:35:37

    Ciao scossa!
    ottima idea.





  • di scossa data: 04/07/2016 15:27:14

    Ciao Francesco,

    al solito: ce la contiamo e ce la diciamo, ma l'OP latita, tanto per cambiare.



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee.
    (George Bernard Shaw)



  • di Vecchio Frac data: 04/07/2016 16:48:39

    Allora vediamo il bicchiere mezzo pieno:
    - è luglio, sarà in ferie, beato lui :)
    - la tua risposta è stata utile a me, che ho allargato l'orizzonte e scoperto un escamotage molto intelligente (il famoso pensiero laterale!)
    - le nostre risposte saranno utili ad altri che cercheranno e troveranno questa discussione!
    - è stata l'occasione per salutarsi dopo tanto tempo ;)





  • di scossa data: 04/07/2016 20:44:41

    Ciao Francesco,

    effettivamente condivido tutti i mezzi bicchieri


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee.
    (George Bernard Shaw)




  • di tho1984 data: 04/07/2016 20:59:10

    Grazie per i suggerimenti.
    Comunque la mia idea sarebbe stata quella di creare tramite codice un oggetto "PagineDaStampare". A questo oggetto si andrebbe ad aggiungere le pagine da stampare (nel mio caso particolare solamente degli specifici range) e quindi lanciare l'ipotetica funzione PagineDaStampare.printout che mi stampi le pagine associate all'oggetto.
    Secondo voi è fattibile? Con le mie competenze no...ho provato a vedere in rete se esista qualcosa del genere ma non ho trovato niente



  • di Vecchio Frac data: 04/07/2016 21:03:08

    L'idea di scossa ti risolve tutti i problemi.
    Se devi solo stampare on demand, generi delle immagini su un foglio a parte che mandi in stampa e poi elimini.
    Se devi conservare pro futuro i range che stai stampando, generi delle immagini su un foglio a parte che esporti in pdf e poi elimini.
    Se devi mettere insieme più range da stampare, generi delle immagini con questo metodo e poi ci fai quello che ti serve.
    Semplice ed efficace.





  • di scossa data: 04/07/2016 23:05:42

    Se poi il foglio da stampare è sempre quella (la struttura dei due range con i valori aggiornati), può evitare di eliminare il foglio ed usare

    .Pictures.Paste Link:=True
    


    al posto di
    .Pictures.Paste
    



    in questo modo l'immagine rifletterà, real-time, i valori assunti dai range originali.


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)




  • di scossa data: 04/07/2016 23:07:29

    P.S.: e quindi ovviamente non serve nemmeno più lanciare la macro, basta selezionare il foglio con le immagini e stamparlo.

    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee.
    (George Bernard Shaw)