› Sviluppare funzionalita su Microsoft Office con VBA › cambiare 1 riga di pagina di ogni foglio stampato
-
AutoreArticoli
-
ho un foglio di 168 righe ed N colonne.
Il file delle esperienze professionali è suddiviso in 3 sezioni:
- le attività (da riga 1 a riga 137);
- titoli e formazione (da riga 138 a 161);
- pubblicazioni (da riga 162 a 168).Nella stampa vorrei che su ogni pagina come 1 riga venga stampata:
1) la riga 1 per le prime 137 righe;
2) la riga 138 per le righe da 138 a 161;
3) la riga 162 per le righe da 162 a 168.Un amico mi ha fornito la macro sottostante che non funziona.
'=========>>
Option Explicit
'--------->>
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim Rng As Range, Rng2 As RangeConst sFoglio As String = "Foglio1" '<<=== Modifica
Const sRighe As String = "$1:$136" '<<=== Modifica
Const sRighe2 As String = "$137:$160" '<<=== ModificaIf ActiveSheet.Name = sFoglio Then
On Error GoTo XIT
Application.EnableEvents = False
With ActiveSheet
Set Rng = Intersect(.UsedRange, .Rows(sRighe))
With .PageSetup
.PrintTitleRows = "$1:$1"
.PrintTitleColumns = ""
.PrintArea = Rng.Address
End With
.PrintOut
Set Rng2 = Intersect(.UsedRange, .Rows(sRighe2))
With .PageSetup
.PrintTitleRows = sRighe2
.PrintTitleColumns = ""
.PrintArea = Rng2.Address
End With
.PrintOut
End With
End If
XIT:
Application.EnableEvents = True
End Sub
'<<=========Qualcuno può aiutarmi a modificarla?
Allego file espro.zip che contiene il file xls e pdf di prototipo costruito manualmente di come vorrei avvenisse la stampa.
Allegati:
You must be logged in to view attached files.Pro futuro ti prego di inserire il codice utilizzando l'apposito pulsantino {;} che trovi nell'editor, grazie. Così diventa più leggibile 🙂
Anche se il codice sembra imperfetto, a naso mi sembra che la logica sia corretta, cioè impostare dei range separati, in corrispondenza delle righe predeterminate, e poi operare su questi range il pagesetup.
Io farei però un'operazione diversa: creare un Workbook di appoggio, copiare in tre fogli separati le zone stabilite, impostare per ciascuno la corretta riga del titolo, quindi creare il pdf finale. Alla fine il Workbook temporaneo si può chiudere senza salvare 🙂
Ci sono colonne nascoste nel foglio, devono essere mantenute tali nel report?
sì. mantenere nascoste le colonne nascoste. Vorrei che il risultato sia identico al pdf allegato.
Per evitare da subito equivoci... il mio era un suggerimento, non vuol dire che devo fare qualcosa 🙂 Comincia a pensarci su, stendi un po' di codice e provalo, se hai problemi puntuali li risolviamo.
Un'altra idea, da fare manualmente senza codice, è proprio quella di riportare in tre fogli contigui ma separati i tre range, impostarli in modo uniforme e quindi esportare in pdf l'intera cartella. Quindi come vedi puoi fare tutto manualmente senza codice, se questo rappresenta un problema.
Ciao frisco0, non ho capito perché dici che la macro non funziona, solo perché non stampa il terzo range ? basta aggiungere qualche riga di codice copiando quelle relative al secondo e modificando gli indirizzi
riportare in tre fogli contigui ma separati i tre range, impostarli in modo uniforme e quindi esportare in pdf l'intera cartella
se ho capito bene mi dici di portare su foglio 2 le righe della sezione 2 su foglio 3 le righe della sezione 3. Questa è stata la mia prima idea, il risultato è stato che la stampa era di 6 pagine le prime 4 pag della sezione 1 (ultima a metà), la 5 della sezione 2 (mezza pagina) e la 6 della sezione 3 (mezza pagina).
"impostarli in modo uniforme" vorrebbe dire che le impostazioni di stampa (margine sx, dx ...) dovrebbero coincidere per i 3 fogli? anche questo non viene rispettato pur avendo impostato i valori al decimillesimo.
Non era questo il mio obiettivo come si può vedere dal pdf.
mi dici di portare su foglio 2 le righe della sezione 2 su foglio 3 le righe della sezione 3
yes, ovviamente l'are a di stampa va configurata opportunamente.
anche questo non viene rispettato
Piuttosto strano, hai provato a impostare anche la dimensione in larghezza di un foglio? (larghezza = 1 pagina)
Questo dovrebbe forzare la dimensione di ogni colonna e la grandezza del font per farci stare tutto su una pagina in larghezza (in lunghezza invece ci vorranno toto fogli, dipende da quante righe ci sono).
Vabbè, nonostante quello che ho detto prima ti propongo la mia soluzione. Mi sembra un risultato simile al tuo, vedi tu.
Option Explicit Sub create_pdf() Dim ranges(1 To 3) As Range Dim i As Integer Dim wb1 As Workbook, wb2 As Workbook Application.ScreenUpdating = False Application.Cursor = xlWait Set wb1 = ThisWorkbook With wb1.Sheets("Foglio1") Set ranges(1) = .Range("A1:N" & .Range("A1").CurrentRegion.Rows.Count) Set ranges(2) = .Range("A137:N" & (136 + .Range("A137").CurrentRegion.Rows.Count)) Set ranges(3) = .Range("A161:N" & (160 + .Range("A161").CurrentRegion.Rows.Count)) End With Set wb2 = Workbooks.Add Do wb2.Sheets.Add after:=Sheets(Sheets.Count) Loop Until wb2.Sheets.Count = 3 For i = 1 To 3 With wb2.Sheets("Foglio" & i) .Select ranges(i).Copy .Range("A1") ranges(i).Copy .Range("A1").CurrentRegion.PasteSpecial xlPasteColumnWidths Application.CutCopyMode = False .Columns("E").Hidden = True .Columns("K").Hidden = True Select Case i Case 1 .Range("A1:N1").Interior.Color = vbYellow Case 2 .Range("A1:N1").Interior.Color = 11851260 'orange .Range("A2:N2").Interior.Color = vbYellow Case 3 .Range("A1:N1").Interior.Color = 682978 'dark orange .Range("A2:N2").Interior.Color = vbYellow End Select With .PageSetup .PrintTitleRows = "$1:$1" .PrintArea = wb2.Sheets("Foglio" & i).Range("A1").CurrentRegion.Address .LeftFooter = "Esperienze professionali " .CenterFooter = "" .RightFooter = "ver 7.1 agg. &D pag &P/&N" .Orientation = xlLandscape .LeftMargin = Application.InchesToPoints(0) .RightMargin = Application.InchesToPoints(0) .TopMargin = Application.InchesToPoints(0) .BottomMargin = Application.InchesToPoints(0) .HeaderMargin = Application.InchesToPoints(0.275590551181102) .FooterMargin = Application.InchesToPoints(0.15748031496063) .ScaleWithDocHeaderFooter = True .Zoom = False .FitToPagesWide = 1 .FitToPagesTall = False End With End With Next wb2.ExportAsFixedFormat xlTypePDF, ThisWorkbook.Path & "\espro_" & Format(Now, "yyyymmdd_hhnn") & ".pdf" wb2.Close False Application.ScreenUpdating = True MsgBox "Finito" Application.Cursor = xlDefault End Sub
Ciao patel
non ho capito perché dici che la macro non funziona, solo perché non stampa il terzo range ?
La stampa del foglio viene fatta correttamente per la prime 4 pagine relativamente alla sezione 1 (in ogni pagina viene stampata la riga 1); nella 5 pagina stampa ancora la 1 riga anzicchè la 138.
La terza sezione che in effetti manca sarebbe ininfluente. Questi sarebbero le istruzioni mancanti.
.... Dim Rng As Range, Rng2 As Range, Rng3 As Range ... Const sRighe3 As String = "$161:$168" '<<=== Modifica ... Set Rng3 = Intersect(.UsedRange, .Rows(sRighe3)) With .PageSetup .PrintTitleRows = "$162:$162" .PrintTitleColumns = "" .PrintArea = Rng3.Address End With .PrintOut
ciao vecchio-frac,
intanto: grazie! nonostante la tua premessa iniziale, hai voluto darmi una mano.
Ho provato la routine; se la fretta di vedere il risultato non mi ha ingannato fa:
- porta su foglio 2 e 3 la sezione 2 e 3 e ne mantiene i formati;
- la sezione 1 su foglio 1 altera tutti i formati tant'è che le 3 pagine e mezzo son diventate 9, perchè dal momento le sezioni 2 e 3 li mantengono i formati? Ho reimpostato l'altezza delle righe ed è tornato alle sue 3 pagine e mezzo.
- l'ultima riga si sovrappone quasi completamente nella sezione 1 sul piè di pagina, solo in parte per la sezione 2 e 3;
- la stampa della cartella non mette di seguito le sezioni 2 e 3 ma su pagine a se stanti (questo era il motivo per cui avevo scartato la soluzione di creare 3 fogli separati che non avrebbe avuto neanche bisogno di codice VBA) ;
- ho inserito celle nella sezione 2 e 3 per simulare un'andata a pagina successiva e la stampa non riporta la corretta riga di intestazione che nel caso specifico è la seconda del foglio e non la prima.
Non era quello che mi aspettavo, basta confrontare il risultato con il pdf che ho allegato.
Si può realizzare la stampa consecutiva delle 3 sezioni o dei 3 fogli?
Una banale domanda: nulla a che vedere con il problema di cui sopra.
Come mai il file che ho allegato:
- con office 2010 x windows da come risultato il pdf che ho allegato,
- con Office 2016 per Mac stampa le ultime due colonne su altra pagina, come se il carattere occupi più spazio in larghezza.
C'è qualche opzione che permette il fit (compressione) solo orrizontale?
se la fretta di vedere il risultato non mi ha ingannato fa:
La procedura in effetti fa quello che suggerivo di fare manualmente, copia i range in fogli separati e poi imposta margini, larghezza di colonne, applica i formati di colore, le intestazioni eccetera come l'originale, e soprattutto applica l'intestazione titolo alla prima riga. Excel di suo purtroppo non è in grado di stampare in continuo i fogli e inserisce un salto pagina. Non ho trovato soluzione a questo.
Un'alternativa potrebbe essere di creare un oggetto documento di Word, importarvi le tabelle, quindi impostare la prima riga delle tabelle come riga di intestazione e infine creare il pdf.
Per aggiustare i dettagli che riporti poi (altezza righe, altezza piè di pagina), sono impostazioni che puoi ricavare facilmente (AutoFit sulle righe, margini in .PageSetup).
- con Office 2016 per Mac
Non un Mac per provare, e l'unica opzione che mi viene in mente è forzare la stampa su una pagina (.FitToPagesTall = 1).
Tra parentesi c'è un errore che devi correggere:
Do wb2.Sheets.Add after:=Sheets(Sheets.Count) Loop Until wb2.Sheets.Count = 3
deve diventare:
Do wb2.Sheets.Add after:=Sheets(Sheets.Count) Loop Until wb2.Sheets.Count >= 3
Una banale domanda: nulla a che vedere con il problema di cui sopra.Come mai il file che ho allegato: - con office 2010 x windows da come risultato il pdf che ho allegato, ....
Infatti io ho fatto il test col 2010 su win e non ho riscontrato problemi
Infatti io ho fatto il test col 2010 su win e non ho riscontrato problemi
Quando dici non ho riscontrato problemi a cosa ti riferisci?
1) Se lo riferisci alle differenze di stampa rispetto a Mac se non hai un mac non credo abbia potuto verificarlo, se hai provato su mac come hai fatto? Non ho reso la differenza perchè con il mac le 5 pagine stampate con office 2010 per windows sono diventate 10. Il test da te fatto se ha prodotto le 5 pagine è esattamente quello lo postato ed è stato costruito manualmente con l'inserimento della 1 riga in ciascuna pagina.
2) Se invece ti riferisci alla soluzione del mio problema e dicendo "non ho riscontrato problemi" mi stai dicendo che la stampa da te fatta è corretta secondo quanto da me chiesto, allora ti prego inviami la stampa.
allego le stampe
Allegati:
You must be logged in to view attached files.le stampe sono relative alle 3 sezioni separate che avevo sperimentato e scartato per la complicazione di dover eliminare le righe bianche per rendere consecutive le 3 sezioni.
frisco0 vorrebbe che la stampa fosse continua per i tre range interessati (quindi da scartare la mia idea di posizionare i tre range su fogli separati, perchè Excel inserisce dei salti pagina, indesiderati), ma le righe di intestazione dei tre range in fase di stampa ("stampa titoli") devono corrispondere alle intestazioni dei tre range, e questo Excel non lo permette. Da qui il mio suggerimento successivo, forse trascurato ma che mi sembra a questo punto l'unico percorribile:
Un'alternativa potrebbe essere di creare un oggetto documento di Word, importarvi le tabelle, quindi impostare la prima riga delle tabelle come riga di intestazione e infine creare il pdf.
-
AutoreArticoli