Caricare una ListBox con dati provenienti da
più colonne.
(18/07/03)
Un breve esercizio
basato sul metodo AddItem per caricare i dati,
anzichè sfruttare la proprietà ListFillRange se
la ListBox si trova sul foglio di lavoro, oppure
RowSource se la ListBox è su una UserForm. Stiamo parlando di una
ListBox ActiveX, presa quindi da "Strumenti di controllo" (o Casella degli
strumenti) anzichè da Moduli.
In questo esempio ipotizziamo di voler reperire i dati non da una sola
colonna, come di solito facciamo, ma da un certo numero di colonne, tutte
conseguenti, ma di cui non sappiamo nè il numero di colonne che contengono i
dati che vogliamo caricare, nè quante righe di dati saranno presenti nelle
singole colonne.
Si tratta quindi di una situazione che spesso si verifica, quella di non
conoscere l'esatta dimensione della zona contenente i dati, e allora vediamo
come impostare le routine:
-
Useremo la proprietà End per reperire, data una
cella iniziale, sia l'ultima colonna occupata, sia l'ultima riga occupata di
ogni colonna. Per fare questo sarà necessario che i dati siano su celle
contigue, senza celle vuote nel mezzo, altrimenti End
si fermerebbe all'ultima cella occupata anche se i dati continuassero su
celle sottostanti. Lo stesso dicasi per le colonne.
-
Una volta reperita l'ultima Colonna occupata da dati, conteremo quante sono
le colonne con Columns.Count. Il numero così ottenuto lo useremo come
indice estremo in un ciclo For Next che scorra le colonne, una alla volta,
partendo dalla prima fino all'ultima rappresentata dal numero indice.
-
Lo stesso faremo, con un altro ciclo For Next interno al primo ciclo, per
reperire quante sono le righe di ogni colonna. Otteniamo quindi che avviata
la macro, verranno contate le colonne, poi inizieremo dalla prima e ne
conteremo le righe, poi il ciclo passerà alla seconda colonna e verranno
contate le righe di questa, e così via fino all'ultima colonna.
-
Ad ogni scorrimento di cella, verrà preso il dato (valore) ivi presente,
assegnato ad una variabile, e questa variabile restituirà il valore alla
ListBox che l'aggiungerà nella lista.
vediamo allora le istruzioni, e nell'esempio useremo come cella iniziale del
nostro elenco la cella A1:
Sub CaricaLista()
'con zonac impostiamo
l'area che si trova dalla cella A1 fino all'ultima colonna occupata,
'andando verso destra (End(xlToRight))
Set zonac = Range(Cells(1, 1), Cells(1, 1).End(xlToRight))
'con x memorizziamo in
numero di quante colonne sono in zonac
x = zonac.Columns.Count
'prima di avviare i cicli che
caricheranno i dati, puliamo la ListBox
ActiveSheet.ListBox1.Clear
'ora inizializiamo il primo
ciclo che scorrerà le colonne, partendo dalla numero 1, 'assegnando
alla variabile z il numero indice
For z = 1 To x
'ora impostiamo con zonar,
andando verso il basso (End(xlDown)) l'area che comprende 'le righe
occupate da dati, e con la variabile y memorizziamo il numero di
queste righe
Set zonar = Range(Cells(1, z), Cells(1, z).End(xlDown))
y = zonar.Rows.Count
'ora iniziamo il secondo
ciclo, che scorrerà tutte le righe contate, nella colonna il cui
'numero è ora rappresentato da z, assegnando alla variabile t il
numero indice di riga, 'partendo dalla 1 e fino alla numero y
For t = 1 To y
'ora memorizziamo con w il
valore che verrà trovato nella cella, riga t, colonna z
w = Cells(t, z).Value
'e carichiamo con AddItem
questo valore (w) nella ListBox
ActiveSheet.ListBox1.AddItem w
Next 'con questo Next passiamo al secondo
indice t (riga successiva), e finito il ciclo alla 'riga y, passiamo
al Next successivo che si occuperà di scorrere nella successiva
colonna, 'ritornando al primo For (z) ripetendo poi il ciclo sulle
righe della nuova colonna.
Next
End Sub |
Mi sembra che le
spiegazioni siano chiare, e vediamo un'immagine che illustra l'esercizio
Ho evidenziato con
le frecce rosse i valori presenti nelle ultime celle di ogni riga per
mostrare come avviene la sequenza di caricamento, progressiva per ogni
colonna. Si vede altresì che si possono caricare indifferentemente sia
testo, sia date, sia numeri.
Buon lavoro.
prelevato sul sito http://ennius.interfree.it |