Condividi tramite

Area di stampa variabile

Anonimo
2018-07-10T08:43:07+00:00

Buongiorno, problema con Excel 2003. Premetto che non conosco il linguaggio VBA.

Ho un foglio che ho chiamato "Gennaio" (seguiranno chiaramente anche quelli con i mesi successivi con le medesime caratteristiche) con le intestazioni di campo "PERSONALE", "CAUSALE", "DATA INIZIO", "ORA INIZIO", "DATA FINE", "ORA FINE", "STRAORDINARIO" (campo calcolato che fa la differenza dei campi data/ora); tutto ciò partendo dalla cella A2 e per l'inserimento max di 200 records (comunque variabili).

Chi inserisce i records può avere la necessità, nel corso del mese, di cancellarne o aggiungerne per cui ho impostato una macro che mi ordina i campi per personale e per data d'inizio.

Parte di questi campi ( "PERSONALE", "CAUSALE", "DATA INIZIO", "ORA INIZIO", "STRAORDINARIO") sono rinviati in un'altra parte del foglio (a partire dalla cella P310 fino alla colonna AQ) con la formuletta =SE($A2="";"";$A2) etc...etc.., le celle interessate vengono bordate progressivamente dalla formattazione condizionale.

Arrivo finalmente al problema: come posso gestire l'area di stampa dinamicamente? Mi spiego meglio: avrei bisogno che al momento di stampare utilizzando il solo pulsante di stampa immediata non escano pagine bianche (quelle che rendono valori uguali a ""), mantenendo comunque le funzioni all'interno delle singole celle (questo perché come accennavo sopra la stampa può variare diverse volte nel corso del mese accorciandosi o allungandosi) considerando anche che le righe dalla 301 alla 309 sono da ripetere all'inizio di ogni pagina che contiene valori <>"".

Mi piacerebbe anche che al momento della stampa comparisse un msgbox in cui inserire il numero di copie.

Il foglio verrà protetto da pw.

Ho provato diverse soluzioni trovate su Internet ma non sono riuscito (per la mia ignoranza cosmica in VBA!) ad adattarne nessuna alle mie esigenze.

Vi ringrazio fin da ora per consigli e suggerimenti,

Carlo

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

13 risposte

