ListBox (vale anche per le ComboBox): eliminare dati dalla lista, e stampare la lista. - dal 04/09/04 pagina vista: volte Ovvero: un esame completo di come caricare dati, eliminarne una parte, e infine stampare il contenuto di una ListBox. Ci occupiamo ancora di ListBox (i concetti espressi valgono anche per le ComboBox) ActiveX, cioè presi da "Strumenti di controllo" e non da Moduli. Sembra che ci siano ancora incomprensioni sul come "lavorare" con questi "Oggetti" ActiveX. I termini italiani per riconoscere questi due oggetti sono "Casella":
Sappiamo che per inserire (o se preferite: "caricare") dati in uno di questi due "oggetti" dobbiamo sfruttare le proprietà RowSource, se le "caselle" sono poste su una UserForm, o ListFillRange se invece sono inserite su un foglio di lavoro. Dovremo fornire l'area che contiene i dati da visualizzare (in genere le celle di una colonna di un foglio di lavoro), fornendo i riferimenti dell'area, seguendo questa sintassi:
Le stesse istruzioni varieranno la proprietà se, come detto, si troveranno su un foglio di lavoro, in questo caso dovremo usare la proprietà ListFillRange al posto di RowSource, così : ListBox1.ListFillRange = "A1:A100" . Chiaro fino ad ora? Un'altro modo per "caricare" i dati nelle caselle, è quello di usare il Metodo AddItem, che letteralmente vuol dire: "aggiungi un elemento" e visto che stiamo riferendoci ai dati da caricare, si può intendere come: "aggiungi un dato". Alla stessa stregua, se vorremo togliere, eliminare un dato, useremo il Metodo RemoveItem ("rimuovi un elemento"). Ma per ora esaminiamo solo AddItem. Intanto vediamo come usare la sintassi necessaria a sfruttare il metodo, che è molto semplice: dobbiamo dire su quale oggetto vogliamo aggiungere un elemento, e quale è l'elemento da aggiungere, così:
In questo esempio abbiamo scritto noi direttamente nel codice, i nomi (dati) da caricare, usando il Metodo AddItem, ma quando dovremo prelevare dei dati da un elenco o tabella posto su un foglio, dovremo usare un'altro sistema, un ciclo For Next oppure For Each Next che si incarichi di reperire i dati da far aggiungere, se vorremo sfruttare il metodo AddItem. Se conosciamo già l'ampiezza ( lunghezza ) dell'elenco da caricare, potremo usare un istruzione come questa:
Se invece non sapremo a priori quanto è lungo l'elenco da caricare, potremo usare la funzione End per reperire l'ultima cella occupata nell'area dati, assegnando ad una variabile "elenco" la zona compresa da tutte le celle occupate nella colonna A (in questo esempio, partendo dalla A1), e poi proseguire con il ciclo che cercherà ora nella zona "elenco", così:
In entrambi i casi comunque ciò che volevamo vedere è questa riga di istruzione : ListBox1.AddItem CL.Value che serve appunto ad aggiungere (AddItem) nella ListBox1 il valore che sarà nella cella (CL) letta ad ogni ciclo. Quando e come useremo queste istruzioni? Possiamo scegliere due soluzioni:
Passiamo ora a esaminare alcune proprietà delle "Caselle" che dovremo conoscere. Quando si "traffica" con loro, non possiamo non conoscerle. Cominciamo col dire che una "casella" ha un suo sistema per identificare i dati che contiene, infatti ogni casella possiede un "indice riga" relativo al suo contenuto: è un indice numerico che partendo dal numero zero ( 0 ), si incrementa di una unità per ogni valore ( o dato ) che contiene. ( Non voglio in quest'articolo parlare anche delle colonne; è infatti possibile ottenere ListBox a più colonne, anche loro identificate da un numero indice. ) Queste proprietà sono gestibili in programmazione, e ci aiutano a lavorare con i contenuti delle caselle ( ListBox o ComboBox che siano ), vediamole da vicino; intanto, come trovare queste proprietà, consultando la guida in linea: dall'editor di visual basic, digitare List Box in "indice", indi selezionare in "argomenti trovati (finestra 3)" la voce "Controllo ListBox (Casella di riepilogo)" : nella zona granda a destra compare la spiegazione della voce trovata: in quuesta zona, scritto un blu, troviamo anche la parola "Proprietà"; se clicchiamo su di essa, si apre la finestra che mostrerà tutte le proprietà correlate; con un doppio click sulla proprieta, si aprirà nella pagina sottostante le spiegazioni relative alla proprietà selezionata. Navigando in questo modo, potremo reperire tutte le informazioni che ci servono per capire cose che non sappiamo. Così faccio io, e così potrete fare anche voi, e vedrete che avrete meno necessità di chiedere aiuto. Facciamo comunque un proseguo a beneficio di quei pochissimi che non riusciranno comunque a capire neppure leggendo sulla guida. Vediamo queste proprietà:
Esistono altre proprietà interessanti per la gestione dei dati contenuti in una ListBox, ma non ne parleremo in questo articolo in quanto non pertinenti all'esercizio che vedremo ora. Il problema, vogliamo :
In pratica eliminiamo la testa, la coda e usiamo il cuore; sembra di fare la grappa, no? I lettori attenti avranno già letto l'articolo "Alimentatore valori celle", in questa sezione, dove sono spiegati i passaggi per eliminare valori da ListBox, ma in quell'esempio si toglie un solo valore per volta, qui useremo comunque un CommandButton al quale facciamo cambiare la Caption: se la Caption sarà uguale ad un certo testo, si eseguiranno delle istruzioni, che si occuperanno anche di modificare la Caption e quindi creare la seconda condizione, con altre istruzioni. Ultima cosa da considerare: per poter stampare il contenuto di una ListBox, consiglio di seguire questa procedura: passare il contenuto della ListBox in una zona di un foglio di lavoro, e poi di creare una macro per la stampa dei dati trasferiti su questo foglio. Si può usare lo stesso pulsante usato per le eliminazioni dei valori, con le istruzioni per passare i valori residui dalla ListBox al foglio, e con una domanda "se vogliamo la stampa" e quindi se risponderemo si, predisporre le istruzioni per la stampa dell'area dati del foglio di destinazione. Oppure separare le due procedure affidandosi ad un secondo pulsante che si occuperà di passare i valori dalla ListBox al foglio, e quindi di mandare in stampa l'area del foglio. Comunque vediamo le due soluzioni. Vediamo intanto li istruzioni per caricare la ListBox sfruttando l'evento Activate della IserGorm:
e questa sarà la situazione che vedremo attivando l'userform: la listbox con la lista dei dati provenienti dal range previsto (ovviamente i nomi sono di fantasia) Passiamo ora a esaminare le istruzioni collegate al pulsante "Togli inizio":
Quindi, ricapitolando, avremo bisogno di selezionare un dato (foto1), premere il pulsante, poi riselezioniamo il secondo valore (Foto 2), e premeremo di nuovo il pulsante. vediamo i passaggi, (notare la caption del pusante che cambia il testo dopo ogni pressione):
Bene, ora che abbiamo eliminato i dati che non volevamo mandare in stampa, esaminiamo le istruzioni collegate al CommandButton "Copia & Stampa". E' opportuno per poter stampare i dati contenuti in una ListBox, trasferire gli stessi dati, copiandoli, in una zona di un foglio all'uopo destinato, e mandare il foglio in stampa. Inseriremo un'istruzione per la pulizia delle celle in modo da cancellare dati precedentemente copiati, e tramite un ciclo che legga i numeri indice relativi ai dati, li possa identificare e copiare, scalando una riga per ogni dato. Supponiamo quindi che il foglio destinato alla stampa sia il foglio 2 e che si scelga in questo foglio la colonna A per copiare i dati. Vediamo le istruzioni:
Mi sembra ci sia tutto.
Buon lavoro. prelevato sul sito www.ennius.altervista.org |