Lavorare con le ListBox o ComboBox a una e a più colonne
- parte prima -

Ultima modifica: 29-05-2016

| Prima parte | Seconda parte>>> | Terza parte>>> | Quarta parte >>> |

ListBox o ComboBox a una colonna

 

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.

  1. Riempimento di ComboBox e ListBox usando i cicli
    • Per un controllo ListBox o ComboBox ad una colonna usando le matrici
    • Per un controllo ListBox o ComboBox ad una colonna usando i dati di un intervallo
  2. Riempimento di ComboBox e ListBox senza usare i cicli
    • Per un controllo ListBox o ComboBox ad una colonna usando le matrici
    • Per un controllo ListBox o ComboBox ad una colonna usando i dati provenienti da un intervallo
  3. Per un controllo ListBox o ComboBox ad una colonna con trasposizione dei dati
  4. Lettura delle scelte effettuate in una ListBox ad una colonna

 


Riempimento di ComboBox e ListBox usando i cicli

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

Per un controllo ListBox o ComboBox ad una colonna usando le matrici

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

Per un controllo ListBox o ComboBox ad una colonna usando i dati di un intervallo

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

 


Riempimento di ComboBox e ListBox senza usare i cicli

Invece di usare cicli, usando particolari proprietà e/o metodi è possibile evitare i cicli per riempire i controlli ListBox e ComboBox

Per un controllo ListBox o ComboBox ad una colonna usando le matrici

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)
C = 3
For R = 1 To Righe
Matrice(R) = Cells(R + 1, C)
Next

con quest'altro:

ReDim Matrice(1 To Righe, 1 To Colonne)
For R = 1 To Righe
For C = 1 To Colonne
Matrice(R, C) = Cells(R + 1, C)
Next
Next

e poi continuate con l'ultima istruzione. Noterete che nella ListBox verrà caricata solo la prima colonna della matrice.

L'azione non provoca errori.

Per un controllo ListBox o ComboBox ad una colonna usando i dati di un intervallo

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

 


Per un controllo ListBox o ComboBox ad una colonna con trasposizione da righe a colonne

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)

 


Lettura delle scelte effettuate in una ListBox ad una colonna

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 >>> |