Ordina per: Più utili
  1. Anonimo
    2018-07-10T12:14:30+00:00

    Ciao Carlo,

    Buongiorno, problema con Excel 2003. Premetto che non conosco il linguaggio VBA.

    Ho un foglio che ho chiamato "Gennaio" (seguiranno chiaramente anche quelli con i mesi successivi con le medesime caratteristiche) con le intestazioni di campo "PERSONALE", "CAUSALE", "DATA INIZIO", "ORA INIZIO", "DATA FINE", "ORA FINE", "STRAORDINARIO" (campo calcolato che fa la differenza dei campi data/ora); tutto ciò partendo dalla cella A2 e per l'inserimento max di 200 records (comunque variabili).

    Chi inserisce i records può avere la necessità, nel corso del mese, di cancellarne o aggiungerne per cui ho impostato una macro che mi ordina i campi per personale e per data d'inizio.

    Parte di questi campi ( "PERSONALE", "CAUSALE", "DATA INIZIO", "ORA INIZIO", "STRAORDINARIO") sono rinviati in un'altra parte del foglio (a partire dalla cella P310 fino alla colonna AQ) con la formuletta =SE($A2="";"";$A2) etc...etc..,le celle interessate vengono bordate progressivamente dalla formattazione condizionale.

    Arrivo finalmente al problema: come posso gestire l'area di stampa dinamicamente? Mi spiego meglio: avrei bisogno che al momento di stampare utilizzando il solo pulsante di stampa immediata non escano pagine bianche (quelle che rendono valori uguali a ""), mantenendo comunque le funzioni all'interno delle singole celle (questo perché come accennavo sopra la stampa può variare diverse volte nel corso del mese accorciandosi o allungandosi) considerando anche che le righe dalla 301 alla 309 sono da ripetere all'inizio di ogni pagina che contiene valori <>"".

    Mi piacerebbe anche che al momento della stampa comparisse un msgbox in cui inserire il numero di copie.

    Il foglio verrà protetto da pw.

    Ho provato diverse soluzioni trovate su Internet ma non sono riuscito (per la mia ignoranza cosmica in VBA!) ad adattarne nessuna alle mie esigenze.

    Di primo acchito, e in assenza di un file di esempio e il tuo codice (di evento?), vorrei suggerire il seguente approccio:

    • Aggiungi un colonna di appoggio ai dati nell'intervallo P310:AQn
    • Nelle celle della nuova colonna immetti una formula del tipo

              =MATR.SOMMA.PRODOTTO(LUNGHEZZA(P310:T310))>0

    • Applica un filtro automatico, selezionando il criterium VERO per la nuova colonna

    In questo modo, solo le righe che corrispondono alle righe con dati nell'intervallo  A2:Gx non vuote saranno visibili e, quindi, verranno stampati.

    Se fosse per me, vorrei sfruttare l'evento BeforePrint per implementare questo approccio.

    Ovviamente, ci sono approcci alternativi e quindi, ad esempio, si potrebbe nacondere le righe vuote con codice oppure copiare le righe con dati  su un foglio temporaneo.

    De tu dovessi richiedere ulteriore assistenza per implementare un approccio simile o diverso, ti chiederei gentil mente di fornirci con un file di esempio, privo di dati sensibili

    ===

    Regards,

    Norman

    La risposta è stata utile?

    1 persona ha trovato utile questa risposta.
    0 commenti Nessun commento
  2. Anonimo
    2018-07-14T15:51:41+00:00

    Ciao Carlo,

    Sono finalmente riuscito a testare l'idea del filtro automatico che nasconde le celle vuote; geniale! anche per la semplicità.

    Per adesso grazie 1000, ho risolto una buona parte del problema! nei prossimi giorni, lavoro permettendo, mi dedico alle istruzioni VBA.

    Mi fa piacere che tu abbia risolto il problema e ti ringrazio per il cortese riscontro.

    Per chiudere questo thread, vorrei chiederti gentilmente di controllare l'opzione Contrassegna come risposta dal menu a discesa - Strumenti avanzati, sotto la rispettiva risposta.

    In questo modo, le risposte convalidate saranno promosse immediatamente al di sotto della domanda iniziale, e tutti gli altri lettori che hanno la stessa preoccupazione , saranno in grado di trovare più facilmente la risposta, durante la loro ricerca nel nostro forum e su internet.

    Alla prossima.

    Postsriptum:

    Il codice funziona nel seguente modo:

    • qualora un'istruzione di stampa viene emessa la procedura Workbook_BeforePrint controlla se il foglio di interesse sia quello da stampare
    • In caso affermativo, la routine Workbook_BeforePrint chiama la procedura Stampa_Righe_Con_Dat i che filtra le righe di dati e, dopo un piccolo ritardo, chiama la routine ClearFilter che cancella il filtro.

    In un mondo ideale, il filtro sarebbe stato rimosso sfruttando l'evento Workbook_AfterPrint, ma siccome questo evento non esiste, dobbiamo ricorrere al trucco di utilizzando il metodo OnTime per chiamare la seconda procedura.

    Se il codice dovesse richiedere ulteriori chiarimenti, sarò lieto di spiegarlo in modo più dettagliato.

    ===

    Regards,

    Norman 

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2018-07-14T15:43:01+00:00

    Sono finalmente riuscito a testare l'idea del filtro automatico che nasconde le celle vuote; geniale! anche per la semplicità.

    Per adesso grazie 1000, ho risolto una buona parte del problema! nei prossimi giorni, lavoro permettendo, mi dedico alle istruzioni VBA.

    Grazie ancora, Carlo

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2018-07-11T12:38:09+00:00

    Ciao Carlo,

    Buongiorno Norman, innanzitutto grazie per l’input e per la rapiditá nella risposta.

    Prego!

    Stanotte al lavoro testo l’idea che mi hai girato e ti so dire se funge al mio problema. Mi hai dato uno spunto interessante: se trovo le coordinate della prima cella da stampare (saranno naturalmente fisse) e dell’ultima cella not null (dinamica) con una colonna d’appoggio  e poi imposto l’area di stampa =$P$301:indiretto(coordinate dell’ultima cella not null), potrebbe funzionare?.

    Non penso che tu abbia pienamente capito il mio suggerimento!  :-)

    Avendo iimposto l'intero intervallo P310:AQn come l'intervallo da stampare, il filtraggio dell'intervallo P309:Wn, naconderà tutte le le righe senza dati visibili nell'intervallo P310:AQn e, pertanto, solo le righe con dati saranno stampati.

    Forse l'idea diventerà più chiara se dovessi scaricare il mio semplice file di prova 

    Carlo2018010.xlsm

    Un’ultima domanda e non ti secco più (almeno per oggi): se avessi bisogno di mandarti il file come faccio?

    Potresti caricare il file su Microsoft OneDrive, vedi:

      Condividere file e cartelle di OneDrive

    Oppure per carcarlo su DropBox,: vedi:

    Come faccio a condividere file e cartelle in Dropbox?

    Postscriptum:

    Per automatizzare il procedimento,, in un modulo standard, ho incollato il seguente codice:   

    '=========>>

    Option Explicit

    Dim SH As Worksheet

    Public Const sFoglio As String = "Foglio1"

    '--------->>

    Public Sub Stampa_Righe_Con_Dati()

        Dim WB As Workbook

        Dim Rng As Range

        Dim LRow As Long

        Const sColonneFiltro As String = "P:W"

        Const iPrimaRigaDiFormule As Long = 310

        Set WB = ThisWorkbook

        Set SH = WB.Sheets(sFoglio)

        With SH

            LRow = LastRow(SH, Columns(sColonneFiltro))

            Set Rng = Intersect(.Columns(sColonneFiltro), _

                                .Rows(iPrimaRigaDiFormule - 1). _

                                Resize(LRow - iPrimaRigaDiFormule + 2))

        End With

        Rng.AutoFilter Field:=8, Criteria1:="TRUE"

    End Sub

    '--------->>

    Public Sub ClearFilter()

        SH.ShowAllData

    End Sub

    '--------->>

    Public Function LastRow(SH As Worksheet, _

                            Optional Rng As Range, _

                            Optional minRow As Long = 1, _

                            Optional sPassword As String)

        Dim bProtected As Boolean

        With SH

            If Rng Is Nothing Then

                Set Rng = .Cells

            End If

            bProtected = .ProtectContents = True

            If bProtected Then

                Application.ScreenUpdating = False

                .Unprotect Password:=sPassword

            End If

        End With

        On Error Resume Next

        LastRow = Rng.Find(What:="*", _

                           after:=Rng.Cells(1), _

                           Lookat:=xlPart, _

                           LookIn:=xlFormulas, _

                           SearchOrder:=xlByRows, _

                           SearchDirection:=xlPrevious, _

                           MatchCase:=False).Row

        On Error GoTo 0

        If LastRow < minRow Then

            LastRow = minRow

        End If

        If bProtected Then

            SH.Protect Password:=sPassword, _

                       UserInterfaceOnly:=True

        End If

        Application.ScreenUpdating = True

    End Function

    '<<=========

    Nel modulo di codice dell'oggetto ThisWorkbook (Questa_cartella_di_Lavoro) ho incollato il seguente codice:

    '=========>>

    Option Explicit

    '--------->>

    Private Sub Workbook_BeforePrint(Cancel As Boolean)

        If ActiveSheet.Name = sFoglio Then

            Call Stampa_Righe_Con_Dati

            Application.OnTime Now + TimeValue("00:00:01"), "ClearFilter"

        End If

    End Sub

    '<<=========

    In questo modo, automaticamente, qualora si stampa il foglio di interesse, l'intervallo P309:Wn viene filtrato e solo le righe con dati vengono stampati; subito dopo la stampa, il filtro viene tolto. Per qualunque altro foglio, l'operazione di stampa verrà esegita in modo normale.

    Ho aggiornato il mio file di prova Carlo2018010.xlsm

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2018-07-11T11:08:08+00:00

    Buongiorno Norman, innanzitutto grazie per l’input e per la rapiditá nella risposta.

    Stanotte al lavoro testo l’idea che mi hai girato e ti so dire se funge al mio problema. Mi hai dato uno spunto interessante: se trovo le coordinate della prima cella da stampare (saranno naturalmente fisse) e dell’ultima cella not null (dinamica) con una colonna d’appoggio  e poi imposto l’area di stampa =$P$301:indiretto(coordinate dell’ultima cella not null), potrebbe funzionare?.

    Un’ultima domanda e non ti secco più (almeno per oggi): se avessi bisogno di mandarti il file come faccio?

    Grazie 1000 e perdonami per il disturbo,

    Carlo

    La risposta è stata utile?

    0 commenti Nessun commento