|
Aggiungere nuovi Fogli di lavoro. -
dal 04/09/04 pagina vista:
4003
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
|