Aggiungere nuovi Fogli di lavoro. - dal 04/09/04 pagina vista: volte

Alla fine dell'articolo precedente ("Scorrere tutti i fogli") ho accennato all'uso del Metodo Add per l'aggiunta di un nuovo foglio di lavoro nella cartella attiva.

Sviluppiamo questo esercizio, prendendo in esame una necessità che spesso può capitare di soddisfare:

  • Aggiunta di un nuovo foglio con assegnazione del nome da dare al foglio, controllando se questo nome è già presente nei fogli esistenti.(sappiamo infatti che quando si lavora su "insiemi" (i Worksheets, in questo caso) non è possibile assegnare due volte uno stesso nome, pena lamentele del debugger.)

Per eseguire un controllo dovremo usare una condizione If Then End If da verificare: se la condizione risulta VERA (cioè il nome del foglio esiste già, potremo evitare di aggiungere il foglio, altrimenti aggiungeremo il foglio nominandolo col nome scelto.

Nell'uso pratico un esercizio del genere, potrà interessare quanti lavorano con l'introduzione di dati che debbano essere registrati in Fogli chiamati con un Nome specifico. Potrebbe essere una cartella per la gestione delle provvigioni Agente, oppure un cartella per la gestione di DARE/AVERE relativo a Clienti e/o Fornitori, o ancora alla gestione di Articoli, oppure per la registrazione di fatture emesse,  insomma tutti quei casi in cui per ogni "Elemento" si voglia creare un Foglio a lui intestato, anzichè usare un database unico su un foglio, dove i dati sarebbero "mescolati", e dove sarebbe necessario ricorrere a filtrazioni per reperire solo i dati relativi ad un particolare "Elemento". Se per esempio, parlando di "Agenti", si usassero Fogli singoli a loro intestati, selezionando il foglio "Alfieri" si avrebbe subito la di lui situazione sottomano.

Vediamo quindi come impostare il lavoro:

  • avremo bisogno di prepararci una "maschera di introduzione dati", che potrà essere un range di celle fisso, posto sul foglio iniziale della cartella. Parlo di Range (intervallo) di celle in quanto il numero di celle dipenderà dai campi che intendiamo registrare. Seguendo l'esempio degli "Agenti", una possibile registrazione di dati che servano alla contabilizzazione del loro fatturato, potrebbe interessare i campi: data emissione fattura, numero fattura, nome del cliente al quale la fattura è stata emessa, importo della fattura, nome dell'Agente, quindi 5 campi e quindi cinque celle su una stessa riga. Il campo nome Agente sarà importante in quanto sarà il nome che servirà ad identificare il foglio sul quale andare a registrare i dati immessi : se il foglio col nome dell'Agente non esiste, ne verrà creato uno, nel caso esista già, faremo in modo di poter registrare i dati, cercando la prima riga libera, su quel foglio, dove copiarci i dati immessi. Creeremo così lo "storico" per ogni Agente.

Questa "maschera di introduzione dati" dovrà essere fissa in quanto ci serviranno i suoi riferimenti da usarsi nelle istruzioni. Faremo in modo poi di cancellare le celle della maschera predisponendola per nuovi inserimenti. Potremmo usare tranquillamente anche una UserForm come "maschera di introduzione dati", basterà in questo caso modificare le istruzioni che vedremo, per reperire i dati che inseriremo in TextBox. Ma l'esempio lo facciamo il più semplice possibile ed userò delle celle del foglio1. Sotto la "maschera di introduzione dati" rappresentata dalle celle in giallo chiaro

  A B C D E
1 Data Fattura Numero Fatt. Cliente  Importo Fattura  Nome Agente
2          
3          

Per la ricerca all'interno di Fogli già esistenti della prima riga libera, useremo un ciclo While..Wend già visto numerose volte in tanti altri articoli dei siti. Ripetiamo comunque, per i più distratti, questa semplice procedura:

  • Dim irow As Integer  'dichiarazione della variabile irow come numero intero
    irow = 1 
    'impostiamo il numero che corrisponde DA quale riga iniziare a cercare (dalla riga1)

    'sotto: iniziamo il ciclo While che cercherà sul foglio attivo, nella cella irow, colonna 1, se la cella è occupata (diversa 'da vuoto), se la cella è occupata, si passa alla riga successiva con irow = irow + 1. il ciclo continua a scorrere le 'celle tramite Wend, fintantochè troverà celle occupate, appena trova una cella libera, si ferma e si esce dal ciclo. in 'quella cella trovata libera si eseguiranno le istruzioni che compileremo:
    While ActiveSheet.Cells(irow, 1) <> ""
    irow = irow + 1
    Wend

    ..segue cosa fare con la cella trovata libera

