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