Sviluppare funzionalita su Microsoft Office con VBA cambiare 1 riga di pagina di ogni foglio stampato

Login Registrati
Stai vedendo 22 articoli - dal 1 a 22 (di 22 totali)
  • Autore
    Articoli
  • #12694 Score: 0 | Risposta

    frisco0
    Partecipante

      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 Range

          Const sFoglio As String = "Foglio1"           '<<=== Modifica
          Const sRighe As String = "$1:$136"          '<<=== Modifica
          Const sRighe2 As String = "$137:$160"    '<<=== Modifica

          If 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.
      #12696 Score: 0 | Risposta

      vecchio frac
      Senior Moderator
        238 pts

        Pro futuro ti prego di inserire il codice utilizzando l'apposito pulsantino {;} che trovi nell'editor, grazie. Così diventa più leggibile 🙂

        #12697 Score: 0 | Risposta

        vecchio frac
        Senior Moderator
          238 pts

          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 🙂

          #12700 Score: 0 | Risposta

          vecchio frac
          Senior Moderator
            238 pts

            Ci sono colonne nascoste nel foglio, devono essere mantenute tali nel report?

            #12706 Score: 0 | Risposta

            frisco0
            Partecipante

              sì. mantenere nascoste le colonne nascoste. Vorrei che il risultato sia identico al pdf allegato.

              #12709 Score: 0 | Risposta

              vecchio frac
              Senior Moderator
                238 pts

                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.

                #12710 Score: 0 | Risposta

                patel
                Moderatore
                  50 pts

                  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

                  #12720 Score: 0 | Risposta

                  frisco0
                  Partecipante

                    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.

                    #12722 Score: 0 | Risposta

                    vecchio frac
                    Senior Moderator
                      238 pts

                      frisco0 ha scritto:

                      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.

                      frisco0 ha scritto:

                      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).

                      #12725 Score: 0 | Risposta

                      vecchio frac
                      Senior Moderator
                        238 pts

                        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
                        
                        #12728 Score: 0 | Risposta

                        frisco0
                        Partecipante

                          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
                          #12730 Score: 0 | Risposta

                          frisco0
                          Partecipante

                            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?

                            #12731 Score: 0 | Risposta

                            frisco0
                            Partecipante

                              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? 

                               

                              #12741 Score: 0 | Risposta

                              vecchio frac
                              Senior Moderator
                                238 pts

                                frisco0 ha scritto:

                                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).

                                #12742 Score: 0 | Risposta

                                vecchio frac
                                Senior Moderator
                                  238 pts

                                  frisco0 ha scritto:

                                  - 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).

                                  #12743 Score: 0 | Risposta

                                  vecchio frac
                                  Senior Moderator
                                    238 pts

                                    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
                                    #12745 Score: 0 | Risposta

                                    patel
                                    Moderatore
                                      50 pts

                                      frisco0 ha scritto:

                                      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

                                      #12757 Score: 0 | Risposta

                                      frisco0
                                      Partecipante
                                        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.

                                         

                                         

                                        #12758 Score: 0 | Risposta

                                        patel
                                        Moderatore
                                          50 pts

                                          allego le stampe

                                          Allegati:
                                          You must be logged in to view attached files.
                                          #12830 Score: 0 | Risposta

                                          frisco0
                                          Partecipante

                                            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.

                                            #12831 Score: 0 | Risposta

                                            patel
                                            Moderatore
                                              50 pts

                                              allora non ho capito il tuo obiettivo

                                              #12848 Score: 0 | Risposta

                                              vecchio frac
                                              Senior Moderator
                                                238 pts

                                                @patel

                                                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:

                                                vecchio frac ha scritto:

                                                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.

                                              Login Registrati
                                              Stai vedendo 22 articoli - dal 1 a 22 (di 22 totali)
                                              Rispondi a: cambiare 1 riga di pagina di ogni foglio stampato
                                              Gli allegati sono permessi solo ad utenti REGISTRATI
                                              Le tue informazioni: