Stampare con Excel (vba).      (17/06/03)

L'utilizzo di Excel come programma per stampare si rivela facile e molto versatile, e attraverso istruzioni in codice possiamo pilotare tutto il processo di stampa, dall'impaginazione, alla regolazione dei margini, dal formato di stampa all'orientamento (verticale oppure orizzontale), e molti altri parametri; compreso la possibilità di inserire intestazioni di pagina o piè di pagina; basta dare un occhiata alla guida in linea a tutti gli argomenti legati alla stampa (nella guida digitate la parola Print e poi selezionate uno ad uno tutti gli argomenti correlati). Sembra però che molti "pellegrini" si trovino un "pò" in difficoltà quando debbano accedere alla guida in linea, ed allora provo ad illustrare per sommi capi alcune procedure da affrontare. Indicazioni le trovate comunque anche in questa sezione, articolo "Estrarre i dati e stampare".

L'istruzione più veloce e semplice da capire, è (questo esempio stampa il foglio attivo) :

ActiveSheet.PrintOut

L'istruzione sfrutta il metodo PrintOut, che è ricco di argomenti che diversificano molte opzioni di stampa, ma che non presento in questo esercizio (rimando gli interessati alla guida in linea cercando l'argomento "Metodo PrintOut").

Imposterò una routine che copra diverse esigenze, prendendo come spunto la necessità di stampare elenchi anche lunghi (su più pagine) con l'utilizzo di una "intestazione di pagina", che verrà stampata in automatico su ogni foglio successivo e fino alla fine dell'elenco.

La prima cosa che ci serve, è definire l'"Area di stampa", cioè la zona che vogliamo vada in stampa. Operazione secondo me necessaria visto che l'istruzione vista sopra stamperebbe tutto ciò che il foglio di lavoro contiene, anche dati che si trovassero in celle o zone che invece non interessano la stampa. Premesso che la zona che Excel prevede come pagina in formato A4 copre dalla colonna A alla I compresa, e giù fino alla riga 54 (con le impostazioni standard di larghezza colonne e altezza righe), potremo usare diversi metodi per identificare l'area:

  • Usare i riferimenti alle celle (es.: Range("A1:I54") )

  • Se il foglio di lavoro contiene solo un elenco dati, anche lungo e su più colonne (fino alla I), senza altre celle occupate al di fuori dell'area che andrà in stampa, potremo avvalerci dell' "UsedRange" che comprenderà tutta l'area coperta da dati e quindi tutto l'elenco. (es.: ActiveSheet.UsedRange ).

  • O ancora fare ricorso alla proprietà End applicata all'oggetto Range, che posta una cella iniziale, trova l'ultima cella occupata, seguendo la direzione impostata dalla costante assegnata ad End (xlDown, xlUp, xlToRight, xlToLeft). Dovremo solo avere l'accortezza di usare End con la colonna di cui siamo certi esistano dati fino alla fine, senza celle vuote, altrimenti la selezione si fermerebbe alla prima cella vuota. Es. con End impostata sulla colonna A :
    ActiveSheet.Range(Cells(1, 1).End(xlDown), Cells(1, 9))

Ma vediamo la routine da usare per stampare, con in verde i commenti e le spiegazioni. Ricordo che le righe precedute dall'apice (apostrofo) NON vengono lette, ma considerate "commenti" e potranno essere tolte:

Sub miastampa()

'le tre istruzioni sotto per mostrare i tre tipi di selezione di area, la seconda (con 'UsedRange) è quella attiva in quest'esempio
'Set zona = ActiveSheet.Range("$A$1:$I$54")
Set zona = ActiveSheet.UsedRange
'impostiamo con la variabile "zona" tutta l'area dati
'Set zona = ActiveSheet.Range(Cells(1, 1), Cells(1, 9).End(xlDown))

