Alimentare dei valori nelle celle di più fogli di lavoro da un unico elenco. - dal 04/09/04 pagina vista: volte Ovvero: come assegnare valori a celle con selezione del valore preso da una ListBox, ed eliminazione del valore scelto dalla ListBox stessa. Un esercizio non difficile nel suo insieme, ma che richiede come tutti i lavori che si impostano, l'analisi della situazione con impostazione di uno schema da seguire. L'esercizio di per se è fine a se stesso, cioè predisposto per una precisa applicazione, ma si presta altresì a molti altri utilizzi, che possono essere suggeriti da questa idea, e pertanto lo presento. La situazione: una cartella di lavoro con più fogli tutti uguali nello schema tabellare, cioè i range di lavoro iniziano per tutti i fogli nelle medesime celle; in più, un altro foglio, che chiameremo "Master", dove risiedono dei dati, tra i quali una colonna con dei valori. Valori che ovviamente potrebbero essere di qualsiasi natura (testo, numeri, date, ecc.), in questo esempio simuleremo che siano valori alfanumerici, e più precisamente dei codici che identificano "Gruppi di utenza". Vediamo uno dei fogli come esempio: Cosa si vuole ottenere:
A fronte di tutto ciò, e al di la del fatto che si possono seguire diverse strade per ottenere ciò che vogliamo, ho scelto di impostare così il lavoro:
Per prima la routine inserita nell'evento Workbook_SheetSelectionChange, e che ha il compito di definire l'area che reagirà al cambio di selezione (Intersect), per tutti i fogli tranne che per il foglio "Master", e che serve per aprire la UserForm :
Ora vediamo la routine inserita nell'evento di apertura della UserForm (Activate) e che si incarica di prelevare l'elenco dei valori dal foglio "Master", nell'intervallo A1: A200, e caricare la ListBox con il metodo AddItem:
Vediamo ora due immagini: la prima a sinistra mostra, appena si seleziona una cella nel range previsto del foglio di lavoro (la cella A10 in questo esempio), la immediata comparsa della userform; l'immagine a destra invece mostra la copia del valore selezionato nella ListBox nella cella attiva (A10), ottenuta con la pressione sul pulsante "Inserisci", dopo aver selezionato la voce nella ListBox, e la successiva scomparsa dello stesso valore. Risulterà poi selezionato il valore successivo a quello eliminato. Vediamo quindi la routine inserita nell'evento Click del CommandButton, che sfruttando il metodo RemoveItem, cancella il valore che avremo selezionato, dalla ListBox:
Passiamo al caso 2 - Le procedure sono identiche per quanto riguarda gli eventi Workbook_SheetSelectionChange e UserForm_Activate, mentre modificheremo con due nuove istruzioni la routine inserita nel commandbutton. Poichè avremo bisogno di cancellare anche la voce nell'elenco sul foglio "Master" (corrispondente alla voce selezionata nella ListBox), ci potremo permettere di chiudere la UserForm dopo la copia del valore nella cella, tanto alla sua riapertura per una successiva selezione di una cella (zona in verde) verrà ricaricato l'elenco originario dove però mancheranno le voci cancellate, e quindi non più disponibili. Unica controindicazione: in questo modo distruggeremo tutto l'elenco contenuto nel foglio Master. Se volessimo invece scegliere questa seconda strada, ma non perdere definitivamente l'origine dei dati, potremmo lavorare su un elenco copia dell'originale; per esempio disporre il nostro elenco nella colonna C del foglio Master, aggiungere una macro con il compito di copiare l'elenco contenuto nella colonna C nella colonna A (intervallo che serve alla ListBox per "pescare" l'elenco) in modo da poter ripristinare l'elenco una volta distrutto dalla cancellazioni. Questa macro potremo attivarla manualmente tramite un pulsante, e decideremo noi il quando, oppure inserirlo nell'evento Workbook_Open e tutte le volte che riapriremo la cartella otterremo una copia dell'elenco, e questa potrebbe essere l'istruzione: Sheets("Master").[A1:A200] = Sheets("Master").[C1:C200] Vediamo ora la routine modificata da inserire nell'evento Click del commandbutton:
Buon lavoro. prelevato sul sito www.ennius.altervista.org |