Stampare le pagine di un Foglio di lavoro. dal 04/09/04 pagina vista: volte

21/11/2008: modifica:    Contare da Foglio di lavoro quante sono le pagine da stampare

Una delle cose meglio riuscite di Excel, e sono tante, è la sua possibilità di gestire la stampa delle pagine dei fogli. Uso il termine "pagine" in quanto ogni foglio di lavoro, con tutte le sue righe (65536) e le sue colonne (255) conta un numero considerevole di pagine, corrispondenti al numero di righe e di colonne che normalmente possono essere stampate in un normale foglio A4.

Precisiamo subito che in Excel usare l'opzione generica "Stampa Foglio", senza definire una precisa "area di stampa" ottiene risultati molto validi; infatti Excel "sente" le celle che contengono valori, e regola quindi automaticamente la quantità di pagine da stampare, in funzione delle celle occupate. Sarà comunque opportuno dare un'occhiata alla "Anteprima di stampa" per verificare che tutto corrisponda a ciò che vorremo ottenere. E' evidente che se avremo un foglio con dati sparsi e che magari non vorremo stampare tutti, sarà necessario impostare le aree di stampa che riguardano i dati da stampare. Comunque valutiamo un esempio estremo come questo: un valore nella cella A1, e un solo altro valore nella cella I65536, porterebbe Excel a considerare che occorrerebbero 1214 pagine (a tante corrisponde la lunghezza del foglio dalla prima riga all'ultima) in quanto Excel regola la quantità di pagine da stampare tra la prima cella e l'ultima che contengono valori, anche se nel mezzo non esistono dati. Lo stesso accadrebbe se esistessero dati nelle colonne oltre le 9 colonne larghezza standard che formano il layout di stampa.

L'esercizio che presento è impostato sulla possibilità quindi di mandare in stampa solo le pagine che vorremo e come, sempre via codice, visualizzare prima le pagine da mandare in stampa senza usare "Anteprima di Stampa". Condizione comunque necessaria è che dovremo almeno una volta, controllare in "Anteprima di stampa", che la larghezza di una nostra ipotetica tabella o database rientri nella pagina di stampa. Ma procediamo con ordine.

Excel ci dà la possibilità di mutare la larghezza delle colonne e l'altezza delle righe, quindi queste note si riferiranno alle misure standard di righe e colonne, così come ce le presenta Excel. E' necessario infatti definire uno standard per poter seguire le varie istruzioni e spiegazioni che qui troverete. Se poi qualcuno userà dimensioni non standard per i propri fogli, dovrà adattare i concetti qui contenuti alle proprie esigenze, magari scegliendo un "orientamento" del foglio in orizzontale anzichè in verticale, in modo da contenere più colonne.

Definiamo quindi le dimensioni standard di un' area di stampa : essa corrisponde a 54 righe (in Excel 2003, 50 righe in Excel 2010) e a 9 colonne cioè la colonna I compresa. L'area di stampa si può riconoscere dal bordo tratteggiato che apparirà ai limiti estremi di ogni area corrispondente ad una pagina in formato A4. E' possibile usare un'istruzione per verificare quanto detto, basta infatti lanciare una macro che contenga questo:

  • Worksheets("Foglio1").DisplayPageBreaks = True

e vedremo questo: (le frecce rosse indicano le linee tratteggiate di delimitazione area di stampa)

Un utile accorgimento sarà quello di destinare almeno un paio di righe a "Blocca riquadri" (area gialla) dal menù "Finestra/Blocca Riquadri", per alloggiare i vari pulsanti associati alle macro che serviranno per la navigazione tra le pagine, come vedremo più avanti.

Per togliere le linee tratteggiate basterà usare la stessa istruzione ma impostata a False:

  • Worksheets("Foglio1").DisplayPageBreaks = False

Da ribadire che non stiamo parlando di "Interruzioni di pagina", peraltro aggiungibili via codice, (con il metodo Add: HPageBreaks.Add ) ma di divisioni dell'area di stampa, gestite da Excel, in pagine del formato A4, cioè di come Excel divide automaticamente il Foglio in tante pagine. Anzi, poichè ritengo che aggiungere "Interruzioni di pagina" crei non poche sofferenze, invito i curiosi a leggersi la guida in linea relativa all'argomento "HPageBreaks".