'poichè come PrintArea dobbiamo fornire i riferimenti alle celle che comprendono l'area 'di "zona", e quindi gli indirizzi (Address), non i valori, usiamo "zona.Address")
ActiveSheet.PageSetup.PrintArea = zona.Address
With ActiveSheet.PageSetup 
'adesso si impostano le proprietà di PageSetup

'le tre righe con Header (Left, Center, Right) si riferiscono alle tre zone dell'intestazione di 'pagina, in cui potremo scrivere ciò che vorremo, il nome e indirizzo di una ditta, una 'frase, o altro; nell'esempio uso solo la parte centrale (CenterHeader), e tra doppi apici, 'ciò che apparirà in alto sul foglio stampato:
.LeftHeader = ""
.CenterHeader = "PIPPO DAMMI LA MELA"
.RightHeader = ""

'le tre righe sotto riguardano il "piè di pagina". Se non vogliamo usarlo, basterà non 'scrivere niente tra i doppi apici
.LeftFooter = ""
.CenterFooter = "DAMMI LA MELA PIPPO"
.RightFooter = ""
.PrintHeadings = False
'intestazioni di riga e colonna: con False non vengono stampate
.PrintGridlines = False
'griglia: con false non viene stampata
.PrintComments = xlPrintNoComments
'commenti: non vengono stampati
.PrintQuality = 360  
'il valore 360 imposta la qualità di stampa
.CenterHorizontally = False
'centraggio orizzontale: con False viene lasciato l'allineamento 'tradizionale a sinistra nella pagina
.CenterVertically = False
'centraggio verticale.idem come sopra
.Orientation = xlPortrait
'così stampa in verticale e con  xlLandScape = orizzontale
.Draft = False
'per stampare anche i grafici: con false non li stampa
.PaperSize = xlPaperA4
'si imposta formato foglio A4
.FirstPageNumber = xlAutomatic
'numerazione automatica delle pagine
.Order = xlDownThenOver
'imposta l'ordine automatico utilizzato per numerare le pagine
.BlackAndWhite = False
'impostata a False per consentire la stampa di event. font 'colorati. Impostata a True stamperebbe tutto in bianco e nero.
.Zoom = 100
'lo zoom consente di variare il fattore di ingrandimento o di riduzione di 'tutta l'area che andrà in stampa. Riducendo il valore (100 è di default) si può far 'comprendere come PrintArea, una zona più ampia (es.: una colonna che diversamente 'non rientrando nel foglio A4, richiederebbe 2 fogli in stampa. Ricordarsi di ripristinare il 'valore al default se si modifica, perchè Excel lo memorizza anche per stampe successive.
.PrintErrors = xlPrintErrorsDisplayed 
'consente la visualizzazione di errori di stampa
End With

'ed ora si va in stampa: una copia, con l'opzione "fascicola" impostata a SI (true)
zona.PrintOut Copies:=1, Collate:=True
End Sub

Un particolare interessante che riguarda la proprietà "PageSetup" è la possibilità di numerare le pagine in caso di una stampa a più pagine; in questo caso si possono sfruttare le seguenti proprietà (LeftHeader, CenterHeader, RightHeader, LeftFooter, CenterFooter, RightFooter) per inserire istruzioni appropriate;
per esempio se vogliamo che appaia il numero di pagina relativo a un totale  di pagine "Pagina 1 di 5", e lo vogliamo in alto a destra sulla pagina stampata, useremo, nelle istruzioni viste sopra:

.RightFooter = "Pagina &P di &N"

oppure, per una istruzione a se stante:

Worksheets("Foglio1").PageSetup.RightHeader = "Pagina &P di &N"

dove &P e &N sono i "Codici di formattazione per intestazioni e piè di pagina" che potrete applicare.

 

Suggerisco ancora di imparare a leggere la guida in linea, che a volte è ostica, ma con la stampa offre veramente un valido aiuto.

 

 

Buon lavoro.

prelevato sul sito http://ennius.interfree.it