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 |