ListBox - Usarle come strumento per ottenere correlazioni multiple. - dal 04/09/04 pagina vista: volte

Un altro modo, oltre alle TextBox,  per visualizzare dati su una UserForm, può essere quello di impiegare ListBox al posto delle TextBox, per questo scopo.

E' un semplice esercizio che intende suggerire come, selezionando un valore (un dato) in una ListBox, si possa ottenere automaticamente, nelle altre Listbox, la selezione di dati correlati al valore scelto.

Supponiamo quindi di avere una tabella formata da più campi (colonne), come questa sotto, dove correlati ad un nominativo, troviamo nelle colonne a lato, l'indirizzo, la città, ed il numero di telefono, ma potrebbe trattarsi di qualsiasi altra tabella impostata su un magazzino articoli, oppure un'archivio fatture, o altro, ma da cui, attraverso la selezione di un criterio (il nominativo ad esempio) vogliamo visualizzare i dati relativi al criterio scelto (il suo indirizzo, la città, il numero di telefono). Come maschera di consultazione dati useremo una UserForm.

L'esercizio si presta comunque a molteplici varianti, basta solo afferrare i concetti ed adattarli secondo esigenze. La tabella:

Inseriamo quindi quattro ListBox nella UserForm, tante quanti saranno i campi che vorremo visualizzare, in modo da ottenere una cosa così:

La prima ListBox, la ListBox1, contiene i campi "Nominativo", e servirà come criterio di ricerca: selezionando uno dei nomi presenti, otterremo nelle altre ListBox la selezione dei dati correlati, così:

Le istruzioni per ottenere questo risultato sono semplici, intanto sfrutteremo l'evento Activate della UserForm, per "caricare" i dati della tabella  assegnando al RowSource di ogni ListBox, il Range (intervallo) della colonna di pertinenza:

  • Private Sub UserForm_Activate()
    ListBox1.RowSource = "Foglio2!A2:A10"
    ListBox2.RowSource = "Foglio2!B2:B10"
    ListBox3.RowSource = "Foglio2!C2:C10"
    ListBox4.RowSource = "Foglio2!D2:D10"
    End Sub

Questa istruzione ci consente di attivare la UserForm da qualunque foglio, mirando ad intervalli posti su altri fogli, basta indicare nel RowSource il nome del foglio dove risiede la tabella.

Poi sfruttiamo l'evento Click della ListBox1, che si verifica quando "clicchiamo" su un nome presente nella lista, ad ogni click sfruttiamo la Proprietà ListIndex della ListBox1, per ottenere il numero della riga selezionata con il click, e rendiamo la propietà  List(riga, colonna)  delle altre ListBox uguale a quello della ListBox1; questo ne provoca la selezione e conseguente evidenzazione del valore relativo al numero di riga, così:

  • Private Sub ListBox1_Click()
    x = ListBox1.ListIndex 
    ' x sarà uguale al numero di riga del valore selezionato nella ListBox1
    ListBox2 = ListBox2.List(x, 0)
    ListBox3 = ListBox3.List(x, 0)
    ListBox4 = ListBox4.List(x, 0)
    End Sub

L'esercizio è finito, ma se qualcuno usasse la UserForm per selezionare dati provenienti da una tabella, ma da inserire in altre tabelle, o celle di un foglio di lavoro, potremo aggiugere un CommandButton che, leggendo la proprietà Text delle ListBox, restituisca i valori attualmente evidenziati, in altrettante celle. vediamo un esempio che renderà i valori delle ListBox in determinate celle sul foglio 3 (ma potremo inserire un ciclo While che cercando la prima riga libera, ci inserisca i dati che vorremo copiare, (le varianti di cosa fare si sprecano)):

  • Private Sub CommandButton1_Click()
    Sheets(3).[C1] = ListBox1.Text
    Sheets(3).[C2] = ListBox2.Text
    Sheets(3).[C3] = ListBox3.Text
    Sheets(3).[C4] = ListBox4.Text
    End Sub

Buon lavoro.

prelevato sul sito www.ennius.altervista.org