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

Ultima modifica: 29-05-2016

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

Dopo la carrellata sui vari modi di usare i controlli ListBox e ComboBox proviamo ora a vedere alcuni piccili trucchi con cui intendiamo chiudere l'argomento.

Attenzione:

Non è possibile usare questi metodi se la ListBox è stata riempita usando la Proprietà RowSource. E' invece possibile in tutti gli altri casi.

 

Eliminazione di una riga da un elenco della ListBox

Per eliminare una riga da una ListBox o ComboBox è sufficiente selezionare o indicare la riga da eliminare e poi usare:

ListBox1.RemoveItem (Riga)

Se si desidera eliminare la riga selezionata, e questa sarebbe la procedura giusta, si deve prima verificare che ci sia una riga selezionata usando le seguenti istruzioni, altrimenti si può fare a meno del controllo:

If ListBox1.ListIndex = -1 Then Exit Sub
Riga = ListBox1.ListIndex
ListBox1.RemoveItem (Riga)

 

Inserire una riga

Queste operazioni si possono sompiere solo se la ListBox non è stata riempita usando la Proprietà RowSource.

Per aggiungere semplicemente una riga in fondo ad una ListBox è sufficiente:

ListBox1.AddItem "valore"

Questo se la ListBox è ad una sola colonna.

Se le colonne sono più di una possiamo usare quest'altro:

R = 5
R1 = ListBox1.ListCount
ListBox1.AddItem
For C = 1 To Colonne
ListBox1.List(R1, C - 1) = Cells(R, C)
Next

 

Inserire una riga all'inizio o in altro punto della ListBox

Oltre che inserire nuovi elementi in coda di una ListBox è possibile eseguire la stessa operazione in posizioni ben precise della stessa.

Per eseguire questa operazione è sufficiente indicare, nel metodo Additem, la locazione in quale riga inserire i nuovi elementi.

ListBox1.AddItem , IndiceRiga

IndiceRiga può essere un valore arbitrario ( R2 = 5 ) oppure può essere la riga selezionata ( R2 = ListBox1.ListIndex ).

Con questo metodo la nuova riga di dati viene inserita nella riga indicata dalla variabile R2 e tutte le righe già presenti nella ListBox, compresa quella indicata, verranno spinte in basso.

Dim R, R2, C, Colonne
Colonne = Range("A1").CurrentRegion.Columns.Count
If ListBox1.ListCount = 0 Then Exit Sub
If ListBox1.ListIndex = -1 Then Exit Sub
R = 4: R2 = 5
ListBox1.AddItem , R2
For C = 1 To Colonne
ListBox1.List(R2, C - 1) = Cells(R, C)
Next

 

Spostare una riga di una ListBox in alto o in basso

Usando speciali accorgimenti è possibile spostare in basso o in alto una intera riga della ListBox come è visibile in questa immagine.

Per lo spostamento della riga in sù è sufficiente sia selezionata una riga nella ListBox per cui occorre verificare se è stata effettuata questa selezione.

Per lo spostamento della riga verso il basso, invece occorre verificare anche che la riga della ListBox (ListIndex)) non si trovi oltre la penultima posizione.

Questo è il codice per spostare in su una riga:

Dim R, C, Matrice()
Dim Messaggio
If ListBox1.ListIndex < 1 Then Exit Sub
' la riga va aggiunta una posizione più in
' alto della riga selezionata
R = ListBox1.ListIndex
ReDim Matrice(1 To ListBox1.ColumnCount)
For C = 0 To ListBox1.ColumnCount - 1
Matrice(C + 1) = ListBox1.List(R, C)
Next
ListBox1.AddItem , ListBox1.ListIndex - 1
ListBox1.ListIndex = ListBox1.ListIndex - 2
R = ListBox1.ListIndex
For C = 1 To UBound(Matrice)
ListBox1.List(R, C - 1) = Matrice(C)
Next
ListBox1.RemoveItem ListBox1.ListIndex + 2

Mentre quest'altro è il codice relativo allo spostamento in basso di una riga della ListBox:

Dim R, C, Matrice()
' se la riga da spostare in giù si trova oltre la penultima
' posizione è inutile eseguire lo spostamento
' più giù dell'ultima riga non si può scendere
If ListBox1.ListIndex = -1 Then Exit Sub
If ListBox1.ListIndex > ListBox1.ListCount - 2 Then Exit Sub
' la riga va aggiunta due posizioni più in
' basso della riga selezionata
R = ListBox1.ListIndex
ReDim Matrice(1 To ListBox1.ColumnCount)
For C = 0 To ListBox1.ColumnCount - 1
Matrice(C + 1) = ListBox1.List(R, C)
Next
ListBox1.AddItem ListBox1.Text, ListBox1.ListIndex + 2
ListBox1.ListIndex = ListBox1.ListIndex + 2
R = ListBox1.ListIndex
For C = 1 To UBound(Matrice)
ListBox1.List(R, C - 1) = Matrice(C)
Next
ListBox1.RemoveItem ListBox1.ListIndex - 2

 

Intestazioni di Colonna per una ListBox

La proprietà ColumnHeads funziona solo con la proprietà ListFillRange se si lavora con un controllo ListBox o ComboBox disegnato in Excel o la proprietà RowSource per il controllo usato in VBA. Quando si utilizza la proprietà ListFillRange o RowSource, per ottenere le intestazioni di colonna è necessario impostare la proprietà ColumnHeads su True.

Quando si manda un intervallo ad un controllo ListBox o ComboBox (ListBox1.RowSource = Intervallo.Address) può succedere una di queste cose:

Per questi motivi, quando si definisce in intervallo si deve fare in modo che questo sia al netto delle intestazioni di colonna come in questo esempio:

With Range("A1").CurrentRegion
Righe = .Rows.Count - 1
Colonne = .Columns.Count
Set Intervallo = .Offset(1, 0).Resize(Righe, Colonne)
End With

Ecco un esempio completo:

Dim Righe, Colonne
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
With ListBox1
.ColumnHeads = True
.ColumnCount = Colonne
.BoundColumn = 2
.RowSource = Intervallo.Address
End With

Ora vediamo l'ultima chicca che riguarda le ListBox e le ComboBox

 

 


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