Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [Excel] Copia celle su altro foglio automaticamente.

    Buongiorno a tutti ragazzi.
    Mi è stato chiesto un consiglio su excel al quale, però, non so proprio rispondere.

    La spiegazione è semplicissima. Immaginate il classico foglio in cui elencate i vs clienti. Quindi nome, cognome indirizzo e pratica + una cella di controllo dove al momento del completamento della pratica andrò ad apporre un data di fine lavoro.

    Ogni mese avrei bisogno di copiare tutte le celle non contrassegnate dalla data di fine lavoro (quindi non ancora portate a termine) sul foglio del mese che inizia. Quindi avrei bisogno di una funzione che in automatico all'inizio del nuovo mese importa tutte le pratiche non concluse sul mese in corso.


    Avete in mente qualcosa o qualche tutorial che possa aiutarmi?

  2. #2
    Ciao,
    una cosa del genere si fa necessariamente con VBA e non è particolarmente complicata.

    Si potrebbe per esempio sfruttare l'evento Workbook_Open che viene attivato ad ogni apertura del file in modo da verificare se esiste già un foglio col nome del mese in corso o se occorre crearlo e copiare i dati dal mese precedente.

    Mi sembra però di capire che non sia tu ad averne bisogno direttamente quindi bisognerbbe verificare con l'utente se questo tipo di approccio non venga percepito come troppo invasivo perché magari l'utente preferisce crearselo da sè il nuovo foglio ogni mese in modo da formattarlo come gli pare e far partire la macro solo al click su un pulsante.

    C'è poi da capire come individuare le righe dalle quali copiare i dati perché il fatto che la data non sia valorizzata non è un buon indicatore perché la data non è valorizzata anche sulle migliaia di righe vuote inutilizzate che si trovano oltre la fine dei dati e non si possono certo copiare tutte

    Occorre quindi individuare una colonna sicuramente valorizzata (potrebbe essere il cognome ad esempio) che indichi con certezza fino a che riga effettuare l'esplorazione.

    Per semplificare le cose questa colonna non dovrebbe presentare buchi perché la proprietà END, che sarebbe molto comoda in un caso del genere si ferma alla prima riga vuota che trova.

    Queste sono giusto le prime cose che mi vengono in mente, nel week-end avrò un po' di tempo e riuscirò a buttar giù un primo esempio, tu intanto cerca di informarti su questi due punti.
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

  3. #3
    Allora, questa è una soluzione un po' grezza, poi magari la perfezioniamo.

    codice:
    Option Base 1
    Option Explicit
    Private Sub Workbook_Open()
       On Error Resume Next
    
       Dim Mesi, NewSheet, Mese_Corrente, Mese_Precedente, Casella, Riga
     
       Mesi = Array("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre")
       Riga = 1
    
       Mese_Corrente = Mesi(Month(Now()))
       Mese_Precedente = Mesi(Month(Now()) - 1)
       
       Err.Clear
       Sheets(Mese_Corrente).Activate
       
       If Err.Number = 9 And Err.Source = "VBAProject" Then
          
          Set NewSheet = Worksheets.Add(Type:=xlWorksheet, after:=Sheets(Sheets.Count))
          NewSheet.Name = Mese_Corrente
          
          For Each Casella In Range(Sheets(Mese_Precedente).[E1], Sheets(Mese_Precedente).[E100])
             If Casella = "" And Casella.Offset(0, -1) <> "" Then
                Sheets(Mese_Precedente).Rows(Casella.Row).Copy Destination:=Sheets(Mese_Corrente).Cells(Riga, 1)
                Riga = Riga + 1
             End If
          Next
          
       End If
        
    End Sub
    Perché questo codice possa lavorare devi per prima cosa salvare il foglio excel nel formato con attivazione di macro (xlsm), poi aprire l'editor del VBA con ALT-F11 e cliccare due volte su ThisWorkbook (che si trova sotto Microsoft Excel Oggetti che a sua volta si trova sotto VBAProject (Esecuzione macro ad apertura foglio.xlsm)). Fatto questo lo incolli nell'area vuota bianca e non dovrebbe servire altro.

    Nota che tutto questo si riferisce ad excel 2007, se ne hai un altro potrebbe esserci qualche differenza.

    Inoltre dovrai attivare le macro ogni volta che lo apri oppure fare in modo che si attivino automaticamente (trovi la spiegazione nell'help di excel).

    Passiamo ai punti essenziali del codice.

    Come ti dicevo utilizzo l'evento Workbook_Open per intercettare l'apertura del foglio poi determino il nome del mese corrente e di quello precedente e provo ad utilizzare l'evento Activate sul mese corrente.

    In questo modo riesco a capire se il foglio del mese corrente esiste già o no, se infatti l'evento Activate restituisce un return code 9 vuol dire che il foglio non esiste e bisogna crearlo altrimenti non si fa nulla.

    Per creare il foglio utilizzo il metodo ADD e poi gli attribuisco Mese_Corrente come nome.

    Fatto questo copio le righe che abbiano la colonna E vuota e la colonna precedente (offset(0, -1)) piena. Fra le varie possibilità ho scelto questa per capire quali righe copiare, tu, chiaramente potrai modificare questo criterio per adattarlo alle tue esigenze.

    Come range di eslorazione ho scelto E1:E100 ma anche questo lo puoi cambiare come vuoi.

    Le righe vengono copiate nel foglio di arrivo in righe successive cominciando dal valore attribuito all'inizio alla variabile Riga. Così com'è quindi il codice non crea righe di intestazione nel foglio di arrivo (te l'ho detto che è ancora grezzo).

    Un'altra cosa che bisognerà mettere a posto è il cambio anno cioè il passaggio da dicembre a gennaio perché, così com'è, questo codice andrà in errore la prima volta che proverai ad aprirlo a gennaio. Inoltre bisognerebbe sapere se userai un foglio all'anno o se lo stesso foglio conterrà più anni perché allora occorrerà inserire anche l'anno nel nome delle schede.

    Pe ora non mi viene in mente altro, fammi sapere se come primo spunto può andar bene.

    Ciao.
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.