Stampa avanzata personalizzata

Visual Basic for Applications
  • Stampa avanzata personalizzata di lucaferrolf data: 09/01/2013 08:54:24

    Buongiorno a tutti, sono un novellino in ambiente xls, volevo chiedere a voi esperti come poter e se possibile, stampare da un unico file con due fogli all'interno:

    foglio 1 su stampante a e foglio 2 su stampante b.

    quindi poter stampare con un unic tasto il foglio uno su una stampante e il foglio 2 su di un'altra.

    Grazie.
  • di HarryBosch data: 09/01/2013 11:41:53

    Potresti utilizzare un codice come l'esempio che ti scrivo sotto; le variabili potresti anche ometterle assegnando direttamente il nome della stampante.

    Per conoscere esattamente il nome delle stampanti utilizza il registratore di macro: attivi la registrazione, ti porti in stampa e selezioni le stampanti che ti interessano.
    Chiudi la registrazione e riporta i nomi nella sub sotto.
     
    Sub Stampa()
    Dim St1 As String, St2 As String
    
    St1 = "PDF24 PDF su Ne00:"
    St2 = "HP Deskjet 3000 J310 series su Ne04:"
        
        Application.ActivePrinter = St1
        'stampa da foglio1 a foglio1, una copia
        ActiveWindow.SelectedSheets.PrintOut From:=1, To:=1, Copies:=1, Collate:=True
        
        Application.ActivePrinter = St2
         'stampa da foglio2 a foglio2, una copia
        ActiveWindow.SelectedSheets.PrintOut From:=2, To:=2, Copies:=1, Collate:=True
    End Sub
  • di HarryBosch data: 09/01/2013 15:25:33

    Scusami, mi sono accorto che ho scritto un cosa diversa che quella che volevi.
    Il codice sotto fa quello che chiedi.

    Le istruzioni "From", "To" servono a dire quali pagine di un Foglio intendi stampare. Quindi, se il foglio1 si compone di più pagine potresti stampare soltanto un intervallo, oppure tutte omettendo queste istruzioni.
     
    Sub Stampa()
    Dim St1 As String, St2 As String
    
    St1 = "PDF24 PDF su Ne00:"
    St2 = "HP Deskjet 3000 J310 series su Ne04:"
        
        Application.ActivePrinter = St1
        Sheets("Foglio1").Activate
        'stampa tutte le pagine del foglio1, una copia
        ActiveWindow.SelectedSheets.PrintOut , Copies:=1, Collate:=True
    
        Application.ActivePrinter = St2
        Sheets("Foglio2").Activate
         'stampa tutte le pagine del foglio2, una copia
        ActiveWindow.SelectedSheets.PrintOut , Copies:=1, Collate:=True
    End Sub
    
  • di lucaferrolf data: 10/01/2013 09:05:29

    Per poter effettuare anche una selezione di stampa e ottimizzarla su A4 ??
    - foglio 1 - selezione di stampa (sempre la stessa B3-E49) ottimizzata su A4 orizzontale, su stampante 1.
    - foglio 2 - selezione di stampa (sempre la stessa C2-E84) ottimizzata su A4 verticale, su stampante 2.

    Grazie
  • di Vecchio Frac data: 10/01/2013 15:03:34

    Hai provato a utilizzare il registratore di macro per selezionare un range, dare il comando di stampa (ti basta solo l'anteprima), impostando i parametri necessari? analizza il codice ottenuto e adattalo al tuo contesto.
  • di HarryBosch data: 10/01/2013 15:10:15

    Vedi il codice sotto.
    Se imposti il registratore di macro ed esegui tutte le impostazioni del foglio e della stampante, scoprirai come adattare (abbastanza facilmente) tutte le impostazioni che fanno al caso tuo, come possono essere le aree di stampa, i margini, e tutto il resto.

    Dopo l'attivazione del foglio, utilizzi tali caratteristiche e quindi mandi in stampa prima di passare al foglio successivo.
     
    Sub Stampa()
    Dim St1 As String, St2 As String
    
    St1 = "PDF24 PDF su Ne00:"
    St2 = "HP Deskjet 3000 J310 series su Ne04:"
        
        Application.ActivePrinter = St1
        Sheets("Foglio1").Activate
        ActiveSheet.PageSetup.PrintArea = "$B$3:$E$49"
        With ActiveSheet.PageSetup
             'orientamento orizzontale
            .Orientation = xlLandscape
            .PaperSize = xlPaperA4
        End With
        ActiveWindow.SelectedSheets.PrintOut , Copies:=1, Collate:=True
    
        Application.ActivePrinter = St2
        Sheets("Foglio2").Activate
        ActiveSheet.PageSetup.PrintArea = "$C$2:$E$84"
        With ActiveSheet.PageSetup
            'orientamento verticale
            .Orientation = xlPortrait
            .PaperSize = xlPaperA4
        End With
        ActiveWindow.SelectedSheets.PrintOut , Copies:=1, Collate:=True
    End Sub
  • di HarryBosch data: 10/01/2013 15:11:59

    Ecco! VecchioFrac ti ha dato giusto lo stesso consiglio.
    Anche perché (credo) non è umano conoscere tutte le proprietà di ogni oggetto.
    Ma il registratore in questi casi è molto utile ^_^
  • di lucaferrolf data: 10/01/2013 15:21:12

    GRAZIE MILLE, PROVO E TI FACCIO SAPERE.
  • di lucaferrolf data: 10/01/2013 15:37:00

    con il registratore macro non riesco a trovare i due valori:

    St1 = "PDF24 PDF su Ne00:"
    St2 = "HP Deskjet 3000 J310 series su Ne04:"

    sono stampanti non di rete ma condivise.
  • di HarryBosch data: 10/01/2013 16:05:44

    Quando stampi il foglio, apri la finestra di stampa, giusto?
    La prima voce "Nome" ti mostra una casella di ricerca, dove puoi selezionare una delle stampanti disponibili per il pc.
    Dopo aver attivato il registratore, devi seguire questo percorso, selezionare la stampante (condivisa) dall'elenco a discesa, e quindi annullare.
    Che codice ottieni?
  • di lucaferrolf (utente non iscritto) data: 10/01/2013 16:41:27

    ci sono riuscito, grazie, ma mi un orrore sul secondo passaggio.

    Application.ActivePrinter = St2

    probabilmente dato dal valore activeprinter che prende quella impostata come predefinita e poi non mi prende la selezione di stampa ma mi stampa piu pagine con tutti gli elementi.

  • di lucaferrolf data: 10/01/2013 17:20:11

    per quanto riguarda la selezione ho risolto in questo modo:

    ActiveWindow.SelectedSheets.PrintOut , Copies:=1, Collate:=True, IgnorePrintAreas:=False
  • di HarryBosch data: 10/01/2013 20:51:25

    In realtà quell'aggiunta non modifica nulla nella routine: l'area di stampa non viene ignorata e quindi rimane quella impostata nelle righe precedenti.

    Se l'errore ti esce sul rigo
    Application.ActivePrinter = St2
    significa che non hai riportato bene il nome della stampante.
    Ti esce un errore perché l'applicazione non riesce a riconoscere la stampante che hai indicato:
    "Metodo ActivePrinter dell'oggetto Applilcation non riuscito"

    Prova a controllare bene il nome di quella stampante dalla registrazione.
  • di lucaferrolf data: 14/01/2013 17:03:35

    CONTINUA A NON PRENDERE LA SELEZIONE DI STAMPA...UN AIUTINO ?!?

    GRAZIE.
     
    Sub Stampa()
    Dim St1 As String, St2 As String
    
    St1 = "HP LaserJet Professional P1102 su Ne03:"
    St2 = "HP LaserJet Professional P1102 su Ne03:"
        
        Application.ActivePrinter = St1
        Sheets("COMMERCIALE").Activate
        ActiveSheet.PageSetup.PrintArea = "$B$3:$E$49"
        With ActiveSheet.PageSetup
             'orientamento orizzontale
            .Orientation = xlLandscape
            .PaperSize = xlPaperA4
        End With
        ActiveWindow.SelectedSheets.PrintOut , Copies:=1, Collate:=True, IgnorePrintAreas:=False
    
        Application.ActivePrinter = St2
        Sheets("PRODUZIONE").Activate
        ActiveSheet.PageSetup.PrintArea = "$C$2:$E$94"
        With ActiveSheet.PageSetup
            'orientamento verticale
            .Orientation = xlPortrait
            .PaperSize = xlPaperA4
        End With
        ActiveWindow.SelectedSheets.PrintOut , Copies:=1, Collate:=True, IgnorePrintAreas:=False
    End Sub
    
  • di HarryBosch (utente non iscritto) data: 15/01/2013 01:03:53

    Cosa non ti torna esattamente? I margini di stampa o proprio non riesce a stampare il secondo foglio?
    L'ho inserita nel tuo file e da me funziona se non per il fatto che i margini in entrambe le stampe sono troppo stretti. Dovresti sistemare anche quelli altrimenti quella che potrebbe essere una sola pagina, diventa anche due o quattro o più.

    Vedi il file dove ho adattato tali margini: ora le due aree di stampa vengono stampate su un'unico foglio A4, orizzontale e verticale (con un sacrificio in termini di dimensioni, visto che ho ridotto la proporzione delle pagine)
  • di lucaferrolf data: 15/01/2013 07:55:55

    non capisco perchè ma alcune volte funziona altre no, ti chiedo un'altra cosa.... se io sostituisco il nome della prima stampante con una pdfcreator o altro, riesco ad impostargli da cella il nome file da salvare ?!?

    Grazie.
  • di HarryBosch data: 15/01/2013 15:54:24

    Con tutti gli applicativi Office, a partire dalle versioni 2007, puoi creare direttamente un pdf senza la necessità di nessuna stampante virtuale.
    Prova il codice qua sotto, che fa esattamente la seconda parte del codice precedente.
    Puoi impostare il percorso di salvataggio e il nome del file (che può anche essere preso da una cella del foglio ovviamente; alla variabile "nome" basta indicare il riferimento sul foglio stesso).
     
    Sub crea_pdf()
        Dim percorso As String
        Dim nome As String
        'indica il percorso di salvataggio
        percorso = "C:UsersVanniDesktop"
        'assegna il nome che vuoi
        nome = "Stampa di prova"
    
        Sheets("PRODUZIONE").PageSetup.PrintArea = "$C$2:$E$94"
        With ActiveSheet.PageSetup
            .Orientation = xlPortrait
            .PaperSize = xlPaperA4
            .Zoom = 70
        End With
        ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
             Filename:=percorso & "" & nome & ".pdf", From:=1, To:=1, _
             OpenAfterPublish:=False 'imposta a True per aprire il pdf al termine
    End Sub