Ribadiamo ancora il concetto che parlare di ListBox o di ComboBox il più delle volte è equivalente.
Su questo argomento abbiamo già parlato in altre occasioni ma questa volta vale la pena riparlarne per scoprire nuove tecniche.
Ora vogliamo approfondire alcune tecniche che possiamo usare con le ListBox o con le ComboBox.
Questi sono i dati che useremo in questi esempi (oramai penso che avremmo acquisito il nuovo metodo di lavorare con gli intervalli senza più fare riferimento alla classica notazione A1):
| Cognome | Nome | Indirizzo | CAP | Città |
|---|---|---|---|---|
| Migliavacca | Luigi | VIA DEL TUSCOLANO 1 | 42033 | Muscoline |
| Scicchitano | Andrea | VIA SABIN 34/2 | 67020 | Rifreddo di Saluzzo |
| Migliavacca | Luigi | VIA DEL TUSCOLANO 1 | 42033 | Muscoline |
| Migliavacca | Luigi | VIA DEL TUSCOLANO 1 | 42033 | Muscoline |
| Edelvisi | Maurizio | STRADA MARCHESANE 434 | 58020 | Uppello |
| Borsotti | Mirella | STRADA MARCHESANE 434 | 26010 | Malborghetto |
| Maggi | Massimo | VIA SABIN, 34/2 | 32032 | Cittadella |
Come vedremo qui di seguito esistono molti metodi per riempire una ListBox o una ComboBox.
Il discorso è leggermente articolato e spero di riuscire ad esporlo chiaramente.
Per comodità trascrivo l'ordine che ho seguito nell'esposizione di queste note.
Questo metodo possiamo applicarlo sia con l'uso di matrici, sia leggendo i dati direttamente da un intervallo del foglio di Excel
Il riempimento di una ListBox usando degli opportuni cicli ed usando l'ormai famoso Additem può avvenire in uno dei seguenti modi.
In questo esempio usiamo una normale ListBox o ComboBox ad una sola colonna e la riempiamo con una matrice ad una sola dimensione che preleva i dati da una colonna di un Intervallo
Dim intervallo As Range
Dim Righe, R, C
Dim Matrice()
With Range("A1").CurrentRegion ' in questo ciclo viene riempita una matrice ad una dimensione
Righe = .Rows.Count - 1
C = 3 ' viene scelta la colonna da memorizzare nella matrice
ReDim Matrice(1 To Righe)
For R = 1 To Righe
Matrice(R) = .Cells(R + 1, C)
Next
End With
ListBox1.Clear ' è buona norma resettare la ListBox prima di riempirla
For R = 1 To Righe
ListBox1.AddItem Matrice(R) ' riempimento della ListBox con un normale ciclo
Next
Se invece preleviamo i dati da un intervallo del foglio di Excel possiamo notare che la procedura è simile:
Dim Righe, Colonne, R
Dim Intervallo As Range
With Range("A1").CurrentRegion
Righe = .Rows.Count - 1
Colonne = .Columns.Count
Set Intervallo = .Offset(1, 0).Resize(Righe, Colonne)
End With
C = 2
With ListBox1
.Clear
For R = 1 To Righe
.AddItem Intervallo(R, C)
Next
End With
Invece di usare cicli, usando particolari proprietà e/o metodi è possibile evitare i cicli per riempire i controlli ListBox e ComboBox
Una volta creata una matrice ad una sola dimensione è possibile trasferire i dati in essa memorizzati in uno di questi controlli
Dim Righe, Colonne, R, C
Dim Matrice()
Dim Intervallo As Range
With Range("A1").CurrentRegion
Righe = .Rows.Count - 1
Colonne = .Columns.Count
Set Intervallo = .Offset(1, 0).Resize(Righe, Colonne)
End With
ReDim Matrice(1 To Righe)
C = 3
For R = 1 To Righe
Matrice(R) = Cells(R + 1, C)
Next
ListBox1.List() = (Matrice)
In questo esempio, per caricare il controllo ListBox con i valori di una matrice viene usata la proprietà List(). In questo caso, la proprietà List() non include indici tra le sue parentesi.
Attenzione
Se con questo metodo si tenta di caricare un controllo ListBox o ComboBox con una matrice a due dimensioni, verranno caricati solo i dati memorizzati nella prima colonna della matrice.
Nella costruzione della patrice provate a sostituire questo frammento di codice:
ReDim Matrice(1 To Righe)con quest'altro:
ReDim Matrice(1 To Righe, 1 To Colonne)e poi continuate con l'ultima istruzione. Noterete che nella ListBox verrà caricata solo la prima colonna della matrice.
L'azione non provoca errori.
Usare un intervallo per riempire una ListBox o una ComboBox è simile a quel che abbiamo appena visto.
Ma al posto di usare la proprietà List è necessario usare la proprietà RowSource che specifica l'origine da cui proviene un elenco di un controllo ComboBox o ListBox
Dim Righe
Dim Intervallo As Range
Worksheets("Foglio1").Select
With Range("A1").CurrentRegion
Righe = .Rows.Count - 1
Set Intervallo = .Offset(1, 1).Resize(Righe, 1)
End With
With ListBox1
.RowSource = Intervallo.Address
End With
Attenzione:
Anche in questo caso, se l'intervallo è rappresentato da più di una colonna, nella ListBox verrà visualizzata solo la prima di queste colonne.
Dopo aver riempito una ListBox o una ComboBox usando la Proprietà RowSource non è più possibile aggiungere altri elementi usando il metodo Additem
Se sul foglio abbiamo una tabella coi record disposti sulle colonne anzichè sulle righe possiamo usare un altro metodo per popolare una ListBox trasponendo i dati da colonne a righe.
Premetto che questo metodo è una scoperta dell'ultima ora.
Iniziamo col vedere la tabella di esempio:
| Nome | Migliavacca | Rizzi | Liberali | ecc |
|---|---|---|---|---|
| Cognome | Luigi | Carlo | Franca | ecc |
| Indirizzo | VIA P. FIMIANI-LOC.TRIVIO | VIA SABIN 34/2 | VIA DEL TUSCOLANO 1 | ecc |
| CAP | 35031 | 84040 | 67030 | ecc |
| Città | Varena | Noli | Calcinatello | ecc |
| Prov | FR | TO | BO | ecc |
Iin questo caso se dobbiamo agire con le matrici, contrariamente agli stessi controlli a più colonne, è più agevole lavorare coi cicli o usare la proprietà List() vista poco fa. Infatti, se la matrice è ad una sola dimensione, necessariamente ha i vari dati (record) disposti su uba sola colonna e questo metodo non ha senso.
Se agiamo da un preciso intervallo del foglio possiamo provare questo metodo.
Definiamo come intervallo una intera riga con Resize(1, Colonne)
Con questo sistema avremo definito un intervallo che si estende su una una sola riga
Poi riempiamo il controllo con la sintassi che vedremo qui di seguito
Dim Righe, Colonne
Dim Intervallo As Range
With Range("A1").CurrentRegion
Colonne = .Columns.Count - 1
Set Intervallo = .Offset(0, 1).Resize(1, Colonne)
End With
With ListBox1
.List() = Application.Transpose(Intervallo)
End With
Attenzione
se l'intervallo ha più di una riga (Set Intervallo2 = .Offset(0, 1).Resize(Righe, Colonne)) nel controllo verrà inserita solo la prima riga)
Per leggere l'elemento selezionato da una ListBox ad una colonna possiamo usare uno dei seguenti metodi:
lettura della voce scelta nella ListBox aiutati dalla proprietà Value
TextBox1 = ListBox2
lettura della voce aiutati dalla proprietà List che avrà come valore della proprietà ListIndex
R = ListBox2.ListIndex
TextBox1 = ListBox2.List(R)
| Prima parte | Seconda parte>>> | Terza parte>>> | Quarta parte >>> |