Queste sono le istruzioni che ci consentiranno di inserire i dati aggiungendoli a quelli eventualmente esistenti, NON di sovrascriverli. Per la registrazione dei dati immessi, ci avvaremmo del metodo Copy applicato all'oggetto Range. Vediamo la routine, che inseriremo in un modulo standard, e che chiameremo tramite un pulsante associato alla macro, oppure usando un CommandButton ActiveX, inserendo le istruzioni nel suo evento Click. Come area di introduzione dati, useremo sul Foglio1, le celle che vanno da A2 a E2, e per la destinazione dei dati immessi, sceglieremo come inizio, la cella A1.

Per evitare possibili errori di digitazione maiuscole/minuscole nell'inserimento del nome dell'Agente (infatti il codice considererebbe diversi "alfieri" e "Alfieri", e si appresterebbe a creare un nuovo foglio, scatenando le ire di Excel che invece vede uguali i due nomi, e non accetterebbe un duplicato), inseriamo nella sezione Generale - Dichiarazioni del modulo, questa istruzione: Option Compare Text che rende il codice NON CaseSensitive.

Option Compare Text

'---------------------------------------------------------------------------------------------------------
Sub AggiungiFoglio()
Dim ws As Worksheet
Dim NomeFoglio
NomeFoglio = Range("D2")
'con la variabile NomeFoglio prendiamo il valore che sarà in D2 (l'agente)
For Each ws In Worksheets
'poi col ciclo For Each scorriamo tutti i fogli (ws) nella cartella
If ws.Name = NomeFoglio Then
'se il nome del foglio scorso è uguale al contenuto della cella D2
ws.Activate '
si attiva il foglio
Dim irow As Integer
'e si comincia, su questo foglio, la ricerca della prima cella libera, colonna 1 (la A)
irow = 1
While ActiveSheet.Cells(irow, 1) <> ""
irow = irow + 1
Wend

'trovata la cella libera si incolla l'intervallo A2:D2 del foglio1, sul foglio ora attivo:
Sheets("Foglio1").Range("A2:D2").Copy  Sheets(NomeFoglio).Cells(irow, 1)
Sheets("Foglio1").Activate
'si ritorna al foglio1
Sheets("Foglio1").Range("A2:D2").ClearContents
'e si cancella l'intervallo A2:D2
Exit Sub
'indi si esce dalla routine impedendo l'esecuzione delle sottostanti istruzioni
End If
Next ws
'oppure si prosegue il ciclo controllando tutti i nomi dei fogli

'se invece la ricerca svolta sopra non avrà trovato un foglio con lo stesso nome in D2, (NomeFoglio)si 'impostano le istruzioni per aggiungere tramite Add, un nuovo foglio assegnandogli il NomeFoglio con una 'unica istruzione
Sheets.Add.Name = NomeFoglio

'poi, usando il metodo Move (After), spostiamo il foglio appena creato, che si posizionerebbe come 'primo foglio nella cartella, dopo l'ultimo foglio, reperito con Sheets.Count, che fornisce il numero totale 'dei fogli presenti
Sheets(NomeFoglio).Move After:=Sheets(Sheets.Count)
Sheets("Foglio1").Range("A2:D2").Copy  Sheets(NomeFoglio).Range("A1")
'quindi si copiano i dati
Sheets("Foglio1").Range("A2:D2").ClearContents 
'e si puliscono le celle sul foglio 1

'se poi vorremo ritornare al Foglio1, aggiungeremo la riga sotto:

Sheets("Foglio1").Activate
End Sub

 

Con questo articolo credo di aver completato una panoramica sul come lavorare sui Fogli.

 

Buon lavoro.

prelevato sul sito www.ennius.altervista.org