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!