ComboBox dinamica

Prima di iniziare la nostra carrellata di istruzioni, vorrei prendere un attimino in considerazione la proprietà END che si menzionava nell'articolo Spostamento tra celle del vecchio sito per osservarne il comportamento con due sintassi lievemente diverse:

Range("D1").Select
Selection.End(xlDown).Select

questa istruzione seleziona solo l'ultima cella di un intervallo che parte dalla cella D1

Range("A1").Select
Range(Selection, Selection.End(xlDown)).Select

questa istruzione seleziona un intero intervallo a partire dalla cella A1

Assimilato questo concetto, possiamo passare alla presentazione di una routine che ci permette di usare una ComboBox in modo dinamico, ossia che riesce ad aggiornarsi man mano che una lista a cui essa si riferisce cambia.

Poniamo la solita tabella di esempio:

  A B .... .... AA AB
1         Silvana  
2         Adriana  
3         Elisa  
4         Paolo  
5         Talina  
6         Diego  
7         Giorgio  
8            
9            
10            

Innanzitutto, se, come nell'esempio sopra riportato abbiamo delle righe vuote che potrebbero servire per i più svariati usi (titoli, note, intestazioni e quant'atro), occorre che ci premunivamo di occupare tali celle almeno con degli invisibili punti.

A questo punto io opterei per una UserForm che contiene una ComboBox e due pulsanti come in questa immagine

La UserForm , per via del pulsante OK, permette una maggiore libertà di azione (non ultima la selezione ripetuta dello stesso nome cosa tra l'altro un pò più artificioso se si usa una normale ComboBox sul foglio di Excel).

Dopo aver provveduto ad inserire in una parte recondita del foglio un elenco di nomi possiamo passare nell'ambiente VBA e dopo aver creato la nostra UserForm possiamo passare alla stesura del codice che potrebbe essere come il seguente e che poniamo nella finestra relativa alla UserForm1 dell'Editor VBA

Private Sub UserForm_Activate()
Dim I As Integer
Dim Riga
Application.ScreenUpdating = False
ComboBox1.Clear
Range("AA1").Select
Riga = Range(Selection, Selection.End(xlDown)).Rows.Count
Range(Cells(1, 27), Cells(Riga, 27)).Select
ActiveWorkbook.Names.Add Name:="elenco", _
RefersToR1C1:=Selection
For I = 1 To Range("elenco").Rows.Count
If ThisWorkbook.Names("elenco").RefersToRange.Cells(I, 1) <> "" Then
ComboBox1.AddItem ThisWorkbook.Names("elenco").RefersToRange.Cells(I, 1)
End If
Next I
End Sub

In questa routine vorrei porre la nostra attenzione su alcuni punti:

 

Punto primo:

Application.ScreenUpdating = False

che serve per evitare di assistere al fastidioso sfarfallio dello schermo durante le varie selezioni che il codice compie nella sua esecuzione.

 

Punto secondo:

Riga = Range(Selection, Selection.End(xlDown)).Rows.Count

assegniamo alla variabile Riga il valore dell'ultima riga occupata dalla tabella contenente i nomi tramite la proprietà Count usando una variante alla seconda istruzione presentata all'inizio dell'articolo compiendo due azioni con un'unica istruzione:

 

Punto terzo:

ActiveWorkbook.Names.Add Name:="elenco", _
RefersToR1C1:=Selection

con questa istruzione assegniamo un nome all'intervallo che contiene l'elenco dei nominativi da inserire nella ComboBox.

 

Punto quarto:

Il ciclo For I .... Next I

questo che usiamo non è che uno dei tanti modi con cui possiamo ripetere varie volte alcune operazioni:

l'istruzione inizia con la parola chiave For

segue una variabile numerica che memorizza il numero del ciclo in eecuzione

il segno di uguale '='

il valore iniziale del ciclo

la parola chiave To

il valore finale del ciclo

la parola chiave Step (a volte facoltativa) che indica un incremento o un decremento diverso da quello di default che è +1

il valore dell'incremento o decremento che può essere un numero intero o decimale positivo o negativo

segue il gruppo delle istruzioni da eseguire nel ciclo

finisce con la parola chiave Next

Questi sono alcuni esempi di utilizzo:


For x = 1 To 30
.... istruzioni
Next x


For x = 1 To 30 Step 2
.... istruzioni
Next x


For x = 1 To 30 Step .5 '(punto 5 equivalente a 0,5)
.... istruzioni
Next x


For x = 30 To 1 Step -1
.... istruzioni
Next x


Se questi concetti non sono chiari è possibile tornarci su in modo più approfondito prossimamente. Per ora spero che quello che si legge in questo articolo possa bastare per cominciare a familiarizzare con questo strumento importante.

Se questi concetti non sono chiari è possibile tornarci su in modo più approfondito prossimamente. Per ora spero che quello che si legge in questo articolo possa bastare per cominciare a familiarizzare con questo strumento importante.

 

Punto quinto

If ThisWorkbook.Names("elenco").RefersToRange.Cells(I, 1) <> "" Then
ComboBox1.AddItem ThisWorkbook.Names("elenco").RefersToRange.Cells(I, 1)
End If

con questa serie di istruzioni che stanno nel ciclo For I .... Next I si procede con l'integrazione dei nomi dell'elenco alla ComboBox se questi sono nomi validi cioè non nulli.

I riferimenti che si fanno a Cells(I, 1) sono riferiti alla cella che si trova tra le coordinate riga<I> (valore determinato dal ciclo For I) colonna <1> del foglio.

 

Per ora questo è tutto. Se riceverò segnalazioni di delucidazioni su questo argomento sarò ben lieto di fornirne.

 

 

Buon lavoro!