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