[Tutorial VBA] Popolare una ListBox superando il limite delle 10 colonne

Stato
Chiusa ad ulteriori risposte.

ges

Excel/VBA Expert
Amministratore
Expert
21 Giugno 2015
25.156
1.865
Como
2011MAC 2016WIN
585
Ciao a tutti.

Capita a volte che vi siano richieste sul popolamento di una ListBox con un numero di colonne superiori a 10.

Al riguardo ci sono diversi metodi, ne voglio qui descrivere un paio, poi ovviamente chi ritiene può integrare con altri.

Per fare ciò è necessario impostare tutto tramite codice, rinunciando alla Finestra di proprietà della ListBox

Per contare le colonne da visualizzare uso la proprietà ColumnCount che ha la funziona di specificare il numero di colonne da visualizzare nel controllo della ListBox.

Questa proprietà potrebbe essere impostata nella finestra Proprietà ma si dovrebbe inserire in maniera fissa, utilizzando il codice VBA – come in questo caso – se si cambiano le colonne si adatta alla nuova struttura del foglio.

La proprietà List viene utilizzata in combinazione con ListCount e ListIndex per restituire gli elementi in un controllo ListBox

La sintassi è Control.List (iRow, iCol)

Ciascun elemento in una lista ha un numero di riga e un numero di colonna ed entrambi partono da 0.

In caso di una sola colonna può essere omesso di scrivere 0 mentre si deve specificare per una ListBox con più colonne.


Un primo metodo

Trovo il numero dell’ultima riga del foglio
Codice:
uRow = Cells(Rows.Count, 1).End(xlUp).Row
Poi trovo il numero dell’ultima colonna
Codice:
uCol = Cells(1, Columns.Count).End(xlToLeft).Column
quindi assegno questo valore alla proprietà ComlumCount
Codice:
ListBox1.ColumnCount = uCol
A questo punto con la proprietà List popolo la listbox dalla cella A1 all’ultima colonna e riga piena:
Codice:
ListBox1.List = wks1.Range(wks1.Cells(2, 1), wks1.Cells(uRow, uCol)).Value
Per adattare la larghezza delle colonne della ListBox uso la proprietà ColumnWidths (qui si potrebbe anche impostare nella finestra Proprietà della ListBox)
Codice:
ListBox1.ColumnWidths = "50;50;50;100;150;120;60;50;50;50;50;50;50;50;50;50;50;50"

Un altro metodo simile

Si può usare la proprità CurrenRegion che trova la c.d. “area corrente”, che è costituita da un intervallo delimitato da una qualsiasi combinazione di righe e colonne vuote
Codice:
Set rng = wks1.Range("A1").CurrentRegion
Poi viene trovata l’ultima colonna piena e quindi caricati i dati di tutto l’intervallo interessato
Codice:
With Me.ListBox1
        .ColumnCount = rng.Columns.Count
        .List = rng.Value
    End With
Il codice completo è il seguente:

Codice:
Private Sub UserForm_Initialize()
  
    Dim wks1 As Worksheet
    Dim rng As Range
   
    ListBox1.ColumnWidths = "50;50;50;100;150;120;60;50;50;50;50;50;50;50;50;50;50;50"
    
    Set wks1 = ThisWorkbook.Worksheets("Foglio1")
    Set rng = wks1.Range("A1").CurrentRegion
  
    With Me.ListBox1
        .ColumnCount = rng.Columns.Count
        .List = rng.Value
    End With
   
'Un'alternativa:
'Set wks1 = Worksheets("Foglio1")
'uRow = Cells(Rows.Count, 1).End(xlUp).Row
'uCol = Cells(1, Columns.Count).End(xlToLeft).Column
'ListBox1.ColumnCount = uCol
'ListBox1.List = wks1.Range(wks1.Cells(2, 1), wks1.Cells(uRow, uCol)).Value

Il file di esempio l'ho postato QUI
 
Ultima modifica:
Stato
Chiusa ad ulteriori risposte.

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!