Popolare più combobox o Listbox con solo un doppio ciclo For

alfrimpa

VBA Expert
Supermoderatore
18 Dicembre 2015
34.799
2.445
67
Napoli
2019 Pro Plus
1.033
Capisco che possa essere un'esigenza non frequente ma può accadere di dover popolare diverse combobox (o anche delle listbox anche se questo caso è decisamente più raro) in userform particolarmente articolate.

In luogo di utilizzare tanti cicli For per quante sono le combobox o le listbox si può usare un codice di questo tipo a condizione che i dati siano elencati su di un foglio in colonne contigue

Visual Basic:
Private Sub UserForm_Initialize()
Dim i As Integer
Dim k As Integer
Dim ur As Long
For i = 1 To 5 'questo numero è da variare in relazione al numero delle combobox/listbox
    ur = Cells(Rows.Count, i).End(xlUp).Row
        For k = 1 To ur
            Me.Controls("Combobox" & i).AddItem Sheets("Foglio2").Cells(k, i).Value
        Next k
Next i
End Sub
 
  • Like
Reactions: Rubik72

TheTruster

Utente abituale
Expert
19 Gennaio 2021
210
30
Office e VBA
31
Ciao a tutti,
Già che ci siamo, propongo anche io la mia alternativa 😄

La Routine va posizionata in un modulo, quindi è richiamabile da ogni Form.
Si passano come argomenti: il Worksheet, un array contenente la lista dei controlli da popolare, e l'intervallo di Ranges, anche non consecutivi e/o di lunghezze diverse.

Questa la Routine.

Visual Basic:
Sub PopolaCombo(sht As Worksheet, ctl As Variant, rng As String)

Dim tmpRng As Range
Dim RngArr As Variant
Dim c As Integer
Dim r As Integer

RngArr = Split(rng, ";")

For c = 0 To UBound(ctl)
    Set tmpRng = sht.Range(RngArr(c))
    For r = tmpRng.Row To tmpRng.Row + tmpRng.Rows.Count - 1
        ctl(c).AddItem tmpRng.Cells(r, 1).Value
    Next r
Next c

End Sub
e dal Form si richiama così:

Visual Basic:
Private Sub UserForm_Initialize()

PopolaCombo Sheets("Foglio1"), _
            Array(ComboBox1, ComboBox2, ComboBox3, ComboBox4, ComboBox5), _
            "A1:A10;C5:C15;E1:E10;F8:F21;I1:I13"

End Sub
la stringa dei Ranges si può ricavare banalmente da una cella in cui si mette un = e poi si selezionano tutti i ranges interessati.
Poi si copia quello che viene fuori nella cella e si incolla interamente come parametro della funzione.

Ovviamente mancherebbe un controllo degli errori, nel caso i Ranges non siano confacenti al numero di controlli...

TheTruster
 
  • Like
Reactions: alfrimpa

Sostieni ForumExcel

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