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