Non è mia intenzione trattare l'argomento stampa in maniera completa in questo articolo, soprattutto per il problema rappresentato dalle necessità che ogni utente avrà per impostare le proprie aree di stampa (dimensioni celle e colonne, ampiezza tabelle, tipo e dimensione caratteri, ecc. ecc.), che diversificano in modo sostanziale le modalità operative e di settaggi, ma esistono dei passaggi comuni che possono essere visti e argomentati, e sono:

  • Area di Stampa - (PrintArea) è una proprietà di PageSetup e restituisce o imposta l'intervallo da stampare; come sintassi vuole che sia identificata come una stringa di riferimenti (di tipo A1) per esempio per stampare tutto l'intervallo da A1 a E20 : Worksheets("Foglio1").PageSetup.PrintArea = "$A$1:$E$20". Questa istruzione definisce l'area che verrà stampata.

  • 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 (es: "Pagina 1 di 5"), e lo vogliamo in alto a destra sulla pagina stampata, useremo, nelle istruzioni viste sopra:

    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.

     

  • Anteprima di Stampa - (PrintPreview) metodo che si applica al Foglio (Worksheets). L'anteprima di stampa è un'utilità molto efficace non solo per visualizzare ciò che andrà in stampa, ma per le possibilità di settaggi che in questa fiinestra possiamo eseguire: potremo modificare tutti e quattro i bordi, possiamo decidere se ingrandire o rimpicciolire l'area di stampa in modo da comprendere una  zona che prima non rientrava nell'area di stampa; possiamo inoltre vedere il numero di quante "pagine" saranno stampate, e potremo scorrere le pagine, per decidere poi se stamparle tutte o solo una oppure una parte da - a. Dal pulsante "Imposta" possiamo decidere se inserire Intestazioni o Piè di pagina, personalizzandoli, possiamo decidere la priorità verticale (di default)oppure orizzontale per l'ordine di pagina; insomma è una vera e propria centrale decisionale. Il bello è che se attiviamo il "Registratore di macro" mentre eseguiamo i settaggi che ci interessano, potremo trovarci poi tutti i passaggi fatti compilati dal nostro Excel, ed usare queste istruzioni per realizzare una macro personalizzata. Vediamo due immagini parzializzate della testa e della base della finestra di Anteprima Stampa: si notano tutti i comandi per Impostare tutte le opzioni, e nella barra inferiore il numero di pagina visualizzata e il totale delle pagine che andranno in stampa.

Inoltre è possibile, col pulsante "Anteprima interruzion di pag", passare al foglio di lavoro e vedere tutte le pagine del foglio, in formato "ristretto" divise e marcate con il relativo numero di pagina (che non verrà stampato), dalla prima all'ultima. Da questa modalità visiva, potremo dal menù File, scegliere di nuovo la voce "Anteprima di stampa" cliccando sul pulsante "Normale" ora visibile, per ritornare alla visalizzazione normale del foglio di lavoro. Queste le immagini :

L'esercizio che vedremo, è adatto per quei database molto lunghi, tipo le tabelle gestione articoli di magazzino, o comunque elenchi di qualsiasi natura, dove si voglia stampare solo una parte di tutta la tabella o elenco. Abbiamo detto che con una altezza riga standard, in una pagina di stampa entrano 54 righe; se vorremo visualizzare le pagine che vorremo stampare per controllare se sono quelle giuste, possiamo usare questa semplice routine:

Sub MostraPagine()
'possiamo intanto visualizzare le interruzioni di pagina automatiche e manuali del foglio di lavoro 'specificato con l'istruzione sotto:
Worksheets("Foglio1").DisplayPageBreaks = True

'poi usiamo una inputbox con la quale chiediamo quale numero di pagina intendiamo vedere, 'prendendo con la variabile "dimmi" il numero che scriveremo
dimmi = InputBox("Quale pagina vuoi vedere?")

'poi con la variabile X otteniamo (calcoliamo) a quale riga corrisponde l'inizio pagina che vogliamo
X = (Val(dimmi) * 54) - 54
'ed usiamo infine lo ScrollRow che ci "precipita" alla riga "X" mostrandocela ad inizio video
ActiveWindow.ScrollRow = X + 1
End Sub


