UserForm unica per Database su più fogli
Presento un
esempio di come si possa con un'unica UserForm, gestire più elenchi
(database) all'interno della stessa cartella, ma su più fogli. Condizione
necessaria richiesta: le tabelle che formano il database dovranno tutte
mantenere la stessa "struttura": riferimenti
alle celle, numero di campi, riga inizio elenco, ecc.ecc. per ogni foglio.
Questo ci consente quindi di usare un'unica form, sulla quale saranno
posizionati dei pulsanti per spostarsi tra i vari fogli. Una volta sul
foglio voluto, gestiremo i dati presenti su quel foglio, senza avere legami
agli altri fogli. Utile quando si voglia, per più utenti, sfruttare database
personali, diversi nel contenuto, ma simili nella gestione, oppure quando si
vogliano tenere separati per tipologia di appartenenza, nominativi e
relativi dati. Nell'esempio preparato, ho usato i fogli per tipologia di
nominativi : amici, nemici, parenti, altri. Ma si possono creare elenchi
divisi per regione, hobby, interessi, affinità, prefisso telefonico, cap,
ideologia, religione e chi più ne ha più ne metta. Basterà predisporre tanti
fogli quante sono le diversificazioni. Sarà possibile, per ogni
tabella/foglio, cambiare il nome (NON il numero) dei campi, avendo cura di
far cambiare le proprietà Caption delle Label che indicano il contenuto
delle relative textbox sulla form, allorchè la Form si apre su quel
determinato foglio. (basta inserire le istruzioni nell'evento Click del
CommandButton che porta a quel foglio) . Insomma, c'è solo da sbizzarrirsi. Sfrutteremo il
database MioDB2-2000.xls, presente in questa sezione, paragrafo "Database
con spiegazioni", che ben si presta a questa modifica. (Potete consultare la
pagina, per accedere alle spiegazioni relative alle istruzioni impiegate).
Sono sufficienti poche modifiche, per ottenere questo MultiDB2-2000. Grazie
alla impostazione, sia per la ricerca, sia per l'inserimento, o la
cancellazione di dati, basata essenzialmente sull'ActiveCell
(cella attiva) e sulle celle adiacenti reperite con l'uso di
Offset (Scarto), senza usare riferimenti o nomi
di Fogli su cui operare (o quasi), è possibile usare il
foglio attivo in quel momento, per ottenere la
completa gestione dei dati sopra menzionati, all'interno del foglio. Questa
un immagine del file:
Vediamo le
modifiche rispetto all'altro database:
-
intanto è stato
cambiato il nome all'UserForm1 in
Indirizzario, quindi sono state modificate
tutte le istruzioni che facevano riferimento al nome UserForm1 (nelle
chiamate dei pulsanti, all'apertura della cartella di lavoro, e nel modulo1)
-
Al posto dell'
istruzione che fa riferimento al Worksheet(1)
(che è l'unico foglio su cui lavora l'altro database) è stato usato
ActiveSheet, più generico, e si riferisce al
foglio attivo in quel momento, adatto quindi ad una multiselezione (uniche
due istruzioni, la prima nel commandbutton1, che diventa
With ActiveSheet.Range("B3:B150"), e la seconda
nel UserForm_Initialize che diventa
ActiveSheet.Range("B3").Select ).
-
Per favorire la
ricerca dei dati, ho inserito una ComboBox, che "pesca" i dati nel campo
"Nominativo". Selezionando un nominativo presente nella lista, trasferiamo
lo stesso nella textbox1, che è quella che serve il pulsante "Cerca".
Essendo un nominativo "completo", si potrà usare l'opzione di default per
una ricerca immediata. Unico accorgimento: dovendo "pescare" i dati che per
ogni foglio sono o possono essere diversi, occorre "istruire" la
proprietà RowSource della combobox in modo che legga i dati dal foglio in
quel momento attivo, quindi ho usato l'evento Click di ogni pulsante che
serve a selezionare un foglio, quindi dopo aver selezionato il foglio con
Sheets(1).Select , faccio prendere il nuovo
riferimento con la seguente istruzione:
-
If ActiveSheet.Name = ("Foglio1") Then
Indirizzario.ComboBox1.RowSource = "" 'vuoto la
combobox dei precedenti dati
Indirizzario.ComboBox1.RowSource = "B3:B152"
'ricarico la combobox con i dati del foglio attivo
-
Per segnalare
all'utente su quale foglio ci troviamo nel momento,
ho usato delle CkeckBox che porterranno
un segno di spunta se il foglio attivo in quel momento è il foglio x, e lo
toglieranno agli altri fogli (queste sono per il foglio1, ad ogni foglio
cambiano da False a True e viceversa).
CheckBox1.Value = True
CheckBox2.Value = False
CheckBox3.Value = False
CheckBox4.Value = False
End If
-
Poichè quando si
uscirà da Excel, salvando, lo potremo fare da qualunque foglio, ho previsto
questa istruzione che riattiva sia la RowSource della ComboBox sia le
Chekbox quando riapriremo il file, e ho usato l'evento Activate della
UserForm, che faccio, ricordo, aprire all'apertura della cartella di lavoro:
-
Private Sub UserForm_Activate()
Indirizzario.ComboBox1.RowSource = ""
Indirizzario.ComboBox1.RowSource = "B3:B152"
If ActiveSheet.Name = ("Foglio1") Then
CheckBox1.Value = True
CheckBox2.Value = False
CheckBox3.Value = False
CheckBox4.Value = False
End If
If ActiveSheet.Name = ("Foglio2") Then
CheckBox1.Value = False
CheckBox2.Value = True
CheckBox3.Value = False
CheckBox4.Value = False
End If
If ActiveSheet.Name = ("Foglio3") Then
CheckBox1.Value = False
CheckBox2.Value = False
CheckBox3.Value = True
CheckBox4.Value = False
End If
If ActiveSheet.Name = ("Foglio4") Then
CheckBox1.Value = False
CheckBox2.Value = False
CheckBox3.Value = False
CheckBox4.Value = True
End If
Mi sembra di non
scordarmi niente, e comunque potete scaricare il file e, se credete,
divertirvi.
File consultabile e scaricabile :
MultiDB2-2000.zip 42 Kb |