Una volta individuate e stabilite le pagine che vorremo stampare, useremo l'istruzione PrintOut usando due argomenti (di questo Metodo) che determinano da quale pagina a quale pagina vogliamo stampare, e sono : From (da) - To (a). Avremo due possibilità per decidere di stampare:

  • stampare un determinato intervallo di pagine (esempio : dalla pagina 3 alla pagina 7 , quindi From 3, To 7,  - e verranno stampate tutte le pagine dell'intervallo compreso la 3 e la 7).

  • oppure stampare una sola pagina per volta (esempio: se vorremo stampare la pagina 15, scriveremo : dalla pagina 15 alla pagina 15 , quindi   From 15, To 15,)

La routine di base è questa:

Sub Stampa1()
ActiveWindow.SelectedSheets.PrintOut From:=3, To:=7, Copies:=1, Collate:=True
End Sub

Ma poichè così i numeri di pagina da stampare saremmo costretti a scriverli come dati costanti nel codice, vogliamo poter fornire ai due argomenti i numeri delle pagine che avremo scelto, e dovremo allora usare due variabili reperite con altrettante inputbox, in modo da rendere dinamica la nostra istruzione, che diventerà:

Sub Stampa2()

Z = InputBox("Scrivi il numero della pagina iniziale")

W = InputBox("Scrivi il numero della pagina finale")
ActiveWindow.SelectedSheets.PrintOut From:=Z, To:=W, Copies:=1, Collate:=True
End Sub

I più attenti avranno capito che sarà possibile, prima di usare PrintOut nella stessa routine, impostare istruzioni che si occupino di settare altre condizioni, come i bordi pagina, l'intestazione o il piè di pagina, il fattore di zoom, ecc. ecc.

21/11/2008  

Contare da Foglio di lavoro quante sono le pagine da stampare.

Senza utilizzare l'anteprima di stampa per controllare e contare quante sono le pagine che andranno in stampa, magari per porre in una cella la dicitura "documento composto da " & nPagine & " pagine" oppure per essere avvisati con un messaggio di questo numero, possiamo usare l' istruzione seguente che però NON rileva le pagine parziali (intese come Pagina intera occupata), quindi se fossero 7 pagine e mezza, otterremmo solo 7 e non 8 come in realtà sarebbero.

Sub Dimmi()

For Each pb In Worksheets("Foglio1").HPageBreaks  ' si lancia un ciclo che scorre il Foglio da inviare in stampa per contare le
    If pb.Extent = xlPageBreakFull Then                    
 ' interruzioni di pagina, e il numero rilevato si invia ad una cella o un messaggio
        nPage = nPage + 1
        End If
    Next

[B10] = "documento composto da " & nPage & " pagine” "

MsgBox "Il documento è composto da " & nPage & " pagine” "

End Sub

Sfruttando invece quanto detto poco sopra, cioè che in una pagina di stampa entrano 54 righe (se nessuno ha modificato le altezze standard) è sufficiente contare quante sono le righe occupate in una sola colonna di dati che andranno in stampa (ad esempio la colonna A) e dividere il numero delle righe occupate diviso 54 (o altro numero di righe se diverso). Inseriamo un semplice controllo per rilevare se il numero delle pagine trovate contiene decimali, caso in cui aggiungeremo 1 al numero trovato:

Sub ContaPagine()
UltimaRiga = Range("A65536").End(xlUp).Row 
    'prendiamo l'ultima riga occupata nella colonna A
NPage = UltimaRiga / 54                                   
'e dividiamo UltimaRiga diviso 54 per ottenere quante pagine risultano
PageIntere = Int(NPage)                                     
 'rileviamo quindi l'intero del numero rappresentato da NPage
decimali = NPage - PageIntere                           
 'quindi eseguiamo una semplice sottrazione
If decimali = 0 Then                                           
'se i decimali sono assenti (uguali a zero) vuoldire che NPage è un numero Intero
[B10] = "documento composto da" & Int(NPage) & " pagine” " 
 'inviamo il numero ad una cella oppure avvisiamo con un messaggio
Else                                                                     
'  altrimenti avvisiamo e aggiungiamo 1 a NPage
[B10] = "documento composto da " & Int(NPage + 1) & " pagine” "
End If

End Sub

P.s.: è possibile controllare da una anteprima di stampa da quante righe sono formate le pagine da stampare, sarà possibile usare quel numero come divisore nella routine letta sopra.
 

 

 

Buon lavoro.

prelevato sul sito www.ennius.altervista.org