|
| HOMEPAGE | INDICE FORUM | REGOLAMENTO | ::. | NEI PREFERITI | .:: | RSS Forum | RSS News | NEWS web | NEWS software | |
| PUBBLICITA' | | | ARTICOLI | WIN XP | VISTA | WIN 7 | REGISTRI | SOFTWARE | MANUALI | RECENSIONI | LINUX | HUMOR | HARDWARE | DOWNLOAD | | | CERCA nel FORUM » | |
13-02-2012, 17.10.41 | #2 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
#3
Ambiente di sviluppo e generatore di macro Avrete certamente notato, usando quotidianamente Excel, che capita molto spesso di svolgere le stesse operazioni ripetendo lo stesso comando per compiere normalissime azioni di routine che implicano le stesse modalità di esecuzione. Invece di ripetere la stessa serie di istruzioni ogni volta che si vuole eseguire una determinata operazione è possibile, utilizzando una macro, creare un automatismo che ci permetta di eseguire una serie di comandi automaticamente all'interno dell’applicazione stessa. Le macro sono procedure, o meglio, un insieme di comandi e istruzioni, che permettono di eseguire una serie di operazioni utilizzando un singolo comando, automatizzando attività ripetitive che altrimenti richiederebbero una vasta serie di comandi manuali in sequenza. In pratica una macro è una procedure composta da un insieme di istruzioni che permettono di eseguire un compito ripetitivo e che Microsoft ha reso disponibile nei suoi pacchetti Office anche ai non addetti ai lavori attraverso l'introduzione del Registratore di Macro Il Registratore di macro Un modo semplice per imparare VBA è quello di registrare le proprie macro con lo strumento Registratore di macro, e quindi leggere, eseguire e modificare il codice della macro che avete registrato in Visual Basic Editor. Una macro è un insieme di istruzioni fornite sotto forma di codici per rendere il computer in grado di eseguire un'azione e questo particolare strumento è presente in tutte le applicazioni di Office e permette di registrare una serie di operazioni in una macro per poi essere eseguite quando se ne presenta la necessità. Bisogna tenere presente che una volta attivato il registratore di macro vengono registrate tutte le azioni svolte dall'utente e convertite in codice Visual Basic, pertanto prima di compiere questa azione si devono fissare le condizioni nelle quali successivamente queste macro verranno eseguite, in sostanza, si deve stabilire nel proprio ambiente di lavoro le stesse condizioni che esisteranno quando la macro verrà eseguita. Questa operazione viene definita col termine di fissare le condizioni iniziali, per meglio comprendere si può supporre, per esempio, di voler creare una macro che applica un determinato tipo e dimensione di carattere a delle celle selezionate di un foglio Excel, le condizioni iniziali, che abbiamo accennato prima, sono che questa macro abbia almeno un foglio di calcolo aperto e una cella selezionata. Se avviamo il registratore di macro, dopo visualizziamo un foglio di calcolo e selezioniamo delle celle, tutte queste operazioni entrano a far parte della macro stessa in quanto, come abbiamo già detto, il registratore di macro registra tutte le azioni che si eseguono, anche quelle che esulano dal compito che si vuole assegnare, diventando così parte integrante della macro. In pratica per definire le condizioni iniziali si intende la "preparazione dell’ambiente di lavoro" in modo che il codice della macro contenga esclusivamente le operazioni da svolgere. Per poter mandare in esecuzione una macro dobbiamo prima verificare il grado di protezione che abbiamo impostato in Excel, lo possiamo vedere attraverso questo percorso Strumenti - Macro - Protezione e ci comparirà una maschera come quella sotto riportata Fig. 1 Impostando il livello di protezione su medio, come vedete in Figura 1, verrà mostrato un messaggio di avviso ogni volta che andrete ad aprire file che conterranno macro, e permetterà di scegliere se eseguirle o meno. Il messaggio che vi apparirà è il seguente Fig. 2 Nota: Per versioni di Excel superiori alla 2003 il livello di sicurezza è settato per default con le macro disabilitate, per poter salvare il file con il progetto VBA si deve seguire questo percorso dal menu File - Salva con nome e selezionare nella casella a discesa la voce Cartella di lavoro con attivazione macro di Excel Fig. 3 Ad ogni modo si consiglia di controllare il Centro di protezione per verificare il grado di sicurezza impostato a cui si può accedere dalla barra multifunzione seguendo il percorso dal menu Sviluppo - Sicurezza macro Fig. 4 Successivamente viene visualizzata la finestra del centro di protezione come quella sotto riportata Fig. 5 Si consiglia di selezionare l’opzione “Disattiva tutte le macro con notifica” in questo modo quando viene aperto un file contenente codice VBA Excel rimanda un avviso che il file che si sta per aprire contiene un progetto VBA che identifica come potenzialmente pericoloso. Scegliendo questa opzione quando poi andiamo ad aprire un file che contiene macro ci viene portato a video sotto la barra dei menù un avviso in cui possiamo scegliere se attivarle oppure no Fig. 6 E’ doveroso ricordare che le macro possono contenere codice dannoso o anche un'applicazione virale, pertanto fate attenzione nell'aprire file che riporteranno il messaggio sopra esposto, aprite file contenenti macro solo se siete certi della fonte. Fine Nota Fatta questa premessa iniziamo a costruire la nostra prima macro utilizzando il registratore di Macro che si trova nel menu Strumenti - Macro - Registra nuova macro Fig. 7 Nota: Per versioni di Excel superiori alla 2003 il percorso che dobbiamo seguire per registrare una nuova macro è: Visualizza - Macro - Registra Macro Fig. 8 Fine Nota Eseguita questa operazione ci comparirà una finestra come quella sotto riportata Fig. 9 Vediamo i vari campi che compaiono in questa finestra Nome macro: La prima opzione della finestra di dialogo è il Nome Macro che per default viene assegnato un nome che consiste nella parola Macro seguita da un numero in funzione del numero di macro già registrate in quella sessione di lavoro. Si consiglia però di assegnare un nome più significativo e personalizzato per identificare il compito assegnato alla macro. Per esempio se si registra una macro che cambia il tipo e la dimensione del carattere si può immettere il nome Cambiacaratt nel campo di testo del nome della macro Tasto di scelta rapida: si può usare facoltativamente la casella di immissione rapida da tastiera per definire una combinazione di tasti che quando verrà premuta porterà all'esecuzione della macro, immettendo quindi la lettera che si vuole usare come "tasto rapido". Si consiglia di usare questa opzione solo nel caso in cui si ritenga che in seguito la macro verrà usata molto spesso. Ricordo inoltre che tutte le combinazioni di tasti rapidi o "scorciatoie" sono combinazioni tra il tasto Ctrl (Control) e il tasto che viene assegnato, per esempio, se inseriamo Z nell'apposito campo, per eseguire la macro basta usare la combinazione di tasti CTRL+Z Memorizza macro in: In questo campo di testo è possibile scegliere dove salvare la macro una volta registrata. Le scelte previste sono:
Se si sceglie Cartella macro personale Excel salva la macro in una speciale cartella detta Personal.xls che viene caricata automaticamente quando si avvia Excel. Se invece si sceglie "Questa cartella di lavoro", la macro verrà salvata nella cartella corrente (scelta consigliata) Descrizione: Le informazioni inserite in questo campo non vengono usate dalla macro ma servono solo per aggiungere alcune note o commenti su ciò che fa la macro, per default il VBA immette una descrizione costituita dalla data di registrazione della macro e dall'autore Per fornire un esempio specifico, si supponga che tutti i giorni si debba aprire un file che si chiama "Lezione1" e si deve scrivere nella cella A1 del Foglio1 Inizio ore 08,00 e nella cella A1 del Foglio2 Fine ore 12,00 potremmo automatizzare questa procedura usando una macro. Premiamo sul tasto OK della figura sopra esposta (Fig. 9) e procediamo alla creazione della macro. Innanzi tutto attiviamo il Foglio1 e portiamo il cursore nella cella A1 e scriviamo la frase Inizio ore 08,00 e poi premiamo il tasto Invio, portiamoci poi nel Foglio2 e nella cella A1 e scriviamo la frase Fine ore 12,00 e premiamo ancora Invio Ritorniamo poi al Foglio1 e possiamo anche interrompere la registrazione della nostra macro seguendo questo percorso: Strumenti - Macro - Interrompi registrazione Fig. 10 A questo punto la nostra macro è stata creata, la procedura di fine registrazione può essere eseguita nel modo sopra descritto oppure al momento della registrazione può comparire a video anche un box come il seguente Fig. 11 La finestra di figura 11 rimarrà sullo schermo durante la registrazione, è possibile spostarlo come volete, e per fermare la registrazione basta premere sul pulsante quadrato che vedete in figura. Nota: Per versioni di Excel superiori alla 2003 per interrompere la registrazione della macro si deve seguire il seguente percorso Visualizza - Macro - Interrompi Registrazione e la finestra riportata in figura 11 si chiude Fig. 12 Fine Nota A questo punto possiamo verificare se la macro registrata funziona, cancelliamo quello che abbiamo scritto nei due fogli e proviamo a mandarla in esecuzione, seguendo il percorso dal menu Strumenti - Macro - Macro Fig. 13 Nota: Per versioni di Excel superiori alla 2003 per mandare una macro in esecuzione il percorso da seguire è: Visualizza - Macro - Visualizza Macro Fig. 14 Fine Nota In seguito si apre una maschera come la seguente Fig. 15 In questo box vengono elencate tutte le macro registrate o scritte direttamente all'interno dell'editor, basta solo selezionare col mouse la macro interessata e premere sul pulsante Esegui per mandarla in esecuzione, oppure utilizzando il tasto di scelta rapida associato alla macro (CTRL+Z) o semplicemente premendo il tasto F5. Si può eseguire una macro in modalità interruzione, (o Step by Step) selezionando la macro e cliccando sul pulsante “Esegui Istruzione” che aprirà la finestra dell’Editor con il modulo che contiene la macro selezionato e già attivo e col cursore posizionato sulla prima riga di codice selezionata in giallo. Le istruzioni verranno eseguite premendo il tasto F8, questa è un’opzione per poter verificare il funzionamento della macro passo-passo. Premendo il tasto “Elimina” la macro selezionata verrà eliminata e cliccando sul tasto “Opzioni” si può cambiare l’assegnazione del tasto di scelta rapido e la descrizione della macro. Cliccando invece su “Modifica” si visualizza il codice della macro registrata, e si accede all’Editor di VBE con la finestra dell’Editor già aperta e il codice della macro che è stato prodotto dall’azione compiuta. Nel nostro esempio troveremo un codice come il seguente: Codice:
Sub Macro1() ' ' Macro1 Macro ' prova registratore di macro ' ' Range("A1").Select ActiveCell.FormulaR1C1 = "Inizio ore 8,00" Range("A2").Select Sheets("Foglio2").Select ActiveCell.FormulaR1C1 = "Fine ore 12,00" Range("A2").Select Sheets("Foglio1").Select End Sub Le prime 5 righe sono precedute da un apice e sono dei commenti che vengono ignorate dal VBE, praticamente sono le frasi che abbiamo inserito in fig. 15 all’inizio della registrazione, mentre alla riga 6 viene selezionata la cella A1 tramite l’istruzione ‘Select’ e nella riga successiva viene inserita la scritta “Inizio ore 8,00” mentre alla riga successiva viene selezionata la cella A2 che corrisponde alla pressione del tasto Invio che rimanda a capo e seleziona la cella A2 nel foglio di lavoro. Nella riga 9 viene selezionato il foglio 2 e nella riga successiva viene inserita la scritta “Fine ore 12,00” nella cella A1, si passa poi alla cella A2 quando viene premuto il tasto invio nel foglio di lavoro che rimanda a capo e infine si ritorna al foglio 1 terminando la registrazione. Se si desidera che una macro selezioni una cella specifica, esegua un’azione e poi selezioni un’altra cella mediante un riferimento relativo alla cella attiva, è possibile utilizzare dei riferimenti di cella definiti relativi e assoluti durante la registrazione della macro. Per registrare una macro utilizzando riferimenti relativi, si deve attivare la funzione dal percorso Visualizza – Macro – Usa riferimenti relativi della barra multifunzione Fig. 16 Definizione di “riferimento assoluto” Per “riferimento assoluto” si intende l’indirizzo esatto di una cella, indipendentemente dalla posizione della cella contenente la formula. Un riferimento assoluto ha la forma $A$1, in pratica viene inserito il simbolo $ prima del riferimento, notare che possono esistere riferimenti di cella misti, che presentano la seguente forma A$1, in questo caso il riferimento assoluto è riferito alla riga, mentre un riferimento assoluto per la colonna ha la forma $A1. Diversamente dai riferimenti relativi, i riferimenti assoluti non si adattano automaticamente quando si copiano delle formule su righe e colonne. Codice:
Sub copia() ' copia nella cella A1 il contenuto di A3 ' indirizzamenti assoluti Range("A1").Value = Range("A3").Value End Sub Definizione di “riferimento relativo” Per “riferimento relativo”si intende un riferimento di cella, utilizzato in una formula, che cambia quando la formula viene copiata in un’altra cella o intervallo. Dopo che la formula viene copiata e incollata, il riferimento relativo nella nuova formula cambia per fare riferimento a una cella differente distante dalla formula lo stesso numero di righe e colonne che distanziano il riferimento relativo originale dalla formula originale. Se ad esempio la cella A3 contiene la formula =A1+A2 e si copia la cella A3 nella cella B3, la formula nella cella B3 diventa =B1+B2. Mentre invece la formula "=R[-1]C*2" è un esempio di riferimento relativo e si riferisce alla riga precedente [-1] a quella attiva e la stessa colonna. Limitazioni del Registratore di macro Si può osservare che la procedura di registrazione di una macro, anche se è un modo semplice e uno strumento utile per imparare e creare codici VBA, può essere utilizzato solo per i codici semplici e di base e non per la creazione di codici avanzati e procedure complesse a causa di alcune limitazioni. Durante la registrazione di una macro è possibile creare solo sotto-procedure e non le funzioni che restituiscono un valore, non è possibile allocare in memoria le informazioni durante la registrazione e non possono essere utilizzate le variabili, oppure utilizzare istruzioni condizionali quali If-Then, o utilizzare cicli Loop, o chiamare altre procedure o funzioni. Un codice di una macro registrata è di solito inflessibile e non è il più efficace, anzi necessita sempre di una pulizia nelle linee di codice dalle informazioni inutili aggregate alla macro registrata.
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
13-02-2012, 17.11.41 | #3 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Gestione degli errori - Metodi e proprietà La gestione degli errori si riferisce ad una particolare tecnica di programmazione che consiste nell’anticipare e prevedere le condizioni di errore che possono sorgere quando il programma viene eseguito. In generale gli errori possono essere di tre tipi:
Errori di sintassi Viene detta sintassi lo specifico ordine di parole che costituisco un enunciato VBA valido e alcuni dei più comuni messaggi di errore che possono verificarsi mentre si scrive o si edita una procedura sono relativi a errori di sintassi. I messaggi di errore di sintassi segnalano un problema in un enunciato quali, virgole, virgolette argomenti mancanti o simili. Ogni volta che si scrive una nuova riga di codice o se ne modifica una, il VBA esamina la riga non appena il cursore si sposta da essa. Questa operazione che viene detta Parsing è il processo di scomposizione di un enunciato nelle varie parti al fine di determinare quali sono le parole chiave, le variabili o i dati. Dopo che il VBA ha esaminato senza rilevare errori una riga di codice, procede alla sua compilazione (in VBA la compilazione è la conversione del codice sorgente in una forma direttamente eseguibile dal VBA senza dover ripetere l’operazione di Parsing) Si deve tenere presente che la finestra del codice nell'Editor di VB presenta le parole scritte in vari colori, questa "applicazione" del colore viene eseguita dopo aver esaminato una riga di codice e non aver rilevato errori, al contrario, se viene rilevato un errore in fase di esame o compilazione della riga il VBA colora di rosso l’intera riga e visualizza una finestra di dialogo con un messaggio di errore Errori Run-time E’ possibile scrivere un enunciato VBA senza alcun errore di sintassi, ma che tuttavia non porta a un’esecuzione corretta, gli errori che si manifestano solo in fase di esecuzione della procedura vengono detti errori runtime. Ne esistono di vari tipi e di solito sono causati dalla mancanza di argomenti o dall'uso di argomenti di tipo errato, dalla mancanza di certe parole chiave o dal tentativo di accedere a dischi o directory non esistenti o da errori logici. Errori logici Questo tipo di errore è il più difficile da tracciare se la sua sintassi è corretta e funziona senza rimandare errori di esecuzione, si può definire come un errore da nessuna indicazione all’utente che si è verificato un errore dovuto al fatto che un errore logico è il processo di logica e non il codice stesso a generare l’errore. L’esecuzione di un calcolo in un foglio di lavoro utilizzando una funzione restituirà una risposta, ma è la risposta corretta? Per meglio comprendere simuliamo un errore scrivendo il codice sotto riportato in un modulo e mandandiamolo in esecuzione Codice:
Sub prova() Sheets("Foglio11").Range("F5").Select End Sub Fig 1 Come si può intuire dal testo si tratta di un errore generato dal codice, premendo sul pulsante Debug verrà automaticamente aperto l'editor di VBA e verrà riportata la routine (o Sub) che lo ha causato Fig. 2 Nella figura sopra riportata si può notare che la riga di codice che ha causato l'errore è già evidenziata in giallo e questo facilita notevolmente le cose, l’errore è già individuato e si può intervenire e correggere il codice, tuttavia l'errore ha bloccato l'esecuzione della macro e per poter continuare ad operare si deve ripristinare l'editor (cioè sbloccarlo) e in seguito rimediare all'errore. Per eseguire questa operazione basta premere sul pulsante blu in alto nella barra degli strumenti contrassegnato dalla freccia rossa, il quale interrompe il Debug del codice e ripristina l'uso dell'editor. Spieghiamo ora la natura dell'errore: nella nostra cartella di lavoro, l'errore è stato causato per il semplice fatto che non esiste all'interno della stessa un foglio denominato Foglio11, per cui VBA ha evidenziato questa situazione con un errore di run-time interrompendo l'esecuzione della macro, in pratica non ha trovato il percorso che gli è stato indicato. Esaminiamo ora il seguente codice : Codice:
Sub prova() MsgBox “Ciao Mondo”, “Messaggio di saluto” End Sub Fig. 3 In questo caso non ci sono errori di sintassi nell'enunciato MsgBox, i testi sono correttamente posti tra virgolette, ed è presente la virgola di separazione tra gli argomenti (Ndr. Tutti gli argomenti di MsgBox, salvo il primo, sono opzionali pertanto VBA accetta la presenza di due soli argomenti per MsgBox come sintassi corretta), ma quando VBA cerca di eseguire l’enunciato visualizza una finestra di dialogo di errore come sopra esposta. Questa finestra di dialogo informa che l’errore si è verificato in fase di esecuzione della procedura e contiene un messaggio che descrive l’errore stesso, in questo caso si tratta di un argomento di tipo errato (non corrispondente). In effetti esaminando la riga, si vede che manca lo spazio che funge da segnaposto per il secondo argomento, Buttons, facoltativo. Quando VBA sottopone al Parsing l’enunciato, compila il testo fra virgolette “Messaggio di saluto” come secondo argomento di MsgBox invece di terzo argomento, a causa dell’omissione del segnaposto fra le due virgole. Dato che l’argomento buttons deve essere un numero e non un testo, il VBA segnala che il tipo di dati passato alla procedura MsgBox non è del tipo giusto per quell'argomento. E’ possibile intercettare un errore nel progetto VBA con l'istruzione On Error per deviare il flusso del programma verso una routine che gestisca l’errore trasmettendo le istruzioni necessarie per risolverlo. Per poter controllare un errore si inserisce all'inizio della routine l’istruzione On Error GoTo [etichetta] e quando si verifica un errore, questa parola chiave interrompe l’esecuzione del codice del programma per "saltare" alla posizione contrassegnata da [etichetta] che deve trovarsi nella stessa procedura che contiene l’istruzione On Error. Per esempio se la routine Command1_Click ha come prima istruzione un On error goto err (dove err è il nome dell’etichetta) in caso di errore il flusso del programma va direttamente all'istruzione presente nell'etichetta err, dove si deve inserire il codice o la procedura che tratteranno opportunamente l’errore. Se invece tutto il flusso del programma procede correttamente, l’istruzione On Error viene ignorata e si arriva alla fine della routine. Ci sono vari modi per gestire un errore utilizzando le seguenti istruzioni:
Codice:
Sub Command1_Click() On Error GoTo err MsgBox “Ciao Mondo”, “Messaggio di saluto” Exit_Command1: Exit Sub err: MsgBox Err.Description Resume Exit_Command1 End Sub Fig. 4 La forma On Error Goto 0, è la modalità predefinita in VBA e indica che quando si verifica un errore di runtime VBA dovrebbe visualizzare la sua finestra di messaggio di errore in fase di esecuzione standard, consentendo di immettere il codice in modalità di Debug o di terminare il programma VBA. In pratica avere On Error Goto 0 è come non avere un gestore degli errori attivato, in quanto qualsiasi errore causerà VBA verrà visualizzata la casella di messaggio di errore standard. La forma, On Error Resume Next, è la forma più comunemente usata e abusata, con questa espressione si insegna a VBA di ignorare essenzialmente l'errore e riprendere l'esecuzione sulla riga successiva di codice. E 'molto importante ricordare che On Error Resume Next non risolve in nessun modo l'errore, ma indica semplicemente a VBA di continuare come se non ci fosse stato nessun errore. Tuttavia, l'errore può avere effetti collaterali, come variabili o oggetti impostati su Nothing non inizializzate ed è una responsabilità del codice di verificare una condizione di errore e prendere i provvedimenti opportuni. A tale scopo, vedendo il codice sotto riportato si deve testare il valore di Err.Number e se non è zero si deve eseguire la correzione appropriata. Per esempio: Codice:
On Error Resume Next N = 1/0 If Err.Number <> 0 Then N = 1 End If La forma On Error Goto [etichetta] indica a VBA di trasferire l'esecuzione alla riga che segue l'etichetta di riga specificata e ogni volta che si verifica un errore, l'esecuzione del codice va subito alla linea che segue l'etichetta di riga e non viene eseguita nessuna istruzione presente nel tra l'errore e l'etichetta, incluse le affermazioni di controllo del ciclo. Codice:
On Error Goto Err11: N = 1/0 'altro codice Exit Sub Err11: 'codice di gestione degli errori Resume Next End Sub Un gestore di errori è detto attivato quando un’istruzione On Error viene eseguita e indica il codice che viene eseguito quando si verifica un errore e l'esecuzione viene trasferita in un'altra posizione tramite la dichiarazione On Error Goto [etichetta]. Possiamo definire un blocco di gestione degli errori, chiamato anche gestore di errori, una sezione del codice che prende il controllo del programma attraverso una dichiarazione On Error Goto [etichetta]. Questo codice deve essere progettato sia per risolvere il problema e riprendere l'esecuzione nel blocco di codice principale o di interrompere l'esecuzione della procedura, non è possibile utilizzare On Error Goto [label] semplicemente per “saltare” tra le linee di codice. Ad esempio, il seguente codice non funzionerà correttamente: Codice:
On Error GoTo Err1: Debug.Print 1/0 'altro codice Err1: On Error GoTo Err2: Debug.Print 1/0 'altro codice Err2: L'istruzione Resume La dichiarazione Resume indica al VBA un punto specifico del codice dove riprendere l’esecuzione, inoltre è possibile utilizzare Resume solo in un blocco di gestione degli errori, qualsiasi altro uso causerà un errore. Si deve considerare che Resume è l'unico modo, a parte uscire dalla procedura, per uscire da un blocco di gestione degli errori. Si deve ricordare di non utilizzare la dichiarazione Goto per dirigere l'esecuzione del codice da un blocco di errore, agire in questo modo si causeranno strani problemi ai gestori di errori. La dichiarazione Resume può assumere tre forme sintattiche
Codice:
On Error GoTo Err1: Worksheets("Foglio11").Activate Exit Sub Err1: If Err.Number = 9 Then 'il foglio non esiste, quindi lo crea Worksheets.Add.Name = "Foglio11" 'torna alla riga di codice che ha causato il problema Resume End If Codice:
On Error GoTo Err1: N = 1 / 0 Debug.Print N Exit Sub Err1: N = 1 'torna alla riga successive che ha causato l’errore Resume Next Codice:
On Error GoTo Err1: N = 1 / 0 'codice che viene saltato se si verifica un errore Label1: ‘codice da eseguire Exit Sub Err1: ‘ritorna alla linea Label1 Resume Label1:
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
13-02-2012, 17.17.10 | #4 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Le Variabili: Nozioni di base In programmazione, una variabile è un valore che viene affidato al computer per memorizzarlo temporaneamente nella sua memoria mentre il programma è in esecuzione. Si deve tener presente che la memoria del computer è suddivisa in piccole aree di stoccaggio utilizzate per contenere i valori delle applicazioni e quando si utilizza un valore nel codice, il computer lo memorizza in una di queste aree per poi rilasciarlo quando viene richiamato. Immaginiamo che una variabile sia come una casella in cui si può inserire un dato di qualsiasi tipo e salvarlo per impiegarlo successivamente. Il nome della variabile è l'etichetta che identifica la casella e il contenuto della casella è il valore della variabile, la particolarità di una variabile è di poter cambiare il suo valore durante l'esecuzione della macro, mentre il nome rimane inalterato. Possiamo quindi sintetizzare che una variabile è il nome assegnato ad una specifica locazione di memoria del computer, e possiamo usare il nome della variabile per riferirci a qualsiasi dato contenuto in quella determinata locazione di memoria. Il nome di una variabile deve essere scelto seguendo poche regole
Per creare una variabile, è abbastanza semplice, da quanto abbiamo esposto finora basta solo dargli un nome ed assegnarli un valore, vediamone un esempio. alex = 10 Questo enunciato memorizza il valore 10 nella locazione di memoria denominata alex, se si tratta del primo enunciato VBA crea la variabile, riserva una locazione di memoria per contenere il dato della variabile e poi memorizza il valore 10 in questa nuova locazione di memoria specificato dal nome della variabile. Molto semplicemente basti ricordare che tutto ciò che si mette sul lato destro di un segno di uguale è quello che si sta tentando di memorizzare e tutto quello che si ha a sinistra del segno di uguale è il luogo in cui si sta cercando di conservarlo. Se la variabile alex esiste già VBA memorizza il nuovo valore nella locazione di memoria a cui fa riferimento la variabile alex, in pratica sovrascrive il valore Questa procedura è definita una "dichiarazione implicita", oppure "dichiarazione al volo", risulta molto comoda ma può presentare degli inconvenienti, infatti usando il metodo implicito la variabile creata da VBA è di tipo Variant (tutti i tipi di dati), inoltre se in seguito digitiamo il nome sbagliato (es. Alex), a seconda del punto in cui il nome sbagliato compare nel codice il VBA può generare un errore di runtime, oppure possiamo anche usare la sintassi corretta, ma così andremmo a distruggere il valore memorizzato precedentemente. Allora come possiamo ovviare a questi inconvenienti? Dichiarando le variabili. Dichiarazione di una variabile Durante la scrittura del codice, è possibile utilizzare qualsiasi variabile semplicemente specificandone il nome, ed è possibile utilizzare qualsiasi nome per una variabile, ma per eliminare la possibilità di fare confusione, si deve innanzitutto far sapere al VBA che si prevede di utilizzare una variabile, al fine di prenotare l'area di stoccaggio. La dichiarazione delle variabili è definita “Dichiarazione esplicita" e presenta i seguenti vantaggi
La dichiarazione di una variabile comunica semplicemente al VBA il nome della stessa ma è comunque possibile utilizzare un mix di variabili dichiarate e non dichiarate. Se si dichiara una variabile e poi si inizia ad utilizzare un'altra variabile con un nome simile, per Visual Basic si stanno utilizzando due variabili e questo può creare confusione. La soluzione a questo problema è di dire a Visual Basic che una variabile non può essere utilizzata se non è stata dichiarata e per ottenere questo, basta inserire la parola chiave Option Explicit all'inizio del listato. Questa operazione può anche essere fatta automaticamente per ogni file controllando che sia inserita la spunta alla voce Richiedi dichiarazione di variabili nella finestra di dialogo Opzioni dell’editor di VB Per dichiarare esplicitamente una variabile si usa la parola chiave Dim seguita da un nome. Ecco un esempio: Dim nome_variabile che nel nostro esempio diventa Dim alex E’ indubbio che dichiarando le variabili ne ricaviamo notevoli benefici, ma l'errore umano nella digitazione del codice è sempre in agguato, per tutelarsi ulteriormente possiamo inserire un'altra parola chiave Option Explicit, se aggiungiamo questa parola chiave nell'area delle dichiarazioni di un modulo, cioè all'inizio del modulo prima di qualsiasi altra dichiarazione o listato, il VBA ci richiede di dichiarare tutte le variabili tramite l'enunciato Dim prima di usarle, in pratica l'enunciato Option Explicit proibisce di dichiarare implicitamente variabili in ogni punto del modulo, possiamo dire che con l'istruzione Option Explicit abbiamo aggiunto un altro pezzettino al nostro listato per garantirne una perfetta esecuzione. Una dichiarazione implicita contiene dati di tipo Variant, però il nostro obbiettivo è quello di abbinare le potenzialità di VBA per utilizzare o manipolare vari tipi di dati presenti nel nostro foglio di Excel, se per esempio volessimo eseguire una somma tra i dati contenuti in due variabili avremmo sicuramente una incompatibilità nei dati e quasi certamente ci verrà rimandato un errore. Per ovviare a questo ultimo inconveniente usiamo un'altra parola chiave nella dichiarazione della variabile e aggiungiamo anche il tipo di dati che andrà a contenere. La parola chiave è As e l'enunciato si presenta in questo modo: Dim nome_variabile As tipo che nel nostro esempio diventa così Dim alex As Integer Così facendo abbiamo creato una variabile di nome alex e abbiamo dichiarato che è di tipo numerico. In una normale applicazione, non è raro dover utilizzare molte variabili e si dovrebbe prendere l'abitudine di dichiarare sempre una variabile prima di utilizzarla. Per dichiarare una nuova variabile dopo averne dichiarato una prima, si può semplicemente andare alla riga successiva e utilizzare la parola chiave Dim per dichiarare quella nuova. Ecco un esempio: Dim pippo Dim pluto Allo stesso modo, è possibile dichiarare quante variabili vogliamo, inoltre è possibile dichiarare più variabili sulla stessa riga e per effettuare questa operazione, si utilizza sempre la parola chiave Dim separando i nomi delle variabili con una virgola. Ecco un esempio Dim pippo, pluto, minni, alex Vediamo un esempio di codice sul loro utilizzo Codice:
Sub var1() Dim alex As String alex = "Ciao a tutti" MsgBox alex End Sub Fig. 1 In questo modo abbiamo dichiarato la variabile all'interno della routine o sub var1 e può essere usata solo in quella routine, infatti se usiamo questo codice Codice:
Sub var1() Dim alex As String alex = "Ciao a tutti" stampa_box End Sub Private Sub stampa_box() MsgBox alex End Sub Fig. 2 Non ci viene rimandato un errore, in quanto il comando MsgBox viene eseguito, ma non vediamo nessuna scritta, cioè la variabile alex non viene riconosciuta e non appare nel nostro box. Abbiamo parlato poco sopra di dichiarazione delle variabili nell'area di dichiarazione del modulo, assieme alla parola chiave Option Explicit, abbiamo anche già visto i benefici di questa particolare procedura, ma se in quell'area aggiungessimo anche la dichiarazione della variabile cosa succederebbe? Semplicemente che la variabile sarebbe condivisa e utilizzabile da tutte le routine di quel modulo. Vediamo un esempio modificando il codice del listato sopra esposto Codice:
Option Explicit Dim alex As String Sub var1() alex = "Ciao a tutti" stampa_box End Sub Private Sub stampa_box() MsgBox alex End Sub Fig. 3 Se eseguiamo questa macro verrà mostrato il contenuto della variabile in una finestra Fig. 4 Avrete notato che nella routine principale è stato inserito il nome di un’altra routine cioè stampa_box, in questa forma la macro riconosce che quella è una chiamata ad un'altra macro e la esegue, inoltre la routine stampa_box è preceduta dalla funzione Private, che viene usata quando vogliamo utilizzare una routine di quel modulo e solo in quello, al tempo stesso questa ruotine non ci compare nella finestra di assegnazione delle macro. Abbiamo visto l’utilità nell’inserire la parola chiave Option Explicit nel listato, è possibile evitare di inserire in ogni modulo tale riga di codice agendo nelle opzioni dell’editor per garantire che Option Explicit sia sempre inserito nella parte superiore del modulo operando in questo modo: dal menu Strumenti - Opzioni e nella finestra che ci viene mostrata mettere il flag alla voce Dichiarazione di variabili obbligatoria. Come mostrato in figura 5 Fig. 5 Messa la spunta cliccare sul tasto Ok per confermare. È ora necessario utilizzare sempre la parola chiave Dim per dichiarare una variabile, in caso contrario verrà rimandato un errore di “Variabile non definita”. Abbiamo anche visto l'uso della funzione Private, quando facciamo programmi con listati lunghi e usiamo diversi moduli, ne facilita l'interpretazione del codice e il debug in caso di errore. Abbiamo visto che tutte le variabili dichiarate all’interno di una procedura sono disponibili solo all’interno della procedura in cui le dichiarate, mentre quelle che dichiarate a livello di modulo (come in Fig. 3) sono disponibili a tutte le procedure all’interno del modulo in cui sono state dichiarate, ma non sono disponibili a procedure in un modulo diverso. In VBA gli elementi che sono disponibili a tutti i moduli vengono definiti a validità pubblica e sono chiamati variabili globali, perché sono disponibili globalmente cioè in tutto il vostro programma tramite la parole chiave Public usando la seguente sintassi Public NomeVariabile [As NomeTipo] Dove NomeVariabile rappresenta un nome valido qualsiasi per identificare la variabile e NomeTipo un qualsiasi nome di tipo di dato valido per fare un esempio vediamo il listato di prima modificandone la dicitura con la parola chiave Public come mostrato in figura 6 Fig. 6 Utilizzare Public per dichiarare una variabile a livello globale può essere utile quando si ramifica il programma in diversi moduli ma è da usare con molta attenzione specialmente nell’assegnazione del nome alla variabile per evitare di creare confusione se esistono due variabili con lo stesso nome in moduli diversi, pertanto cercate di essere espliciti nell’uso della variabile nella forma Public Tuttavia, si deve tener presente che ci troviamo in ambiente Excel, un foglio di calcolo, con celle che contengono valori, per cui dobbiamo chiederci anche cosa si vuole fare di questa variabile e del valore in esso contenuto. Dopo tutto, che senso avrebbe memorizzare un valore, se non lo si vuole usare? Quello che possiamo fare è di trasferire il nostro valore memorizzato nella variabile in una cella del foglio di calcolo. Precedentemente abbiamo visto la proprietà di Range che tramite la proprietà Value può ottenere o impostare il valore di una cella, o un gruppo di cellule. Per impostare un valore, la proprietà Range va messa prima di un segno di uguale, in questo modo: Sheets(“Foglio1”) .Range ( "A1"). Value = In questo modo vogliamo puntare al Range A1 del foglio con nome “Foglio1” e dopo il punto, dobbiamo quindi inserire il valore da assegnare alla cella A1 tramite la proprietà Value e dopo il segno di uguale, è possibile digitarne il valore in questo modo: Sheets(“Foglio1”) .Range ( "A1"). Value = 10 Ora, il valore per la cella A1 sul foglio di lavoro “Foglio1” è impostato su 10 Per assegnare un valore è possibile digitare il nome di una variabile invece di digitare un numero. Se nel listato del codice abbiamo precedentemente assegnato il valore 10 alla variabile “var1” possiamo esprimere il listato in questo modo: Sheets(“Foglio1”) .Range ( "A1"). Value = var1 VBA vede la variabile denominata var1 quindi recupera qualsiasi valore memorizzato all'interno di esso e tale valore viene quindi memorizzato all'interno di ciò che è a sinistra del segno uguale.
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
13-02-2012, 17.19.19 | #5 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Prendere decisioni – Ciclo If e Select Case Finora abbiamo visto delle procedure che sono in grado di portare a termine i compiti assegnati, ma però non sono in grado di prendere delle decisioni che permettano di eseguire diverse azioni in circostanze differenti, operazione che risultano necessarie in molte situazioni. A volte è necessario che sia la procedura stessa ad offrire la possibilità di poter scegliere quale azione intraprendere al verificarsi di un determinato evento, per esempio possiamo scrivere una procedura che controlli una colonna in un foglio di lavoro per verificare se tutti i numeri sono compresi tra 1 e 10, inoltre la procedura potrebbe poi esaminare ogni elemento della colonna separatamente ed eseguire azioni particolari se incontra un elemento non compreso nell'intervallo specificato. Il Ciclo IF Poichè le istruzioni per l'esecuzione di scelte modificano il flusso di esecuzione del programma, vengono spesso chiamate istruzioni di controllo di flusso o di controllo di programma, ma sono più note tecnicamente agli addetti ai lavori come istruzioni condizionali e incondizionali. Un'istruzione condizionale è una struttura per l'esecuzione di scelte, che sceglie un blocco di istruzioni del codice del programma basandosi su una condizione o su un gruppo di condizioni predefinite, mentre un'istruzione incondizionale è un'istruzione che modifica semplicemente il flusso di esecuzione della procedura senza dipendere da nessuna condizione specifica. Vediamo in dettaglio questo concetto. Per eseguire un'istruzione condizionale usiamo la funzione If ed è rappresentata in due modi If Condizione Then Istruzioni End If Oppure a riga singola If Condizione Then Istruzioni Quando VBA incontra un'istruzione condizionale come If ....Then, prima valuta l'espressione logica che descrive le condizioni, in base alle quali deve essere eseguita una particolare azione, se l'espressione è True (cioè vera) le condizioni predefinite sono state soddisfatte e vengono eseguite le istruzioni indicate, mentre End If indica la fine del ciclo decisionale. Vediamo questa procedura con degli esempi Codice:
Sub prova() Dim var1 As Integer var1 = "1" If var1 = "1" Then MsgBox ("Bravi") End Sub If Condizione Then Istruzioni Else Istruzioni per Else End If In pratica da quanto sopra esposto aggiungiamo altre istruzioni nel caso che la condizione non venga soddisfatta, lo possiamo capire meglio con questo esempio Codice:
Sub prova1() Dim var1 As Integer var1 = "2" If var1 = "1" Then MsgBox ("Bravi") Else MsgBox ("Condizione non soddisfatta") End If End Sub Codice:
Sub prova() Dim var1 As Integer var1 = "2" If var1 = "1" Then MsgBox ("Bravi") Else MsgBox ("Condizione non soddisfatta") End Sub If Condizione Then Istruzioni Else If Condizione1 Then Istruzioni1 Else Istruzioni 2 End If End If Vediamo con un esempio come nidificare più istruzioni ed usiamo anche la funzione InputBox che abbiamo visto all'inizio Codice:
Sub nidifica() Dim var1 var1 = InputBox(prompt:="Inserisci a quanti gradi metti il termostato del riscaldamento: ", Title:="Misura la temperatura di casa") If Pianeta > 20 Then MsgBox "Troppo caldo, vedrai che bolletta" Else If var1 > 18 Then MsgBox "Temperatura giusta" Else MsgBox "Temperatura troppo bassa, ti prendi un raffreddore" End If End If End Sub Fig. 1 Fig. 2 Se invece inseriamo il valore 19 otteniamo questi messaggi Fig. 3 Fig. 4 Inserendo invece il valore 17 ci viene mostrato questo avviso Fig. 5 Fig. 6 Vediamo nel dettaglio casa abbiamo fatto, per comprendere meglio la nidificazione usiamo anche i colori, all'inizio abbiamo dichiarato la variabile var1 ed abbiamo omesso di specificare il tipo di dati (ricordate che nella lezione 3 abbiamo detto che non dichiarando il tipo di dati la variabile assumeva per default il tipo Variant, in questo esempio è di scarsa importanza il tipo di dati), poi tramite la funzione InputBox abbiamo richiesto un dato dall'utente e di seguito abbiamo elencato le condizioni. La prima If var1 > 20 Then confronta il valore della variabile var1 e avendole assegnato il valore 30 tramite InputBox viene soddisfatta la prima condizione che abbiamo posto, cioè, se var1 è maggiore di 20, porta a video il messaggio Troppo caldo, vedrai che bolletta a questo punto che la condizione è stata verificata e soddisfatta l'esecuzione continua dopo la parola chiave End If, in questo caso segue la procedura di colore blu e ci riporta a fine codice. Se nell'InputBox inseriamo un valore diverso (ad esempio 20) la prima condizione If var1 > 20 Then non viene soddisfatta ed allora passiamo alle istruzioni Else dove, in questo blocco di istruzioni, abbiamo posto 2 condizioni, la prima che viene verificata è If var1 > 18 Then (Se var1 è maggiore di 18), porta a video il messaggio Temperatura giusta, nel nostro caso avendo inserito il valore 20 viene soddisfatta questa condizione in quanto è maggiore di 18. Nello stesso blocco Else abbiamo anche posto un'altra condizione senza nessun valore, che significa, semplicemente che se il valore che introduciamo con InputBox non soddisfa la condizione If var1 > 18 Then allora il flusso del programma esegue le istruzioni di questa istruzione, infatti se inseriamo il valore 15 ci viene riportato a video il messaggio "Temperatura troppo bassa, ti prendi un raffreddore". Ma perchè queste scelte avvengono così? perchè le istruzioni Else sono contenute completamente all'interno dell'istruzione più esterna, e quando viene verificato il valore della variabile Var1 viene mandato in esecuzione il blocco di codice quando il valore della variabile è True (vera) ne consegue che inserendo il valore 30 Var1 diventa True alla prima condizione ed esegue il flusso di codice di colore blu, invece se assegniamo a Var1 il valore 20 diventa True alla prima istruzione delle condizioni nidificate nel blocco Else, ogni altro valore assegnato [da 1 a 18] alla variabile Var1 viene eseguita l'ultima istruzione del blocco Else. Possiamo semplificare il listato della nidificazione usando un'abbreviazione che si presenta con If ... Then .. ElseIf e la possiamo rappresentare con il seguente enunciato If Condizione Then Istruzioni ElseIf Condizione1 Then Istruzioni1 Else Istruzioni 2 End If Consideriamo questo enunciato come un'abbreviazione, il concetto sopra esposto non varia, la nostra macro diventa così Codice:
Sub nidifica_abbreviato() Dim var1 var1 = InputBox(prompt:="Inserisci a quanti gradi metti il termostato del riscaldamento: ", Title:="Misura la temperatura di casa") If var1 > 20 Then MsgBox "Troppo caldo, vedrai che bolletta" ElseIf var1 > 18 Then MsgBox "Temperatura giusta" Else MsgBox "Temperatura troppo bassa, ti prendi un raffreddore" End If End Sub Le procedure che abbiamo visto finora sono moto utili con un numero ristretto di scelte da effettuare, ma presentano un problema quando ci sono molte condizioni da verificare, tale problema è di natura interpretativa in quanto diventa difficile leggere ed interpretare il listato del codice. VBA ci offre però un'istruzione condizionale da usare quando dobbiamo scegliere tra un gran numero di possibili scelte. L'istruzione Select Case funziona allo stesso modo di più istruzioni IF indipendenti ma è più facile da eseguire ed interpretare, usando la parola chiave Select Case con più istruzioni Case, dove ogni istruzione Case verifica la presenza di una condizione e se saranno soddisfatte le condizioni, verrà eseguito il codice di un solo blocco Case, inoltre un blocco Case può contenere nessuna, una o più istruzioni, pertanto da questa breve introduzione possiamo affermare che in presenza di varie scelte da effettuare risulta un metodo molto utile e versatile oltre che facilmente leggibile. L'istruzione Select Case ha questa sintassi Select Case espressione Case elencoespressione1 Istruzioni1 Case elencoespressione2 Istruzioni2 etc... Case elencoespressione n [Case Else IstruzioniElse] End Select Come già citato il concetto e l'utilizzo è uguale a più istruzioni IF, Select Case in più offre la possibilità di poter operare varie scelte e anche di utilizzare un operatore per specificare un intervallo di valori nell'elenco espressioni, tale operatore è To ed è espresso in questa forma: espressione1 To espressione2, per esempio possiamo specificare un intervallo di numeri da 1 a 10 in un elenco Case usando la seguente dicitura Case 1 To 10 è inoltre possibile usare degli operatori di confronto per selezionare dei blocchi di istruzioni a seconda se espressione è maggiore, minore o uguale di espressione, la sintassi è la seguente: Is operatore_di_confronto espressione, che semplificato prende questa forma: Case Is < 10 Vediamo ora con un esempio pratico di semplificare ulteriormente quanto esposto e trasformiamo la routine utilizzata con l'operatore IF con Select Case Codice:
Sub Selec_cast() Dim var1 var1 = InputBox(prompt:="Inserisci a quanti gradi metti il termostato del riscaldamento: ", Title:="Misura la temperatura di casa") Select Case var1 Case Is > 25 MsgBox "Troppo caldo, vedrai che bolletta" Case 21 To 23 MsgBox "Bello caldo, si stà bene" Case 17 To 20 MsgBox "Temperatura giusta" Case > 15 MsgBox "Raffredore assicurato" Case Else MsgBox "Troppo freddo si ghiaccia" End Select End Sub Abbiamo dichiarato una variabile [var1] ed abbiamo assegnato alla stessa un valore fornito dall'utente tramite la funzione InputBox, all'inizio del ciclo Select Case notiamo che è presente una sola variabile [var1], come abbiamo citato nella lezione sulle variabili il risultato di un'espressione contenente una singola variabile è il valore memorizzato nella variabile stessa, di conseguenza VBA confronta il valore memorizzato nella variabile Var1 con le condizioni specificate in ogni blocco Case dell'istruzione Select Case. Innanzi tutto VBA controlla il valore della variabile var1 partendo dalla prima clausola Case, se assegniamo alla variabile il valore 28 viene subito soddisfatta la prima condizione Case Is > 25 è maggiore di 25? in questo caso si, la condizione diventa True e vengono eseguite le istruzioni di quel blocco Case, allo stesso modo se la variabile assume il valore 22, la prima condizione non viene soddisfatta [non è maggiore di 25] e VBA passa alla seconda [il valore è compreso tra 21 e 23?], Si, pertanto la condizione diventa True al secondo blocco Case ed esegue le relative istruzioni. In buona sostanza possiamo mettere diverse condizioni, sia singole che intervalli, nell'enunciato Else vengono invece inserite le istruzioni nel caso nessuna delle condizioni elencate venga soddisfatta, in questo caso vengono eseguite le istruzioni presenti nel blocco Else Utilizzare la parola chiave To Si può utilizzare la parola chiave To nell’espressione da valutare per specificare l'intervallo superiore e inferiore dei valori corrispondenti, come illustrato di seguito. Il valore a fianco della parola chiave To deve essere minore o uguale al valore a destra della parole chiave To. Codice:
Sub Test1 () Dim voti As Integer voti = InputBox ("Inserisci Voto") Select Case voti Caso 70 To 100 MsgBox "Buono" Caso 40 To 69 MsgBox "Medio" Caso 0 To 39 MsgBox "Bocciato" Case Else MsgBox "Fuori Valutazione" End Select End Sub Per includere un operatore di confronto (=, <>, <,>, <= o> =) nell’espressione da valutare si utilizza la parola chiave Is, che viene inserita automaticamente prima di un operatore di confronto, se non espressamente incluso. Codice:
Sub Test2 () 'se temperatura è uguale a 39,5, verrà restituito il messaggio "Moderatamente caldo" Dim temp As Single temp = 39.5 Select Case temp Caso Is > = 40 MsgBox "Troppo Caldo" Caso Is > = 25 MsgBox "Moderatamente caldo" Caso Is > = 0 MsgBox "Troppo Freddo" Caso Is <0 MsgBox "Molto Freddo" End Select End Sub Si possono specificati più espressioni o intervalli in ogni istruzione Case, separando ogni espressione con una virgola, che ha l'effetto dell’operatore OR. Più espressioni o intervalli possono essere specificati per stringhe di caratteri. Codice:
Sub Test3 () Dim var As Variant var = "Ciao" Select Case var Case a, e, i, o, u MsgBox "Vocali" Cas2 2, 4, 6, 8 MsgBox "Numeri" Caso 1, 3, 5, 7, 9, "Ciao" MsgBox "Numeri o Ciao" Case Else MsgBox "Non Valutabile" End Select End Sub Codice:
Sub Test4 () 'Option Compare non è specificato e quindi il confronto testo sarà case-sensitive Dim var As Variant, risultato As String var = InputBox ("Inserisci dati") Select Case var Case 1 To 10, 11 To 20: risultato = "Il numero è compreso tra 1 e 20" Case "mele" To "uva", "mango", 98, 99: risultato = "Testo tra mele e uva, o mango, oppure tra i numeri 98 o 99" Case Else: risultato = "Non Valutabile" End Select MsgBox risultato End Sub È possibile confrontare i dati stringa utilizzando metodi di confronto tra stringhe in binario, testo o database. (quest’ultimo viene utilizzato solo con Microsoft Access). Option Compare Binary rende confronti di stringhe sulla base di un ordinamento binario (in Microsoft Windows, la pagina di codice determina il tipo di ordinamento - in cui ANSI 1252 è utilizzato per l'inglese e molte lingue europee), inoltre Option Compare Text rende i confronti di stringhe che non si basano su un ordinamento testuale case-sensitive L'istruzione Option Compare (cioè Option Compare Binary o Option Compare Text ) può essere utilizzato per impostare il metodo di confronto e deve essere utilizzato a livello di modulo, prima di qualsiasi procedura. Se l'istruzione Option Compare non è specificata, il metodo di confronto testo predefinito è Binary. Codice:
Option Compare Binary Sub Compare1 () Dim str As String str = InputBox("Inserisci il testo ") Select Case str Case "Mele" To "Uva" MsgBox " Il testo è tra mele e uva " Case Else MsgBox "Non Valutabile" End Select End Sub Option Compare Text Sub Compare2 () Dim str As String str = InputBox ("Inserisci il testo") Select Case str Case "mele" To "uve" MsgBox "Il testo è tra mele e uva" Case Else MsgBox "Non Valutabile" End Select End Sub Il blocco di istruzioni Select Case può essere nidificato all'interno di ogni altro ciclo, come If ... Then ... Else e Loop, senza alcun limite. Quando Select Case è nidificato dentro l'altro, deve essere un blocco completo e terminare con la propria End Select , all'interno di una specifica Case o Case Else Codice:
Sub select1 () Dim rng As Range, int1 As Integer Set rng = ActiveSheet.Range ("A1") Select Case IsEmpty (rng) Case True MsgBox rng.Address & "è vuota" Case Else Select Case IsNumeric (rng) Case True MsgBox rng.Address e "ha un valore numerico" Select Case rng.HasFormula Case True MsgBox rng.Address & "ha anche una formula" End Select Case Else Int1 = Len (rng) MsgBox rng.Address & "ha una lunghezza di testo di" & int1 End Select End Select End Sub Codice:
Funzione StringManipulation (str As String) As String 'Questo codice personalizza una stringa di testo come segue: 1. rimuove i numeri da una stringa di testo; '2. rimuove gli spazi iniziali e finali '3. aggiunge uno spazio (se non presente) dopo ogni esclamazione, virgola, punto e il punto interrogativo; '4. capitalizza la prima lettera della stringa e la prima lettera di una parola dopo ogni esclamazione, punto e basta e il punto interrogativo; Dim iTxtLen As Integer, iStrLen As Integer, n As Integer, i As Integer, ansiCode As Integer 'Toglie i numeri 'Chr (48) chr (57) rappresentano numeri da 0-9 in codici di caratteri ANSI / ASCII For i = 48 To 57 'Rimuovere tutti i numeri dalla stringa di testo usando la funzione Replace str = Replace (str, Chr (i), "" ) Next i 'Toglie gli spazi con la funzione TRIM str = Application.Trim (str) 'Aggiunge uno spazio (se non presente) dopo ogni ! ; ? . iTxtLen = Len (str) For n = iTxtLen To 1 Step -1 'Chr spazio (32) ritorna; Chr (33) restituisce esclamativo; Chr (44) restituisce virgola; Chr (46) restituisce piena di arresto; Chr (63) restituisce il punto interrogativo; If Mid (str, n, 1) = Chr (33) Or Mid (str, n, 1) = Chr (44) Or Mid (str, n, 1) = Chr (46) Or Mid (str, n, 1 ) = Chr (63) Then 'Controllare se lo spazio non è presente If Mid (str, n + 1, 1) <> Chr (32) Then 'Utilizzando Mid e funzioni Destra per aggiungere spazio - notare che viene usato lunghezza della stringa corrente str = Mid (str, 1, n) & Chr (32) & Right (str, iTxtLen - n) 'Update lunghezza della stringa - incrementa di 1 dopo l'aggiunta di uno spazio (carattere) iTxtLen = iTxtLen + 1 End If End If Next n 'Cancella gli spazi (se presenti) prima di ogni esclamativo etc…. 'Reset della lunghezza della stringa iTxtLen = Len (str) For n = iTxtLen To 1 Step -1 'Chr spazio (32) ritorna; Chr (33) restituisce esclamativo; Chr (44) restituisce virgola; Chr (46) restituisce piena di arresto; Chr (63) restituisce il punto interrogativo If Mid (str, n, 1) = Chr (33) Or Mid (str, n, 1) = Chr (44) Or Mid (str, n, 1) = Chr (46) Or Mid (str, n, 1 ) = Chr (63) Then 'Controllare se lo spazio è presente If Mid (str, n - 1, 1) = Chr (32) Then 'Utilizzando il foglio di lavoro funzione Sostituisci per eliminare uno spazio str = Application.Replace (str, n - 1, 1, "" ) 'Omettere ricontrollare nuovamente lo stesso carattere - la posizione di n spostamenti (diminuisce di 1) dovuto alla cancellazione di un carattere di spazio n = n - 1 End If End If Next n 'Capitalizzare la prima lettera della stringa e la prima lettera di una parola dopo ogni esclamazione, punto e basta e il punto interrogativo, mentre tutte le altre lettere sono minuscole iStrLen = Len (str) For i = 1 To iStrLen 'Determinare il codice ANSI di ogni carattere della stringa ansiCode = Asc (Mid (str, i, 1)) Select Case ansiCode '97 A 122 sono i codici ANSI equiparano a lettere piccole cap "a" alla "z" Case 97 To 122 If i> 2 Then 'Capitalizza una lettera la cui posizione è 2 caratteri dopo (1 carattere dopo, sarà il carattere di spazio aggiunto in precedenza) un punto esclamativo, punto e basta e il punto interrogativo If Mid (str, i - 2, 1) = Chr (33) Or Mid (str, i - 2, 1) = Chr (46) Or Mid (str, i - 2, 1) = Chr (63) Then Mid (str, i, 1) = UCase (Mid (str, i, 1)) End If 'Capitalizzare la prima lettera della stringa ElseIf i = 1 Then Mid (str, i, 1) = UCase (Mid (str, i, 1)) End If 'Se la maiuscola, passare al carattere successivo (es. next i) Case Else GoTo salta End Select salta: Next i 'Stringa manipolata StringManipulation = str End Function Sub Str_Man () 'specificare la stringa di testo per manipolare e ottenere stringa manipolato Dim strText As String 'Specificare la stringa di testo, che deve essere manipolato strText = ActiveSheet.Range ( "A1" ). Valore 'La stringa di testo manipolato viene inserito nella gamma A5 del foglio attivo, in esecuzione della procedura ActiveSheet.Range ("A5"). Value = StringManipulation (strText) End Sub Si utilizzare l'istruzione GoTo per passare a una linea all'interno della procedura e questa istruzione si compone di 2 parti:
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
13-02-2012, 17.22.02 | #6 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Azioni ripetitive : Il Ciclo Do Loop Abbiamo parlato di due tipi di cicli, quelli ad interazione fissa e quelli ad interazione indefinita, il ciclo Do ..Loop appartiene ai cicli ad interazione indefinita, VBA ci fornisce questa istruzione estremamente potente per costruire strutture cicliche indefinite nelle nostre funzioni o procedure. Essenzialmente è costituito da una singola istruzione: Do. Questa istruzione ha molte opzioni ed è talmente flessibile che ci fornisce quattro diverse possibilità per costruire dei cicli raggruppati in due diverse categorie di base, che sono i cicli controllati da un contatore e i cicli controllati da eventi, quale è la differenza? In un ciclo controllato da un contatore, le istruzioni del corpo del ciclo vengono eseguite finchè il valore è inferiore o superiore al limite specificato, in sostanza non varia molto dal ciclo For ..Next, eccetto che il programmatore è direttamente responsabile per l'inizializzazione della variabile contatore e per l'incrementazione o decrementazione del contatore. Potremmo usare il ciclo Do se il passo del contatore non è regolare, o se non c'è modo di determinare il limite finale se non dopo che il ciclo ha iniziato la sua esecuzione. Per esempio se vogliamo spostarci attraverso 15 righe di un foglio, alcune volte avanzando di una sola riga e altre volte avanzando di due righe, poichè il numero di righe da avanzare (cioè il passo del contatore) cambia, non possiamo usare il ciclo For ..Next ma dobbiamo usare il ciclo Do Per i cicli controllati da eventi, le istruzioni vengono eseguite quando la determinante del ciclo diventa vera o falsa sulla base di alcuni eventi che si verificano all'interno del corpo del ciclo. Per esempio potremmo scrivere un ciclo che viene eseguito indefinitamente fino a quando l'utente non inserisce un particolare valore in una finestra di dialogo input, e l'inserimento di questo particolare valore è l'evento che termina il ciclo, oppure possiamo eseguire delle operazioni sulle celle di un foglio fino a quando non si raggiunge la cella vuota di una colonna, anche in questo caso il raggiungimento della cella vuota è l'evento che termina il ciclo. Per ora abbiamo chiarito le due categorie di cicli, abbiamo capito che esistono cicli controllati da un contatore e cicli controllati da eventi, vediamo ora la sintassi Do istruzioni Loop Until condizione e qualche esempio. Codice:
Sub ciclo1() Dim a As Integer Do a = a + 1 MsgBox (a) Loop Until a = 10 End Sub Codice:
Sub ciclo2() Dim a As Integer Do Until a = 10 a = a + 1 MsgBox (a) Loop End Sub Sub ciclo3() Dim a As Integer Do a = a + 1 MsgBox (a) Loop While a <> 10 End Sub Sub ciclo4() Dim a As Integer Do While a <> 10 a = a + 1 MsgBox (a) Loop End Sub In pratica la forma Do ... Loop While e Do ... Loop Until prima vengono eseguite le istruzioni presenti nel ciclo e poi quando raggiunge la parola chiave Loop viene verificata la condizione (vedi sintassi) se condizione è False (nel caso si usi Until VBA ritorna all'inizio del ciclo ed esegue nuovamente le istruzioni del ciclo, se invece usiamo la forma While la condizione da verificare deve essere True, mentre nelle altre 2 forme espresse Do Until ...Loop e Do While ...Loop la condizione invece viene verificata subito. Vediamo un esempio che semplifica e chiarifica quanto esposto. Supponiamo di far comparire a video un Inputbox per chiedere informazioni all'utente, e poi verificare se i dati immessi siano validi, in questo caso inseriamo nel nostro ciclo dobbiamo eseguire le istruzioni (far comparire il messaggio di Input) e all'inserimento dei dati da parte dell'utente verifichiamo la condizione, il listato si presenta così Codice:
Sub esempio1() Dim pass As String Do pass = InputBox(prompt:="Inserisci password di accesso per Proseguire: ", Title:="Controllo accessi") Loop Until pass = "Alex" MsgBox "Password esatta: Accesso consentito", vbInformation + vbYes, "Verifica Password" End Sub Codice:
Sub esempio2() Dim pass As String Do pass = InputBox(prompt:="Inserisci password di accesso per Proseguire: ", Title:="Controllo accessi") If pass <> "Alex" Then Exit Sub Loop Until pass = "Alex" MsgBox "Password esatta : Accesso consentito", vbInformation + vbYes, "Verifica Password" End Sub Anche con l'altro metodo cioè Do Until ...Loop e Do While ...Loop il risultato non cambia, pertanto non c'è una regola ben precisa su quale forma sia meglio usare, possiamo dire che a disposizione VBA ci mette queste forme, sta a noi usare quella che ci pare più logica o intuitiva per esprimere quello che vogliamo esegua il nostro codice. Se vi ricordate nella lezione precedente avevamo parlato della nidificazione del ciclo IF, anche nei cicli For ... Next e Do ...Loop è possibile eseguirla, visto che l'argomento lo abbiamo già toccato in questo contesto facciamo subito un esempio e dopo lo commenteremo assieme Codice:
Sub scrivi_col_for() For riga = 12 To 35 For colonna = 7 To 18 Cells(riga, colonna).Value = riga Next colonna Next riga End Sub Seguendo l'esecuzione del ciclo, prima viene eseguito il ciclo interno, e cominciamo dalla cella che si trova all'intersezione tra la colonna n° 7 e la riga n° 12 che sul nostro foglio è rappresentata da G12, al cui interno scriviamo il valore di riga (per cui 12), poi incontriamo la parola chiave Next colonna, a questo punto però non abbiamo ancora raggiunto la determinante del ciclo (rappresentato dal valore [18]) e VBA incrementa il contatore di 1 e ripete le istruzioni, così facendo andiamo a scorrere tutte le colonne e scriviamo al loro interno il valore della variabile riga. Una volta raggiunta la determinante del ciclo usciamo dal ciclo interno ma troviamo la parola chiave Next riga, per cui il contatore del ciclo esterno viene incrementato, passiamo alla riga successiva (la 13) e ripetiamo il ciclo interno come abbiamo descritto sopra. Il nostro listato ha fine quando viene raggiunta la determinate del ciclo esterno e a questo punto troveremo la nostra area di lavoro riempita con il valore della variabile riga estesa sulle colonne di ciascuna riga. Ora che abbiamo riempito l'area con il valore della riga tramite un ciclo For Next nidificato potremmo vedere un listato Do Loop per fare il contrario, cioè riempire l'area col valore della colonna. Codice:
Sub scrivi_col_dolop() riga = 12: colonna = 7 Do Until riga = 35 Do While colonna <> 19 Cells(riga, colonna).Value = colonna colonna = colonna + 1 Loop riga = riga + 1: colonna = 7 Loop End Sub Lo comprendiamo subito andando avanti con l'analisi del ciclo, possiamo saltare la spiegazione delle istruzioni Cells(riga, colonna).Value = colonna in quanto la loro funzione è uguale a quanto spiegato sopra per il ciclo For con la sola differenza che riempiamo le celle col valore della variabile colonna, mentre la soluzione al quesito posto sta nella riga sotto colonna = colonna + 1 questo è il nostro contatore, il metodo che usa Do ... Loop per incrementarlo e continuare nella sua esecuzione, infatti alla prima esecuzione colonna vale 7 e viene incrementata sempre di 1, poi quando trova la parola chiave Loop ritorna all'altra parola chiave Do (dove ha iniziato il ciclo) ed esegue ancora le istruzioni, ma nella determinante del ciclo abbiamo messo 19 (un valore in più di [18]) semplicemente perchè quando incrementiamo il valore della variabile colonna con la dicitura colonna = colonna + 1 alla parola chiave Loop la determinate del ciclo sarebbe soddisfatta se mettessimo [18] e di conseguenza la nostra area verrebbe riempita fino alla colonna 17 Provate a modificare il valore nell'esempio allegato e comprenderete come agisce il ciclo, inoltre quando si lavora con i cicli e per un motivo qualsiasi ci viene rimandato un errore oppure non viene eseguito quello che volevamo, possiamo usare un piccolo espediente per vedere come agisce il ciclo e quale valore attribuisce alle variabili usate, infatti basta usare la parola chiave Msgbox e possiamo vedere a video il valore della variabile e correggere l'errore. Ecco un esempio di utilizzo Codice:
Sub scrivi_col_dolop() riga = 12: colonna = 7 MsgBox riga Do Until riga = 35 Do While colonna <> 19 MsgBox colonna Cells(riga, colonna).Value = colonna colonna = colonna + 1 Loop riga = riga + 1: colonna = 7 Loop End Sub L’istruzione Loop Wend ripetere un'azione finché una condizione è vera che può essere interpretata come: While condizione da verificare azione intrapresa Wend Se la condizione è vera, vengono eseguite le azioni indicate nella procedura e quando viene raggiunta l'istruzione Wend, la procedura ritorna all'operazione While e la condizione viene verificata nuovamente. Se la condizione è ancora vera, il processo viene ripetuto, mentre invece se la condizione è falsa, l'esecuzione salta alla prima riga che di codice che segue l’istruzione Wend . Codice:
Sub Test1() Dim i As Integer i = 1 'Loop attraverso le celle della colonna A 'Si esce dal ciclo se la cella (Cells (i, 1)) è vuota While Not IsEmpty(Cells(i, 1)) 'Scrivere il contenuto della cella nella finestra di esecuzione. Debug.Print Cells(i, 1) 'Incrementa la variabile di una unità per testare la cella successiva. i = i + 1 Wend End Sub È possibile uscire dal ciclo Do While senza completare il ciclo completo, utilizzando la dichiarazione Exit Do che arresta immediatamente l'esecuzione del ciclo ed esegue la sezione di codice immediatamente successiva all'istruzione Loop, e nel caso di cicli nidificati si puà uscire dal ciclo interno ed eseguire il successivo livello esterno, in quanto si può avere qualsiasi numero di istruzioni Exit Do in un ciclo. Questa istruzione è particolarmente utile nel caso in cui si desidera terminare il ciclo al raggiungimento di un certo valore o di soddisfare una condizione specifica, o nel caso in cui si desidera interrompere un loop infinito a un certo punto. Esempio: Se la cella A1 è vuota, nTotal si sommano al valore di 55. Se Range ("A1") contiene il valore 5, il ciclo termina e uscire quando il contatore (es. n) raggiunge i 5 e nTotal si sommano a 10 (si noti che il ciclo non viene eseguito per il controvalore di 5, ed esce il ciclo al raggiungimento di questo valore). Codice:
Sub Test2 () Dim n As Integer , nTotal As Integer nTotal = 0 Do While n <11 nTotal = n + nTotal n = n + 1 If n = ActiveSheet.Range ("A1") Then Exit Do End If Loop MsgBox nTotal End Sub Forzare l'uscita di un ciclo si corre sempre il rischio di creare un ciclo infinito se la condizione di uscita non viene mai soddisfatta e in caso di emergenza, se una macro crea un Loop infinito si può fermare la sua esecuzione premendo contemporaneamente i tasti della Ctrl + Pausa . È anche possibile premere il tasto Esc e in questo caso viene visualizzata una finestra di errore di esecuzione interrotta, in cui si deve cliccare sul tasto Fine per completare la procedura. Se si desidera gestire i tasti Ctrl + Pausa o Esc in una macro, si deve utilizzare la proprietà EnableCancelKey : L’esempio sotto riportato mostra come personalizzare la finestra del messaggio di errore Codice:
Sub Test3() Dim x As Long On Error GoTo Fine Application.EnableCancelKey = xlErrorHandler 'si crea un loop per dare tempo di testare la procedura 'dell’uso del tasto Esc For x = 1 To 50000 Cells(x, 1) = x Next x Fine: If Err.Number = 18 Then MsgBox "Operazione Annullata" End Sub
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - Ultima modifica di Alexsandra : 30-04-2014 alle ore 22.24.36 |
13-02-2012, 17.34.27 | #7 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Range, Cells e ciclo With Abbiamo visto come è strutturato un foglio di calcolo o cartella, abbiamo detto che è costituito da celle, intervalli e fogli, inoltre un insieme di celle è rappresentato da righe e colonne, ricordando che la maggior parte dei compiti che svolgiamo in un foglio di calcolo è quella di introdurre informazioni, tagliare e copiare dati o applicare opzioni di formattazione e tante altre funzioni che coinvolgono celle, righe o colonne, questo insieme è definito Range . Un Range può essere rappresentato da una singola cella o più celle da una colonna, una riga o una selezione di celle, il sistema più facile per identificarlo è proprio il comando Range che ha questa sintassi Object.Range(nome) Object : è un riferimento all’oggetto Worksheet che contiene il Range, se viene omesso VBA assume che si riferisca all’ActiveSheets (il foglio che abbiamo attivo) Nome : è un riferimento al Range o il nome del Range inserito come testo, infatti questo comando lavora anche con Range che hanno un nome, vediamo qualche esempio Worksheets("Foglio1").Range("A1").Value = 123, Oppure possiamo rappresentarlo come un insieme di celle in questo modo, Worksheets("Foglio1").Range("A1:C5").Value = 123 Possiamo usarlo anche con un nome assegnato agendo in questo modo : Selezioniamo un insieme di celle e dal Menu Inserisci - Nome - Definisci, come da immagine sotto Fig. 1 E ci comparirà un box come il seguente Fig. 2 Nota: Per versioni di Excel superiori alla 2003 per assegnare un nome ad un intervallo di celle si deve seguire il percorso Formule - Definisci nome come da immagine sotto stante Fig. 3 E ci compare una finestra come la seguente Fig. 4 Fine Nota Se abbiamo selezionato prima le nostre celle troveremo il loro riferimento nel campo Riferito a oppure possiamo cliccare sull’icona evidenziata dalla freccia rossa e procedere alla loro selezione, fatto questo dobbiamo solo inserire il nome dell’intervallo e cliccando su Aggiungi lo stesso comparirà nel box centrale così: Fig. 5 A questo punto possiamo modificare il nostro listato in questo modo: Worksheets("Foglio1").Range("pippo").Value = 123 Possiamo riepilogare che con il primo codice abbiamo riempito la cella A1 col valore 123, mentre col secondo abbiamo riempito un insieme di celle (dalla A1 alla C5) col valore 123, mentre assegnando un nome ad un intervallo di celle abbiamo riempito tutto l’intervallo col valore 123. Possiamo però dire anche che se siamo certi di operare nel foglio attivo posso omettere il riferimento Object e quanto abbiamo finora visto lo possiamo scrivere anche in questo modo
L'enunciato Cells Anche se possiamo usare il comando Range per riattivare una singola cella il comando Cells esegue lo stesso compito ma con maggior flessibilità, quando dobbiamo scrivere o leggere dati in un foglio di calcolo direttamente da VBA con l’enunciato Range siamo sempre vincolati ad una locazione ben precisa che abbiamo appena visto e denominata dal riferimento di cella, ma non sempre sappiamo dove dobbiamo leggere e scrivere, in sostanza è abbastanza difficile usare il comando Range quando dobbiamo copiare un insieme di dati scritti in varie celle estese su righe o colonne. A questo problema si può ovviare usando il comando Cells, che ha questa sintassi Object.Cells(riga,colonna) Per quanto riguarda il comando Object tralasciamo ulteriori spiegazioni in quanto vale quanto sopra esposto per il comando Range , noterete però che il riferimento al Range (nome) è espresso in coordinate di riga e colonna, questo ci permette di identificare una singola cella o un intervallo dalla loro posizione di riga e colonna, facciamo qualche esempio di identificazione di celle. A1 = Cells (1,1) B5 = Cells (5,2) D3 = Cells (3,4) Vediamo ora il ciclo With e poi sintetizziamo il tutto e uniamo i vari comandi Il Ciclo With VBA ci fornisce questa speciale struttura With …. End With che ci permette di fare riferimento alle proprietà o metodi che appartengono allo stesso oggetto senza dover specificare ogni volta il riferimento completo all’oggetto, bella come esposizione tecnica ma poco chiara vero? Esponiamo la sintassi del ciclo With e poi semplifichiamo il concetto con degli esempi, la sintassi è : With Oggetto Istruzioni End With Chiarifichiamo ora il tutto, all’inizio del corso abbiamo parlato di Metodi e Proprietà e anche di Oggetti, abbiamo esposto l'oggetto Workbook (che è la cartella di lavoro cioè il nostro file), l'oggetto Worksheet (che è il foglio di lavoro : Foglio1, Foglio2 ecc...) e l'oggetto Range ( intervallo di celle, A1: B12, C1:D12, ecc...) nella definizione del ciclo With abbiamo detto che ci permette di omettere il riferimento completo all’oggetto (Workbook, Worksheet) quando le proprietà o i metodi che usiamo si riferiscono allo stesso oggetto, infatti basta dichiararlo una sola volta all’inizio della procedura With (vedi sintassi) così la nostra procedura risparmia il tempo che necessita per risolvere il riferimento all’oggetto per ogni proprietà o metodo all’interno dell’istruzione With. Vediamo un esempio e capirete subito come funziona, prendiamo come esempio i dati presenti in un foglio come in figura Fig. 6 Supponiamo di trovarci nel Foglio1 e vogliamo scrivere i nostri dati nel Foglio2, per compiere questa operazione senza l’utilizzo del ciclo With dobbiamo utilizzare un listato del genere: Worksheets("Foglio2").Range("B1").Value = Worksheets("Foglio1").Range("B1").Value, oppure come abbiamo visto poco sopra in questo modo Worksheets("Foglio2").Range("B1").Value = [B1].Value Sheets("Foglio2").[B1].Value = [B1].Value Ma così copiamo una singola cella, dobbiamo utilizzare un ciclo come abbiamo già visto in questo modo Codice:
Sub scrivi() riga = 1 Do Until Sheets("Foglio1").Cells(riga, 2) = Empty Sheets("Foglio2").Cells(riga, 2).Value = Sheets("Foglio1").Cells(riga, 2).Value riga = riga + 1 Loop End Sub Codice:
Sub scrivi_with() j = 1 Do Until Sheets("Foglio1").Cells(j, 2) = Empty With Sheets("Foglio2") .Cells(j, 2) = Sheets("Foglio1").Cells(j, 2).Value End With j = j + 1 Loop End Sub Codice:
Sub scrivi_with() j = 1 Do Until Cells(j, 2) = Empty With Sheets("Foglio2") .Cells(j, 2) = Cells(j, 2).Value End With j = j + 1 Loop End Sub
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
13-02-2012, 17.37.27 | #8 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
La Funzione MsgBox e InputBox Abbiamo usato questa semplice funzione molto spesso in questo corso, adesso vediamola più da vicino e come possiamo personalizzarla per i nostri progetti. La funzione MsgBox() ci permette di mostrare a video un box che riporterà un avviso permettendo così all’utente di scegliere l’operazione più idonea da eseguire. Questo comando ci è utile quando stiamo per mandare in esecuzione una determinata procedura e vogliamo ottenere il consenso dall’utente, oppure la possiamo usare nella gestione degli errori, ci può avvisare e impedire l’esecuzione di una routine che porterebbe il programma alla generazione di un errore con conseguente blocco dell’esecuzione del nostro progetto, ma può chiederci una ulteriore conferma per operazioni “delicate” - tipo cancellazione di file - in sostanza è una funzione che ci permette di comunicare da vicino con l’applicazione che stiamo usando. Finora abbiamo visto marginalmente l’uso di Msgbox , in questa lezione cercheremo di approfondire le sue potenzialità e il suo uso. Non ha una sintassi particolarmente difficile ma il suo uso “avanzato” ci permette di controllare le varie procedure e gestire tutti gli eventi che abbiamo istanziato nel nostro programma, in sostanza è una funzione di VBA abbastanza semplice da usare che riporta a video un messaggio con un’icona e dei pulsanti predefiniti, a cui si risponde premendo su uno di essi. La sintassi è la seguente : MsgBox(prompt[, buttons] [, title] [,helpfile ,context]) oppure italianizzando il commando MsgBox(Messaggio[, Pulsanti] [, Titolo] [, Fileaiuto , Contesto]) Dove
Codice:
Sub box1() MsgBox "Ciao a tutti" End Sub Fig. 1 Come potete vedere abbiamo omesso alcune espressioni nella sintassi appena esposta, ma il nostro box ci appare con il testo che abbiamo inserito, e con la barra del titolo di default [Microsoft Excel] , inoltre è possibile anche far apparire il box usando il valore di Variabili oppure possiamo anche usare anche una forma più evoluta e personalizzare il nostro messaggio di avviso come meglio crediamo, vediamone un esempio Codice:
Sub box2() MsgBox "Ciao a tutti", vbCritical + vbOKOnly, "Funzione MsgBox Semplice" End Sub Fig. 2 Notiamo subito che è cambiato il titolo nella barra della finestra ed è comparsa un’icona rossa con una X bianca, possiamo anche cambiare tipo di icona in questo modo : Codice:
Sub box3() MsgBox "Ciao a tutti", vbQuestion + vbOKOnly, "Funzione MsgBox Semplice" End Sub Fig. 3 Vedendo i codici esposti e i vari box che ci sono apparsi possiamo dire che : Prompt: è il messaggio che verrà visualizzato, nel nostro caso è Ciao a tutti” buttons : è il tipo di pulsante e relativa icona, nel nostro caso è rappresentato dal codice vbCritical + vbOKOnly title : è il titolo della finestra, nel nostro caso è Funzione MsgBox Semplice" Ora però possiamo anche fare un altro “passo avanti” nell’uso di questa funzione, a volte è difficile ricordare tutti i comandi e potremmo usarla anche in un altro modo. Abbiamo detto poco sopra che buttons indica il valore numerico dei pulsanti da visualizzare nella finestra di dialogo, ma finora non abbiamo esposto valori numerici, abbiamo solo rappresentato i pulsanti con delle “parole chiave” tipo : vbCritical + vbOkOnly, oppure vbQuestion + vbOkOnly vediamo questo aspetto modificando il codice finora usato in questo modo : Codice:
Sub box4() MsgBox "Ciao a tutti", 0 + 16, "Funzione MsgBox Avanzata" ' End Sub Fig. 4 Come possiamo vedere l’avviso cambia solo nel titolo che abbiamo modificato in Funzione MsgBox Avanzata ma il resto del Box è uguale, eppure il codice è rappresentato in maniera diversa, possiamo vedere che non compaiono più le parole chiave usate in precedenza ma abbiamo inserito dei valori numerici separati da virgole e seguiti dal titolo della finestra. A mio avviso usarla in questo modo è molto più semplice da ricordare e avremmo meno codice da scrivere. Esponiamo ora con una tabella come vengono interpretati i valori da VBA, che ci aiuterà nell'interpretazione di quanto finora esposto. L’argomento buttons indica il valore numerico dei pulsanti da visualizzare nella finestra del Box e sono così rappresentati Fig. 5 Sempre a questo argomento possiamo associare un’icona da visualizzare nel Box identificata da un valore numerico seguendo questa tabella: Fig. 6 Abbiamo detto poco sopra che la funzione MsgBox restituisce un valore, questo valore rappresenta il pulsante che abbiamo premuto, infatti come facciamo a sapere quale pulsante, e di conseguenza, quale scelta ha fatto l’utente? Ora dobbiamo fare una piccola parentesi, nelle lezioni precedenti abbiamo sempre esposto MsgBox come un semplice avviso, invece possiamo usarla anche quando dobbiamo prendere delle decisioni, in pratica si sta dimostrando l’estrema versatilità di questa funzione, unica cosa è fondamentale sapere quale tasto è stato premuto dall’utente per consentire o negare l’esecuzione di una procedura. A questo punto non diventa solo una semplice funzione che rimanda un avviso, ma prende campo un aspetto più importante, cioè può permettere l’esecuzione di una procedura oppure indicarci quale operazione stiamo per eseguire e richiedere un’ulteriore conferma. Vediamo ora con una tabella quali sono i valori che vengono restituiti da MsgBox e poi con qualche riga di codice ne vediamo il suo uso all’interno di una procedura Fig. 7 In base alla tabella sopra esposta possiamo dire che se l’utente preme il tasto Ok il valore restituito sarà 1, mentre se preme il pulsante Yes il valore restituito sarà 6, di conseguenza possiamo usare la funzione MsgBox anche in altri contesti diversi dal semplice avviso, ma usarla anche per operare delle scelte ed usando le Variabili – come abbiamo detto all’inizio – per ottimizzare sia la funzione ma soprattutto l’uso che ne viene fatto. Vediamo qualche esempio di codice Codice:
Sub prova() Dim Risp As Integer Risp = MsgBox("Prova funzione MsgBox", 1 + 64, "Funzione MsgBox Avanzata") If Risp = 1 Then MsgBox "Hai schiacciato il pulsante Ok", 1+48, "Funzione MsgBox Avanzata" Else Exit Sub End If End Sub Fig. 8 E ciccando sul pulsante Ok ci comparirà un messaggio del genere Fig. 9 Credo che sia abbastanza eloquente come solo sostituendo le condizioni da verificare e le procedure da eseguire possiamo utilizzare questa funzione con scopi ben diversi dal solo avviso, ma possiamo integrarla con le scelte che andiamo ad operare nel proseguo del nostro programma, costituendo così un’ossatura stabile e logica del nostro codice sia per quanto riguarda la gestione degli errori che richiedendo conferma all’utente di quanto si appresta a fare e in base alle scelte che effettua indirizzare il flusso del programma nella direzione appropriata La Funzione InputBox Se vogliamo che l'utente possa operare delle scelte su come usare la procedura possiamo usare la funzione Msgbox che abbiamo già visto nella lezione precedente oppure la funzione InputBox, la quale ci permette di ottenere un input dall'utente, la sintassi generale è la seguente: InputBox (Messaggio) [,Titolo, Default, XPos, YPos, File Aiuto, Contesto]) Messaggio è una stringa usata per indicare all'utente quale informazione deve inserire, ed è l'unico argomento richiesto, tutti gli altri sono opzionali. Titolo è una stringa usata come titolo per la finestra di dialogo Default è una stringa per fornire un valore di Default per l'input dell'utente XPos e YPos sono espressioni numeriche che forniscono le coordinate dove deve apparire la finestra di dialogo, XPos è la distanza orizzontale dal lato sinistro della finestra e YPos è la distanza verticale dal lato superiore della finestra, sono argomenti opzionali, ma fate attenzione se li usate perchè se specificate delle posizioni troppo grandi per questi argomenti si corre il rischio di non far apparire la finestra sullo schermo FileAiuto è una stringa che contiene il nome di un file della guida di Windows e Contesto è un'espressione numerica che specifica l'argomento nel file della guida relativo alla finestra di dialogo che state visualizzando.FileAiuto e Contesto sono opzionali, ma se specificate FileAiuto dovete specificare anche Contesto, e quando specificate un file della guida per una finestra di dialogo di input, VBA aggiunge automaticamente un pulsante della Guida (?) alla finestra di dialogo. Vediamo ora un esempio Codice:
Sub funzione_input() Prova_input = InputBox(prompt:="Inserisci il nome di un file: ", Title:="Crea un nuovo file", Default:="Newfile") End Sub Fig. 10 credo che sia abbastanza semplice ed intuitivo il listato esposto, infatti vediamo che quando digitato nel codice appare nella finestra di dialogo, ora possiamo passare all'argomento appena accennato all'inizio cioè prendere delle decisioni, naturalmente le nostre procedure non possono veramente "Prendere delle decisioni" allo stesso modo di un essere umano, ma bensì possono scegliere tra diversi percorsi di azioni predefinite, basandosi su semplici condizioni e prendendo delle decisioni al solo verificarsi di determinati eventi. Possiamo dire che usiamo le istruzioni di scelta di VBA, definite in una condizione oppure in un insieme di condizioni per cui VBA esegue un blocco di codice della nostra procedura oppure un altro blocco di codice.
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
13-02-2012, 17.39.51 | #9 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Introduzione alle Userform con VBA Finora abbiamo visto come utilizzare delle finestre di dialogo che VBA mette a disposizione tramite le funzioni MsgBox e InputBox, sebbene queste funzioni possano garantire ad un programma un’ottima funzionalità il loro utilizzo è abbastanza limitato. Durante lo sviluppo di programmi più complessi è indispensabile usare finestre di dialogo, che permettano all’utente di selezionare più opzioni, scegliere elementi da una lista o digitare valori diversi, in pratica per incrementare la funzionalità del programma è necessario utilizzare finestre di dialogo personalizzate che ci permettano di velocizzare le nostre procedure, in questo contesto VBA ci mette a disposizione l’oggetto Userform(Finestre Utente) che ci permette la creazione e la manipolazione di finestre di dialogo personalizzate all’interno di programmi o procedure. Utilizzando le Userform, è possibile costruire finestre personalizzate per visualizzare dati, o richiedere all’utente la digitazione di valori, utilizzando la logica che abbiamo impostato per la corretta esecuzione del programma, per esempio possiamo mostrare una finestra di dialogo, che mette a disposizione una serie di formati data, obbligando l’utente alla scelta di un solo formato tra quelli mostrati. In sostanza le finestre di dialogo permettono al programma di interagire con l’utente in modo più “sofisticato” e forniscono uno strumento versatile per svolgere le normali funzioni di Input e Output. L’oggetto Userform è una finestra di dialogo vuota e contiene una barra del titolo e un pulsante di chiusura, aggiungendo controlli a un oggetto di tipo Userform è possibile personalizzare l’aspetto e la funzionalità della finestra di dialogo. Ogni oggetto Userform possiede proprietà, metodi e risponde ad eventi, tutti ereditati dall’oggetto Userform, inoltre ogni oggetto Userform incorpora un modulo nel quale l’utente può aggiungere i propri metodi e proprietà e nel quale può scrivere il codice che risponde ad eventi della finestra. Cosa significa questo? Significa che possiamo definire evento qualsiasi cosa si verifichi all’interno della finestra di dialogo o in un suo controllo, tipici esempi di evento sono la pressione di un pulsante di comando o la selezione di una casella di controllo. Altri eventi possono includere la modifica di una casella di testo o la selezione di una lista, i clic del mouse, la pressione dei tasti e altre azioni interne attivano gli eventi. Gli oggetti utilizzati (finestre e controlli) rendono disponibile una serie di eventi, è quindi possibile scrivere procedure VBA che rispondono a questi eventi. Queste procedure vengono denominate “Procedure di evento” come per esempio la pressione di un pulsante di comando, la procedura di evento contiene tutte (e solo) le azioni da eseguire in relazione all’evento, altro esempio può essere la chiusura di una finestra tramite il pulsante di chiusura la procedura di evento viene eseguita in aggiunta all’azione causata dall’evento (in questo caso la chiusura della finestra di dialogo) Come creare una UserForm Per inserire in un file di Excel una Userform la procedura è abbastanza semplice, entriamo nell’editor del VBA (premiamo i tasti ALT+F11) e nella finestra del progetto vediamo il file xls con l’elenco dei fogli presenti al suo interno. Per creare una Userform seguiamo questo percorso Inserisci - Userform e di seguito ci compare una finestra come questa Fig. 1 Nella finestra del codice è comparsa una UserForm vuota e a sinistra vediamo un box denominato Casella degli strumenti che ci permette di inserire i vari controlli all’interno della Userform. La Userform ora è creata, possiamo modificarne le dimensioni a piacere, basta posizionarsi in un angolo (inferiore destro) e trascinare il mouse tenendo premuto il tasto sinistro e rilasciarlo quando abbiamo raggiunto le dimensioni desiderate. VBA per default assegna il nome Userform seguito da un numero di indice, ma possiamo modificarne il nome anche per sapere a prima vista il compito assegnato alla Userform. Dalla finestra delle proprietà modifichiamo il nome in Anagrafica, facendo clic nella casella a fianco del campo (Name), cancelliamo il nome attualmente presente (Userform1) e inseriamo il nuovo. Fig. 2 Ora vediamo che nella finestra dei progetti la UserForm ha cambiato nome, ma il titolo della UserForm è rimasto inalterato, presenta ancora il nome Userform1. Per modificare il titolo sulla barra della Userform dobbiamo modificare il valore presente nel campo caption nella finestra delle proprietà, se modifichiamo il nome in Gestione anagrafica anche la barra della Userform assume questo titolo Fig. 3 Una Userform ha i suoi eventi, proprio come una cartella di lavoro o un foglio di lavoro ed essendo diversi, per il momento ci fermeremo a quelli più usati che sono: Activate – Click – DblClick – Deactivate – Initialize – Terminate Per aggiungere eventi, dobbiamo fare doppio clic sulla finestra UserForm: Fig. 4 Possiamo usare un evento per fissare le dimensioni della Userform, utilizzando l’evento Userform_Initialize che scatterà quando la form viene caricata in memoria. Questo evento può essere causato dall’istruzione Load o dal metodo Show, si utilizza questo evento per impostare l’aspetto iniziale della finestra. Per raggiungere l’evento selezioniamo il box a destra di figura 4 indicato dalla freccia rossa e nell’elenco a discesa scegliamo l’evento Initialize e inseriamo questo codice Codice:
Private Sub UserForm_Initialize () Anagrafica.Height = 100 Anagrafica.Width = 100 End Sub Codice:
Private Sub UserForm_Click () Anagrafica.Height = Anagrafica.Height + 50 Anagrafica.Width = anagrafica.Width + 50 End Sub Codice:
Private Sub UserForm_Activate() TextBox1.SetFocus OptionButton1.value=True End Sub Hide : Nasconde la finestra di dialogo (la Userform) senza liberare la memoria associata all’oggetto, in questo modo vengono mantenuti i valori nei vari controlli contenuti in essa Show : Rende visibile la finestra sullo schermo, se la finestra non è caricata in memoria, viene effettuato il caricamento. Inoltre VBA fornisce due comandi che sono molto utili quando usiamo l’oggetto Userform, i comandi sono Load e Unload, questi comandi possono essere utilizzati per caricare l’oggetto in memoria e per liberare la memoria se occupata dall’oggetto. La sintassi per questi comandi è la seguente: Load Oggetto Unload Oggetto In questo enunciato Oggetto rappresenta un riferimento valido ad un oggetto di tipo Userform, con il comando Load carichiamo l’oggetto in memoria, ma non lo rende visibile sullo schermo, e con il comando Unload lo scarichiamo dalla memoria. Abbiamo appena detto che con Load carichiamo l’oggetto in memoria, ma non lo portiamo a video, inneschiamo solo l’evento Initialize della Userform ma per poter vedere l’oggetto sullo schermo dobbiamo usare il comando Show, l’enunciato è il seguente Anagrafica.Show Pertanto se vogliamo far comparire una finestra di dialogo a video dovremmo lanciare il comando Show, ma come facciamo? Una volta creata la Form abbiamo a disposizione solo metodi ed eventi, ma tutti riferiti all’oggetto Userform, mentre a noi serve un altro procedimento che veicoli la nostra finestra di dialogo. Se diamo uno sguardo alla finestra dei progetti vediamo che la Form è presente, ma abbiamo appena detto che deve essere veicolata per poter renderla visibile. Un sistema per ottenere questo è di seguire questo percorso Inserisci - Modulo e nella finestra di progetto ora ci comparirà anche il modulo Fig. 5 A questo punto clicchiamo sulla voce “Modulo1” e nella finestra del codice digitiamo il seguente codice Codice:
Sub Mostra() Anagrafica.Show End Sub Unload Me Vediamo ora la finestra della casella degli strumenti, noterete che l’etichetta della finestra riporta il nome di Controlli e sono rappresentati dalle varie icone presenti nel box, vediamo cosa rappresentano e come si usano, per farvi comprendere meglio quali siano i controlli li ho raggruppati in questa immagine con il relativo nome e una breve descrizione Fig. 6 Fig. 7
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
13-02-2012, 17.41.01 | #10 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
I Controlli in una Userform Un oggetto Userform può contenere controlli come possiamo vedere nelle finestre di dialogo normalmente mostrate da Excel o altri programmi. I controlli sono gli elementi di una finestra che consentono all’utente di interagire con il programma. Nella lezione precedente abbiamo fatto una panoramica su questo argomento, adesso vediamo di approfondire elencando i vari controlli disponibili in maniera più dettagliata. I controlli disponibili in VBA sono: Label : Corrisponde a Etichetta, inserisce un oggetto di tipo label1 e svolge la funzione di etichetta descrittiva per quei controlli che non ne hanno una propria. E’ inoltre possibile utilizzare le etichette per mostrare il valore di una variabile. Si può modificare il testo mostrato di una etichetta (label1 nel nostro caso) modificando la proprietà Captino, questo è possibile via codice oppure agendo nella finestra delle proprietà, generalmente questo oggetto viene usato nei casi in cui non si debba modificarne il testo, ma semplicemente come elemento descrittivo di un altro controllo Casella di testo : Inserisce un oggetto di tipo Textbox, questo oggetto permette l’inserimento di testo da parte dell’utente, viene utilizzato per ogni tipo di campo che può essere rappresentato come testo, nomi, date, numeri valute e inoltre può accettare e mostrare più righe di testo, infatti quando necessario compare una barra di scorrimento verticale che permette di scorrere il testo contenuto Cornice : Inserisce un oggetto di tipo Frame, questo oggetto non ha nessuna funzione specifica, se non quella di raggruppare logicamente un insieme di controlli. Si utilizza solitamente per raggruppare pulsanti di opzione, caselle di controllo e pulsanti interruttore. Usate questo controllo quando volete far risaltare all’utente che i controlli contenuti nella cornice sono in qualche modo collegati tra loro Pulsante di comando : Inserisce un oggetto di tipo CommandButton, il classico pulsante di standard di Windows che si attiva quando l’utente fa clic su di esso. L’azione svolta al clic sul controllo dipende dal codice che viene messo nell’evento, può compiere operazioni di chiusura (Close) di nascondimento (Hide) , di aggiornamento dei dati, di verifica e così via Casella di Controllo : Inserisce un oggetto di tipo CheckBox, è composto da un quadrato che contiene un segno di spunta nel caso in cui sia selezionato e da un’etichetta di descrizione. Utilizzate questo controllo per le opzioni che possono avere un valore di tipo Vero o Falso. Può restituire valori True (Vero), quando la casella è selezionata o False (Falso), se la casella non è selezionata, inoltre la presenza di più caselle di controllo non si escludono a vicenda Pulsante di opzione : Inserisce un oggetto di tipo OptionButton, è composto da un pulsante tondo che contiene una pallina nera nel caso sia selezionato e da un’etichetta di descrizione. Viene usato con una serie di pulsanti di opzione per consentire all’utente una selezione di elementi che si escludono a vicenda Pulsante Interruttore : Inserisce un oggetto di tipo ToggleButton, mostra lo stato del pulsante Vero o Falso, Acceso o Spento, allo stesso modo di una casella di controllo solo che ha l’aspetto di un pulsante in posizione “Su” o “Giù” Casella di riepilogo : Inserisce un oggetto di tipo ListBox e mostra una serie di dati presenti nel foglio in cui l’utente può fare una scelta, inoltre la proprietà MultiSelect controlla la possibilità di effettuare la scelta di un solo valore o di più elementi della lista Casella combinata : Inserisce un oggetto di tipo ComboBox, questo controllo è la combinazione grafica di una casella di testo (TextBox) e di una casella di riepilogo (ListBox) la casella di testo permette la digitazione di dati con la possibilità di suggerire una serie di valori tra cui scegliere attraverso la lista a discesa. Tramite questo controllo è possibile consentire all’utente di inserire un valore non presente nella lista, oppure costringerlo a scegliere un valore tra quelli presenti nella lista. Per poter effettuare questa impostazione bisogna modificare la proprietà Style nella finestra delle proprietà Schede : Inserisce un oggetto di tipo TabStrip, questo controllo consiste in una singola area in cui è possibile inserire altri controlli, è costituito da una serie (modificabile a piacere) di pulsanti di tabulazione. Questo controllo è simile all’oggetto cornice, in quanto l’area non cambia, ma tramite i pulsanti di tabulazione è possibile mostrare dati di diverse categorie. Per esempio in un’anagrafica di un cliente è possibile avere un tabulatore in cui compaiono i dati generali (indirizzo, telefono etc.) un altro tabulatore mostrerà i dati bancari e così via Pagine : Inserisce un oggetto di tipo MultiPage, questo controllo è simile al controllo Schede (TabStrip) inoltre ogni pagina di questo controllo può contenere diversi controlli distinti. E’ da utilizzare quando ogni pagina deve avere un contenuto differente Barra di scorrimento : Inserisce un oggetto di tipo ScrollBar e permette di scorrere i valori contenuti in una finestra Casella di selezione : Inserisce un oggetto di tipo SpinButton, è una particolare categoria di casella di testo che permette l’inserimento facilitato e la modifica di dati compresi in un certo intervallo. Viene utilizzato per l’inserimento di valori numerici, date o valori in sequenza e si utilizza insieme ad un controllo etichetta(Label) o casella di testo (TextBox). In pratica facendo clic sulla freccia “su” o “giù” il valore viene incrementato o diminuito Immagine : Inserisce un oggetto di tipo Image, e permette di inserire un’immagine all’interno della finestra in uno dei seguenti formati *.bmp, *.cur, *.jpeg, *.gif, *.ico RefEdit : Inserisce un oggetto di tipo RefEdit, questa è una speciale casella di testo che consente di inserire e selezionare intervalli sui fogli di lavoro di Excel Ogni controllo è un oggetto con proprietà, metodi ed eventi specifici esattamente come le finestre (Userform) che li contiene, è possibile impostare le proprietà dei controlli via codice oppure utilizzando la finestra Proprietà dell’editor di Visual Basic. Una volta aggiunto un controllo alla finestra, potete effettuare una serie di operazioni come: copiare l’oggetto, ridimensionarlo, spostarlo, cancellarlo, modificarne la formattazione, il tipo di carattere, il colore e modificare tutte le sue proprietà. Avrete sicuramente la necessità di fare queste operazioni nel momento in cui perfezionerete la vostra tecnica di programmazione delle finestre di dialogo. Per esempio potete decidere che una casella di testo è troppo ampia o troppo stretta per il testo a cui è destinata, così ne modificherete le dimensioni. Oppure un pulsante di comando con la scritta CommandButton7 avrebbe un significato a dir poco “oscuro” per l’utente che userà la vostra finestra di dialogo. Per poter inserire un controllo nella nostra Userform dovete fare clic sul pulsante della Casella degli strumenti corrispondente al controllo che volete aggiungere nella finestra, in questo modo il puntatore del mouse si trasforma in una croce sottile quando viene posizionato sulla Userform. Posizionate il puntatore a croce sulla finestra nel punto in cui volete inserire il controllo, tenete presente che il punto che scegliete corrisponderà all’angolo superiore sinistro. Fate clic e tenete premuto il pulsante sinistro del mouse, Trascinate ora a destra e in basso fino a che il controllo non raggiunge le dimensioni desiderate, quindi rilasciate il pulsante, a questo punto l’editor di Visual basic inserisce il controllo e il puntatore del mouse ritorna ad essere la freccia standard. Se proviamo ad inserire una casella di testo (TextBox), con le istruzioni sopra riportate ci comparirà una finestra come quella sotto riportata Fig. 1 Avrete notato che il controllo è circoscritto da dei piccoli quadratini bianchi che ci permettono di ridimensionare il controllo stesso, posizionandoci col cursore del mouse su uno di essi il puntatore si trasforma in una doppia freccia, che indica la direzione nella quale è possibili ridimensionare l’oggetto. Inoltre posizionandoci sopra al controllo il cursore cambia aspetto e diventa a 4 frecce, in questa condizione è possibile spostare il controllo nella posizione voluta. Ricordate anche che ogni controllo aggiunto alla finestra di dialogo deve avere un nome univoco, a questo pensa già l’editor di VBA, se inseriamo un controllo CommandButtons gli viene assegnato automaticamente il nome del controllo seguito da un numero [es. CommandButtons1] questo numero progressivo viene incrementato automaticamente dall’editor ogni volta che si inserisce un controllo dello stesso tipo. Modificare i controlli Una volta che avete aggiunto un controllo alla finestra potete effettuare una serie di operazioni come: copiare l’oggetto, ridimensionarlo, spostarlo, cancellarlo, modificarne la formattazione etc. Avrete sicuramente la necessità di compiere queste operazioni nel momento in cui perfezionerete la vostra tecnica di progettazione delle finestre di dialogo. Per esempio potete decidere che una casella di testo è troppo grande o troppo stretta per il testo che è destinata a ricevere, così necessita di una modifica delle dimensioni, oppure inserire un controllo CommandButon5 avrebbe un significato oscuro per l’utente che userà il programma. Per modificare un controllo occorre prima selezionarlo facendo clic sopra al controllo stesso e per modificarlo dobbiamo ricorrere alla finestra delle proprietà. Inseriamo ora per esempio 3 controlli, un CommandButton, una TextBox e una Label nella nostra form che adesso si presenta così Fig. 2 Presentare una Userform in questo modo non è certamente accattivante, dobbiamo cercare di dare una indicazione visiva all’utente sullo scopo della Userform. Iniziamo modificando i 3 controlli inseriti, trascinandoli nella posizione giusta e utilizzando la finestra delle proprietà per modificare il valore caption, modifichiamo anche il titolo della form inserendo la dicitura “Esempio di inserimento”, come etichetta della Label usiamo “Inserisci un valore numerico” e il pulsante di comando diventa “Verifica”. Come già detto tutte queste modifiche le effettuiamo selezionando il controllo e andando a modificare il valore del campo Caption, come evidenziato dalla freccia rossa in figura 3 Fig. 3 Una volta terminata la modifica dei vari controlli e ridimensionata la finestra, otteniamo una form come la seguente Fig. 4 Possiamo ipotizzare che questa finestra attenda l’inserimento di un valore nella TextBox e al tempo stesso verifichi che sia stato inserito un valore numerico prima di salvarlo in una cella del foglio di lavoro. In questi casi è sempre opportuno fare la verifica del testo inserito per evitare ulteriori errori di runtime nel proseguo del programma. E’ possibile fare verifiche del genere in due modi, uno sfruttando l’evento Change della TextBox e l’altro con opportuno codice quando clicchiamo sul pulsante di verifica prima di eseguire il salvataggio. Vediamo entrambi i metodi, prima però aggiungiamo un’altra Label alla nostra form che ci torna utile per rimandare un avviso in caso di errore. La possiamo inserire in questo modo Fig. 5 Come potete vedere è stato cambiato anche il colore del testo agendo sul campo ForeColor della finestra delle proprietà come si vede in figura Fig. 6 A questo punto dobbiamo inserire il codice adatto nell’evento Change e per raggiungere questo evento facciamo doppio clic sulla TextBox e nella finestra del codice ci compare l’evento TextBox1_Change(). Abbiamo già detto che questo evento si scatena quando sente un cambiamento all’interno del campo stesso, per cui se inseriamo un codice come il seguente Codice:
Private Sub Textbox1_Change() If IsNumeric(Textbox1.Value) Then Label2.Visible = False Else Label2.Visible = True TextBox1.Value=”” End If End Sub Fig. 7 Come potete vedere la Label2 è visibile, mentre noi vogliamo che diventi visibile in caso di errore nell’inserimento del tipo di dato richiesto. La Label2 è visibile in quanto non abbiamo inizializzato la form, nella lezione precedente abbiamo visto gli eventi Initialize e Activate delle Userform, nel nostro caso utilizziamo l’evento Initialize per nascondere la Label2 e farla poi apparire in caso di errore tramite il ciclo If presente nell’evento Change della TextBox, pertanto andremo ad aggiungere questo codice Codice:
Private Sub UserForm_Initialize() Label2.Visible = False End Sub Fig. 8 A questo punto se inseriamo un valore di tipo stringa nel campo della TextBox ci viene mostrata la Label di avviso errore di inserimento Fig. 9 Per mostrare la Label2 e il testo inserito nel campo della TextBox è stata remmata (è stata resa come un commento e il VBA salta i commenti) un’istruzione nella routine Codice:
Private Sub Textbox1_Change() If IsNumeric(TextBox1.Value) Then Label2.Visible = False Else Label2.Visible = True ' TextBox1.Value = "" End If End Sub Codice:
Private Sub CommandButton1_Click() If IsNumeric(Textbox1.Value) Then Range("A1") = Textbox1.Value Unload Me Else MsgBox "Il Valore inserito è errato" End If End Sub Fig. 10
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
13-02-2012, 17.44.27 | #11 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
I controlli ListBox e ComboBox I controlli ListBox e ComboBox permettono di visualizzare una lista di opzioni selezionabili dall’utente. La ragione principale per usare una casella combinata (ComboBox) o una casella di riepilogo (ListBox) è quella di poter visualizzare un elenco di elementi, dove nella casella di riepilogo (ListBox) è un elenco a discesa e gli elementi della lista sono sempre visibili mentre nel ComboBox la lista è “a scomparsa”, ovvero è visibile soltanto se l’utente fa clic sulla freccia verso il basso a destra del controllo. Le caselle combinate sono così chiamate perché sono composte da due parti, una porzione di testo che ricorda il controllo TextBox e un elenco che riporta ad una Listbox e "combinano" le caratteristiche che si trovano in entrambe le caselle di testo (TextBox) e le caselle di riepilogo (ListBox) e sono anche comunemente chiamate "elenchi a discesa". In sostanza la ComboBox è un elenco a discesa in cui la voce selezionata dall’elenco è visibile nell'area di testo, mentre i valori della lista sono visibili solo cliccando sul menu a tendina, mentre un ListBox mostra un certo numero di valori con o senza una barra di scorrimento, inoltre in una ComboBox, è visibile una sola voce senza utilizzare la tendina a discesa, mentre in un ListBox sono visibili molti più elementi. In una ComboBox è possibile selezionare solo una voce dall’elenco, mentre invece in un ListBox è possibile selezionare più opzioni dall'elenco. La rappresentazione grafica delle due caselle è la seguente: Fig. 1 Fig. 2 Differenza tra ListBox e ComboBox
Nota: Tutte le proprietà e i metodi indicati di seguito sono comuni a ListBox e ComboBox, salvo diversa indicazione, inoltre negli esempi di seguito riportati, i codici VBA devono essere inseriti nel modulo di codice del form, se non diversamente specificato. Il Metodo AddItem: Questo metodo permette di aggiunge una voce alla lista in un ListBox a colonna singola o in un ComboBox. La sintassi è la seguente: Control.AddItem(Item, Index), che nel nostro caso diventa: ListBox1.AddItem(Item, Index), dove Item specifica l'elemento o la riga da aggiungere e Index è un numero intero che specifica la posizione in cui il nuovo elemento è collocato all'interno della lista, se omesso, viene aggiunto l'elemento alla fine. I numeri di posizione o di riga iniziano con zero, e il primo elemento ha il numero 0, e così via. Il valore di indice non può essere maggiore del numero totale di righe. Il metodo AddItem può essere usato solo con un codice VBA. Per popolare un ComboBox è possibile utilizzare vari metodi, per esempio, se usiamo una casella combinata per permettere all’utente di vare una scelta “fissa” come può essere di scegliere una regione, un tipo di vettura etc. possiamo usare il metodo AddItem e impostare le varie voci direttamente dal codice, inoltre l’operazione di inserimento dati deve essere fatta nell’evento Initialize della Userfom in questo modo. Codice:
Private Sub UserForm_Initialize() ComboBox1.Clear ComboBox1.AddItem "Veneto" ComboBox1.AddItem "Sardegna" ComboBox1.AddItem "Lazio" ComboBox1.ListIndex = 0 End Sub Fig. 3 Da notare che la prima voce dell’enunciato è l’istruzione ComboBox1.Clear che serve per svuotare di eventuali dati rimasti in memoria del ComboBox in operazioni precedenti, per essere certi che la casella combinata è vuota, si può usare una condizione come questa : If ComboBox1.ListCount >= 1 Then ComboBox1.Clear L’istruzione ListCount è una proprietà per determinare il numero di righe presenti in una casella combinata o di riepilogo, che inserendola in un enunciato IF verifica se nella casella sono presenti dei dati, infatti se ListCount è maggiore o uguale a 1 allora si esegue lo svuotamento del ComboBox tramite l’istruzione Clear, evitando così il rischio di trovarsi i dati ripetuti nella casella combinata. La penultima istruzione ComboBox1.ListIndex = 0 Indica che si vuole far apparire la prima voce dell’elenco nel Combo come si vede in figura 3, se avessimo usato la dicitura ComboBox.ListIndex = 1 avremmo come prima voce la seconda (Sardegna) presente nell’elenco. Possiamo utilizzare anche un ciclo per popolare il ComboBox in questo modo Codice:
Private Sub UserForm_Initialize() With ComboBox1 .Clear .AddItem "Veneto" .AddItem "Sardegna" .AddItem "Lazio" .ListIndex =0 End With End Sub Codice:
Private Sub UserForm_Initialize() If ListBox1.ListCount >= 1 Then ListBox1.Clear i = 1 Do Until Sheets("Foglio1").Cells(i, 1).Value = "" With Sheets("Foglio1") elemento = .Cells(i, 1).Value End With ListBox1.AddItem elemento i = i + 1 Loop ListBox1.ListIndex = 0 End Sub Il Metodo Clear Questo metodo rimuove tutti gli elementi in un controllo ComboBox o ListBox e presenta la seguente Sintassi: Control.Clear, inoltre è da tenere presente che il metodo non funziona se ComboBox o ListBox viene associato a una fonte di dati utilizzando l’istruzione RowSource, in quanto i dati devono essere cancellati prima dell'uso del metodo Clear La Proprietà BoundColumn Questa proprietà specifica la colonna da cui estrarre il valore da inserire in un controllo ComboBox o ListBox. La prima colonna ha un valore BoundColumn di 1, la seconda colonna ha un valore di 2, e così via, impostando il valore BoundColumn su 1 si assegnerà il valore della colonna 1 al ComboBox o ListBox permettendo così l’inserimento dei valori presenti nella colonna nel controllo. Impostando il valore di BoundColumn a 0 si assegna il valore della struttura ListIndex, che corrisponde al numero della riga selezionata, come valore del controllo ComboBox o ListBox. Questa impostazione è utile se si desidera determinare la riga della voce selezionata. La proprietà BoundColumn può essere impostata nella finestra Proprietà e può essere utilizzato anche con un codice VBA. Esempio: Impostando il valore BoundColumn a 0 si assegna il valore della proprietà ListIndex come valore del controllo Codice:
Private Sub UserForm_Initialize() With ListBox1 .ColumnHeads = True .ColumnCount = 2 .ColumnWidths = "50;0" .RowSource = "=Foglio2!A2:B6" .MultiSelect = fmMultiSelectSingle .TextColumn = 1 .BoundColumn = 0 End With End Sub Private Sub CommandButton1_Click() If ListBox1.Value <> "" Then TextBox1.Value = ListBox1.Value + 2 End If End Sub Si riferisce ad una colonna specifica, o combinazione di colonna e riga, in un ComboBox o ListBox a più colonne. Sintassi: Control.Column (iColumn, iRow). La proprietà Column può essere utilizzata solo con un codice VBA e non è disponibile in fase di progettazione. iColumn specifica il numero di colonna in cui la prima colonna della lista ha valore 0 e iRow specifica il numero di riga la prima riga della lista ha valore 0. Sia iColumn che iRow sono valori interi che vanno da 0 fino al numero di colonne e righe (rispettivamente) nell'elenco meno 1. Se si specifica entrambi i numeri di colonna e riga si farà riferimento ad un elemento specifico, mentre specificando solo il numero di colonna si farà riferimento a una colonna specifica. Per esempio [i]ListBox1.Column (1) è/i] si riferisce alla seconda colonna. È possibile copiare una matrice bidimensionale di valori in un controllo ListBox o ComboBox, utilizzando Column (o list ) piuttosto che aggiungere ogni singolo elemento con il metodo AddItem. Esempio: Popolare il ListBox utilizzando il metodo AddItem e List e utilizzare la proprietà Column per assegnare il contenuto di ListBox a TextBox Codice:
Private Sub UserForm_Initialize() With ListBox1 .ColumnCount = 3 .ColumnWidths = "50;50;50" .ColumnHeads = False .RowSource = "=Foglio2!A2:B6" .MultiSelect = fmMultiSelectMulti End With TextBox1 = "" End Sub Private Sub CommandButton1_Click() 'Il metodo AddItem non funziona se ListBox è associato ai dati, quindi la riga di origine viene cancellata ListBox1.RowSource = "" 'Crea una nuova riga con AddItem ListBox1.AddItem "Banana" 'aggiunge un elemento nella seconda colonna della prima riga ListBox1.List(0, 1) = "Martedì" 'aggiunta di elementi in 3 colonne della prima riga ListBox1.List(0, 2) = "Giorno 2" ListBox1.AddItem "Arancione" 'Aggiunge un elemento nella seconda colonna della seconda riga ListBox1.Column(1, 1) = "Mercoledì" 'aggiunta di elementi in 3 colonne della seconda fila ListBox1.Column(2, 1) = "Giorno 3" ListBox1.AddItem "apple", 0 'Crea una nuova riga con AddItem e si posiziona nella riga 1 ListBox1.List(0, 1) = "Lunedì" 'Aggiunta di elementi in 3 colonne e posiziona questa riga come la prima ListBox1.List(0, 2) = "Giorno 1" 'elemento in colonna 3 e numero di riga 2 del ListBox TextBox1.Value = ListBox1.Column(2, 1) End Sub Specifica il numero di colonne da visualizzare in un controllo ComboBox o ListBox, un valore 0 di ColumnCount non visualizza nessuna colonna e questa proprietà può essere impostata nella finestra Proprietà oppure utilizzando un codice VBA. La Proprietà ColumnHeads ColumnHeads restituisce un valore booleano (True o False) che determina la visualizzazione delle intestazioni di colonna per un ComboBox o ListBox e può essere impostata nella finestra Proprietà oppure utilizzando un codice VBA. Le intestazioni di colonna possono essere visualizzati solo se ColumnHeads è impostato su True nella finestra Proprietà oppure utilizzando il codice: ListBox1.ColumnHeads = True La Proprietà List La proprietà List viene utilizzata in combinazione con ListCount e ListIndex per restituire gli elementi in un controllo ListBox o ComboBox. Sintassi : Control.List (iRow, iCol) . Ogni elemento in una lista ha un numero di riga e un numero di colonna, in cui i numeri di riga e di colonna iniziano da zero, iRow specifica il numero di riga e nel caso iRow = 2 rappresenta la terza riga della lista, mentre invece iColumn specifica il numero di colonna e nel caso che iColumn = 0 indica la prima colonna della lista, omettendo questo argomento iColumn recupererà la prima colonna. Si deve specificare iColumn solo per un ListBox o un ComboBox a più colonne. La proprietà List può essere utilizzata solo con un codice VBA e non è disponibile in fase di progettazione Esempio: Utilizzare Selected, List per visualizzare e selezionare più elementi in un ListBox Codice:
Private Sub UserForm_Initialize() With ListBox1 .ColumnHeads = True .ColumnCount = 2 .ColumnWidths = "50;0" .RowSource = "=Foglio3!A2:B6" .MultiSelect = fmMultiSelectMulti .TextColumn = 1 End With With TextBox1 .MultiLine = True .ControlSource = "=Foglio3!F2" .Value = "" End With End Sub Private Sub CommandButton1_Click() TextBox1.Value = "" For n = 0 To ListBox1.ListCount - 1 If ListBox1.Selected(n) = True Then If TextBox1.Value = "" Then TextBox1.Value = ListBox1.List(n, 1) Else TextBox1.Value = TextBox1.Value & vbCrLf & ListBox1.List(n, 1) End If End If Next n End Sub Determina il numero totale di righe in un controllo ListBox o ComboBox, e questa proprietà può essere utilizzata solo con un codice VBA e non è disponibile in fase di progettazione. La Proprietà ListIndex Determina quale elemento viene selezionato in un controllo ComboBox o ListBox. Il primo elemento di un elenco ha un valore di ListIndex uguale a 0, il secondo elemento ha un valorei 1, e così via, quindi, è un valore intero compreso tra 0 e il numero totale di elementi in un controllo ComboBox o ListBox meno 1. Questa proprietà può essere utilizzata solo con un codice VBA e non è disponibile in fase di progettazione. Nota: In una selezione multipla attivata in un ListBox, ListIndex restituisce l'indice della riga che ha il focus, a prescindere dal fatto che sia selezionata la riga o meno. La Proprietà ListRows Specifica il numero massimo di righe che verranno visualizzate nella parte casella di riepilogo di un ComboBox. Il valore predefinito è 8. Nota: Se il numero effettivo di elementi della lista superi tale valore massimo della proprietà ListRows, apparirà una barra di scorrimento verticale nella casella di riepilogo del ComboBox e le voci in eccesso possono essere visualizzate scorrendo verso il basso). ListCount può essere utilizzata con la proprietà ListRows per specificare il numero di righe da visualizzare in un controllo ComboBox e può essere impostata nella finestra Proprietà oppure con un codice VBA. La proprietà ListRows è valida per ComboBox e non per ListBox. Esempio: Utilizzare la proprietà ListCount e ListRows, per impostare il numero di righe da visualizzare in ComboBox Codice:
Private Sub UserForm_Initialize() With ComboBox1 If .ListCount > 5 Then .ListRows = 5 Else .ListRows = .ListCount End If End With End Sub Specifica se sono consentite selezioni multiple e sono disponibili 3 impostazioni: fmMultiSelectSingle (valore 0), è l'impostazione predefinita, in cui solo un singolo elemento può essere selezionato fmMultiSelectMulti (valore 1), permette selezioni multiple in cui un elemento può essere selezionato o deselezionato facendo clic del mouse o premendo la barra spaziatrice fmMultiSelectExtended (valore 2) permette selezioni multiple, in cui premendo il tasto SHIFT e contemporaneamente spostando la freccia su o giù (o premere MAIUSC e facendo clic del mouse) continua la selezione dalla voce precedentemente selezionata con la selezione corrente (cioè un continuo della selezione); questa opzione permette anche di selezionare o deselezionare una voce premendo CTRL e cliccando il mouse. La proprietà MultiSelect può essere impostata nella finestra Proprietà oppure con un codice VBA. Nota: La proprietà MultiSelect è valida per ListBox e non per ComboBox . Quando vengono effettuate selezioni multiple, gli elementi selezionati possono essere determinati solo mediante la proprietà Selected immobili della ListBox. La struttura Selected avrà valori che vanno da 0 a ListCount meno 1 e sarà True se l'elemento è selezionato e False se non selezionata. Esempio: Determinare l’elemento selezionato in un controllo ListBox a selezione singola Codice:
Private Sub CommandButton1_Click() If ListBox1.Value <> "" Then MsgBox ListBox1.Value End If End Sub Viene utilizzato per rimuovere una riga dalla lista in un ComboBox o ListBox. Sintassi: Control.RemoveItem (row_index), dove Row_index è il numero di riga che deve essere rimosso, considerando che la prima riga ha valore 0. Il metodo RemoveItem non funziona se ComboBox o ListBox viene associato ai dati, quindi utilizzando RowSource i dati devono essere cancellati prima dell'uso, inoltre questo metodo può essere utilizzato solo con un codice VBA. La Proprietà RowSource Specifica la riga di origine di una lista (che potrebbe essere un intervallo del foglio di lavoro), per un ComboBox o ListBox. La proprietà RowSource può essere impostata nella finestra Proprietà oppure con un codice VBA. Per impostare RowSource nella finestra delle Proprietà, digitare senza virgolette il Range di origine in questo modo: " = Foglio2 A2: A6" che popola il ComboBox o il ListBox con i valori presenti nelle celle A2: A6 del Foglio2. Il codice VBA per questo passaggio è: ListBox1.RowSource = "= Foglio2 A2: A6". Non è necessario utilizzare il segno di uguale ("= Foglio2 A2: A6"), impostando la proprietà con ListBox1.RowSource = "Foglio2 A2: A6" avrà lo stesso effetto. La Proprietà Selected Specifica se un elemento viene selezionato in un controllo ListBox. Sintassi: Control.Selected (Item_Index) e restituisce Vero o Falso, se l'elemento è selezionato oppure no, impostando a True per selezionare la voce o rimuovere la selezione [vale a dire. Control.Selected (Item_Index) = True]. Item_Index è un valore intero compreso tra 0 e il numero di elementi nella lista meno 1, indicando la sua posizione relativa nella lista, vale a dire ListBox.Selected (2) = True seleziona il terzo elemento della lista. Questa proprietà è particolarmente utile quando si lavora con selezioni multiple e può essere utilizzata solo con un codice VBA e non è disponibile in fase di progettazione. Nota: In una selezione multipla in un ListBox, ListIndex restituisce l'indice della riga che ha il focus, a prescindere dal fatto che sia selezionata la riga o meno, da cui la proprietà Selected della ListBox può essere utilizzata per impostare una nuova selezione. In una selezione standard del ListBox, ListIndex restituisce l'indice dell'elemento selezionato e quindi dovrebbe essere usata per impostare una nuova selezione. Esempio: Determinare gli elementi selezionati in una selezione multipla ListBox utilizzando selected e List Codice:
Private Sub CommandButton1_Click() For n = 0 To ListBox1.ListCount - 1 If ListBox1.Selected(n) = True Then MsgBox ListBox1.List(n) End If Next n End Sub Questa proprietà è valida per ComboBox e non per ListBox e determina se la scelta della voce può essere fatta dalla lista a discesa oppure digitando nel campo di testo il valore della ComboBox. Dispone di due impostazioni:
La Proprietà TextColumn Specifica la colonna da visualizzare in un controllo ComboBox o ListBox a più colonne, quando una riga è selezionata dall'utente. La prima colonna ha un valore TextColumn di 1, la seconda ha un valore di 2, e così via. Impostare il valore di TextColumn a 0 visualizza il valore ListIndex (che è il numero della riga selezionata) nella proprietà TextColumn, questa impostazione è utile se si desidera determinare la riga della voce selezionata. La proprietà TextColumn può essere impostata nella finestra Proprietà o con codice VBA. Nota: In un ComboBox, quando un utente seleziona un elemento, la colonna specificata nella proprietà TextColumn verrà visualizzato nella parte casella di testo del ComboBox. Esempio: Utilizzo di TextColumn per visualizzare prima colonna e BoundColumn per la seconda colonna in una ListBox a selezione singola Codice:
Private Sub UserForm_Initialize() With ListBox1 .ColumnHeads = True .ColumnCount = 2 .ColumnWidths = "50;0" .RowSource = "=Foglio2!A2:B6" .MultiSelect = fmMultiSelectSingle .TextColumn = 1 .BoundColumn = 2 End With End Sub Private Sub CommandButton1_Click() If ListBox1.Value <> "" Then TextBox1.Value = ListBox1.Value & " cms" End If End Sub Impostare la proprietà RowSource di un controllo ListBox o ComboBox in un form utente per un elenco statico: Me.ListBox1.RowSource = "Foglio1 A1: B6" oppure Me.ListBox1.RowSource = "= Foglio1 A1: B6" Mentre per un elenco dinamico: Me.ListBox1.RowSource = "Foglio1 A1: B" . & Foglio1.Cells (Rows.Count, "B") End (xlUp) Row Esempio: Popolare un ComboBox impostando la proprietà RowSource di una lista denominata Codice:
Private Sub UserForm_Initialize() With ComboBox1 .ColumnCount = 2 .ColumnWidths = "50;50" .ColumnHeads = True .RowSource = "Foglio1!nome_intervallo" <<<< da cambiare con Vs. nome intervallo End With End Sub ListBox1.List = Array ("Riga1", "Riga2", "Riga3", "Riga4") in un ComboBox: ComboBox1.List = array ("Riga1", " Riga2", " Riga3", " Riga4") Compilare un ListBox da una matrice denominata myArray: Dim myArray As Variant myArray = Array ("Adidas", "Nike", "Reebok") Me.ListBox1.List = myArray Popolare una singola colonna in un ComboBox: Dim i As Integer Dim myArray As Variant myArray = Array ("Adidas", "Nike", "Reebok", "Puma", "Polo") For i = LBound(myArray) To UBound(myArray) Me.ComboBox1.AddItem myArray(i) Next Esempio: Popolare un ListBox a più colonne da un Range del foglio di lavoro Codice:
Private Sub UserForm_Initialize() With ListBox1 .ColumnCount = 3 .ColumnWidths = "50;50;50" .ColumnHeads = False End With Dim rng As Range Set rng = Foglio1.Range("A1:C6") Me.ListBox1.List = rng.Cells.Value End Sub Codice:
Private Sub UserForm_Initialize() With ListBox1 .ColumnCount = 3 .ColumnWidths = "50;50;50" .ColumnHeads = False End With Dim var As Variant var = Foglio1.Range("A1:C6") Me.ListBox1.List = var End Sub Codice:
Option Base 1 Private Sub UserForm_Initialize() Dim rng As Range Dim cell As Range Dim totalRiga As Integer, totalColon As Integer Dim iRow As Integer, iCol As Integer Dim myArray() As Variant Set rng = Foglio1.Range("A1:C6") totalRiga = Foglio1.Range("A1:C6").Rows.Count totalColon = Foglio1.Range("A1:C6").Columns.Count ReDim myArray(totalRiga, totalColon) For Each cell In rng For iRow = 1 To totalRiga For iCol = 1 To totalColon myArray(iRow, iCol) = rng.Cells(iRow, iCol) Next iCol Next iRow Next With ListBox1 .ColumnCount = 3 .ColumnWidths = "50;50;50" .ColumnHeads = False .List = myArray End With End Sub Codice:
Private Sub UserForm_Initialize() With ListBox1 .ColumnCount = 3 .ColumnWidths = "50;50;50" .ColumnHeads = False End With With ListBox2 .ColumnCount = 3 .ColumnWidths = "50;50;50" .ColumnHeads = False End With End Sub Private Sub CommandButton1_Click() Dim myArray(3, 3) For n = 0 To 2 myArray(n, 0) = n + 1 Next n myyArray(0, 1) = "R1C2" myArray(1, 1) = "R2C2" myArray(2, 1) = "R3C2" myArray(0, 2) = "R1C3" myArray(1, 2) = "R2C3" myArray(2, 2) = "R3C3" ListBox1.List() = myArray ListBox2.Column() = myArray End Sub Codice:
Private Sub UserForm_Initialize() With ComboBox1 .ColumnCount = 1 .ColumnWidths = "50" .ColumnHeads = False .RowSource = "" End With For n = 1 To 12 ComboBox1.AddItem Format(DateSerial(2014, n, 1), "mmmm") Next n End Sub Codice:
Private Sub UserForm_Initialize() With ListBox1 .ColumnCount = 3 .ColumnWidths = "50;50;50" .RowSource = "" End With End Sub Private Sub CommandButton1_Click() Dim conta As Long Dim totalRiga As Long totalRiga = Foglio4.Cells(Rows.Count, "A").End(xlUp).Row conta = 0 Do With Me.ListBox1 conta = conta + 1 .AddItem Foglio4.Cells(conta, 1).Value .List(.ListCount - 1, 1) = Foglio4.Cells(conta, 1).Offset(0, 1).Value .List(.ListCount - 1, 2) = Foglio4.Cells(conta, 1).Offset(0, 2).Value End With Loop Until conta = totalRiga End Sub
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
13-02-2012, 17.51.32 | #12 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Gestione Preventivi: Il Listino Prezzi
Vorrei ora presentarvi la costruzione di un’applicazione di Gestione preventivi molto semplice e intuitiva nell’uso quotidiano, che dispone di un archivio per poter archiviare e visionare i preventivi emessi, di un’anagrafica clienti, di un listino prezzi e altri piccoli accessori che possono essere utili senza dover ricorrere a software costosi e altrettanti onerosi canoni di manutenzione. Ritengo la fase di progettazione di un software molto importante in quanto deve essere prevista la possibilità di eseguire future implementazioni e si deve operare in modo da poter essere in grado di approntarle in un prossimo futuro. Pertanto è opportuno dotare il foglio preventivi delle opportune “ruote di scorta” che possono esserci utili nel proseguo della programmazione. Parte fondamentale di questa breve presentazione è il foglio Listino e il foglio Archivio, in quanto si deve prevedere la possibilità di poter aggiungere dei campi a seconda delle necessità. Ho pensato di utilizzare un listino prezzi separando gli articoli in categorie merceologiche in modo da poter individuare facilmente gli articoli durante la stesura del preventivo stesso, e facilitando anche le operazioni di stampa per categoria per i normali usi di gestione giacenze. Pertanto la struttura del foglio Listino, avrà questo aspetto: Fig. 1 Nota: La larghezza delle colonne è stata volutamente ristretta per poterla rappresentare in questa guida in modo graficamente visibile, potete dare le dimensioni che volete alle varie colonne. Come vedete ho strutturato il Listino Prezzi sviluppando le categorie sulle colonne e dedicando ad ogni categoria 14 colonne, separandole da una colonna vuota. La riga 1 ospita il titolo della categoria (rif. A1), la riga 2 le etichette (rif. A2) per le varie colonne e dalla riga 3 inseriamo tutti gli articoli con i relativi dati. Essendo ogni categoria composta da 14 colonne, divise da una colonna vuota, e considerando che un foglio di Excel ha 256 colonne disponibili (ver. 2003), facendo un rapido calcolo, dividendo le 256 colonne totali per le 15 utilizzate (14 + la colonna vuota) danno come risultato 16 categorie, che a mio avviso è un numero più che soddisfacente di categorie. Ogni categoria ha una colonna in cui inserire il codice articolo, poi la descrizione dell’articolo e infine una colonna note, a cui si può dedicare la locazione dell’articolo. Per esempio se parliamo di un componente del motore di una vettura sarà alloggiato nella categoria Motore, e nel campo note si può identificare ulteriormente inserendo Distribuzione oppure Iniezione. Può ritornare utile questo “sottogruppo” per poter estrarre tutti gli articoli che appartengono alla categoria Motore suddividendoli per sottocategorie, come per esempio Iniezione o Distribuzione. Dopo il campo note troviamo il campo Fornitore e di seguito il Codice Fornitore, che sarebbe il codice dell’articolo assegnato dal fornitore nel suo archivio, molto utile da riportare in eventuali ordini a fornitore. Nel campo U.M. va inserita l’unità di misura dell’articolo e nel campo successivo la data cui viene inserito il prezzo, che si trova nel campo successivo e che si riferisce al prezzo di acquisto dell’articolo. Il campo successivo rappresenta la percentuale di ricarico sul prezzo di acquisto dell’articolo e il prodotto viene inserito nel campo successivo che rappresenta il prezzo finale di vendita. In seguito ci sono altre 4 colonne vuote, che simpaticamente le chiamiamo RDS cioè Ruota di Scorta, utili per ricevere eventuali implementazioni in un prossimo futuro Fatta questa premessa per spiegare la struttura del foglio Listino possiamo ora passare all’interrogazione dello stesso ipotizzando che in questa fase gli articoli di prova siano stati inseriti manualmente agendo direttamente dal foglio, vedremo anche l’inserimento e la modifica degli articoli nella Form che segue. Come abbiamo già spiegato nel corso base inseriamo una Userfom e la strutturiamo come la seguente inserendo i vari controlli. Fig. 2 Come prima operazione da eseguire, dobbiamo popolare il ListBox1 (quello delle categorie), e per farlo sfruttiamo l’evento Activate della form che ospita i controlli inserendo questo codice. Codice:
Private Sub UserForm_Activate() 1) Dim j As Integer 2) j = 1 3) Do Until Sheets("Listino").Cells(1, j) = Empty 4) ListBox1.AddItem (Sheets("Listino").Cells(1, j).Value) 5) j = j + 15 6) Loop End Sub Commentiamo questo codice: Alla riga 1 dell’enunciato viene dichiarata la variabile j come Integer e alla riga 2 vien posta uguale a 1. Alla riga 3 con un ciclo Do Loop si scorre tutto il foglio Listino con le coordinate di riga 1 e di colonna j che in questo momento ha il valore di 1, pertanto le coordinate diventano riga 1, colonna 1. Alla riga 4 carichiamo il ListBox1 con i valori reperiti nel foglio Listino alle coordinate di riga 1 e colonna j ma alla riga 5 la variabile j, che vale 1 viene incrementata di 15 unità e sostituendo nell'operazione matematica il nome della variabile e inserendo il suo valore ci riporta j=1+15 che prende il valore di 16. Alla riga 6 ritorniamo ad inizio del ciclo tramite la parola chiave Loop con la variabile j che adesso vale 16. Si continua nel ciclo Do effettuando un “salto” ogni 16 colonne fino a trovare nelle coordinate di riga e colonna nessun valore e interrompere il ciclo. Una volta che abbiamo riempito il ListBox1 delle categorie, facendo clic sullo stesso dobbiamo riempire il ListBox2 con l’elenco degli articoli presenti per la categoria selezionata. Per eseguire l’operazione richiesta sfruttiamo l’evento Click del ListBox2 e inseriamo questo codice Codice:
Private Sub ListBox1_Click() 1) posiz = (ListBox1.ListIndex + 1) * 15 - 14 2) If ListBox2.ListCount >= 1 Then ListBox2.Clear 3) i = 3 4) Do Until Sheets("Listino").Cells(i, posiz) = Empty 5) With Sheets("Listino") 6) elemen = .Cells(i, posiz).Value & Space(5) & .Cells(i, posiz + 1).Value 7) End With 8) ListBox2.AddItem elemen 9) i = i + 1 10) Loop 11) cancella End Sub Fig. 3 Nella riga 1 usiamo la variabile posiz per calcolare le coordinate della colonna iniziale delle categorie usando una espressione matematica articolata in questo modo. L’istruzione ListBox.ListIndex + 1 riporta la posizione della voce che andiamo a selezionare nella casella a discesa (ListBox1), per esempio se clicchiamo sulla Categoria 2, la funzione riporta come risultato il numero 2. Per verificarlo modifichiamo il listato in questo modo e mandiamolo in esecuzione Codice:
Private Sub ListBox1_Click() posiz = (ListBox1.ListIndex + 1) MsgBox posiz End Sub Fig. 4 Pertanto selezionata la categoria nel ListBox1 abbiamo il valore di ListBox.ListIndex che andremo a moltiplicare per 15 (che rappresenta il numero delle colonne presenti in una categoria) e a cui sottraiamo il numero 14 (che rappresenta il numero delle colonne meno la colonna vuota nera di divisione). Facendo un rapido calcolo le 3 categorie si trovano alla colonna 1 (Rif. A1) poi alla colonna 16 (Rif. P1) e l’ultima categoria si trova alla colonna 31 (Rif. AE1) Infatti cliccando sulla prima voce del ListBox1 ci viene rimandato come valore di ListBox.ListIndex il numero 1 che moltiplicandolo per 15 e sottraendo 14 riporta come risultato finale 1, che rappresenta la colonna 1. Utilizzando la stessa logica matematica per le altre 2 categorie, avremmo che per la seconda categoria ListBox.ListIndex assume il valore di 2 e per la terza categoria il valore di 3. Eseguendo l’operazione matematica per la seconda categoria moltiplichiamo il valore di ListBox.ListIndex che è 2 per 15 e sottraendo 14 otteniamo come risultato finale il numero 16. Che corrisponde all’esatto numero di colonna in cui inizia la seconda categoria. Anche per la terza categoria, seguendo sempre il calcolo matematico, moltiplicando il valore di ListBox.ListIndex che è 3 per 15 e sottraendo 14 riporta come risultato finale il numero 31. Ritornando all’enunciato del ListBox1 alla riga 2 si verifica se il numero di voci presenti nel ListBox2 sia maggiore di zero o uguale a 1, se il risultato della verifica è True (cioè Vero) allora si svuota tutto l’elenco di voci presenti nel LIstBox2. Proseguendo alla riga 3 poniamo la variabile i uguale a 3 e nella riga 4, scorriamo tutte le colonne del foglio Listino alle coordinate di riga i (che vale 3) e di colonna posiz (che vale 1 per la prima voce, 16 per la seconda e 31 per la terza) e il ciclo si ferma quando alle coordinate di colonna NON trova niente scritto niente (Empty = vuoto) nella cella. Successivamente alla riga 5 iniziamo un ciclo With che alla riga 6 usiamo per caricare la matrice elemen con I valori presenti alle coordinate di riga I e colonna posiz, inseriamo poi uno spazio di 5 caratteri e memorizziamo in matrice anche I valori che si trovano alle coordinate di riga I e colonna posiz+1. Alla riga 7 dichiariamo la fine del ciclo With e alla [color="Navy"] riga 8[/color + popoliamo il listBox2 con la matrice elemen. Alla riga 9 incrementiamo la variabile i di una unità e alla riga 10 ritorniamo all’inizio del ciclo Do con la parola chiave Loop e ripetiamo tutte le istruzioni con il valore di riferimento di riga incrementato di 1 per passare così alle righe successive. Il ciclo si arresta quando si trova una riga vuota. Alla riga 11 viene richiamata la routine Cancella che si occupa di svuotare tutti i valori presenti nei vari TextBox della form tramite questo codice Codice:
Private Sub cancella() z = 1 For z = 1 To 10 Controls("TextBox" & z) = "" Next z End Sub A questo punto abbiamo il ListBox 2 popolato che ci presenta tutti gli articoli presenti nella categoria selezionata, ora cliccando su un articolo presente nel listBox2 dobbiamo estrarre i valori dell’articolo presenti nel foglio e inserirli nelle varie caselle di testo (TextBox) utilizzando il seguente codice. Codice:
Private Sub ListBox2_Click() 1) p = ListBox2.ListIndex + 3 2) cancella 3) vedi End Sub Codice:
Private Sub vedi() On Error Resume Next With Sheets("Listino") TextBox1.Text = .Cells(p, posiz) 'codice articolo TextBox2.Text = .Cells(p, posiz + 4) 'codice articolo fornitore TextBox3.Text = .Cells(p, posiz + 1) 'descrizione articolo TextBox4.Text = .Cells(p, posiz + 2) 'note articolo TextBox5.Text = .Cells(p, posiz + 3) 'fornitore TextBox6.Text = .Cells(p, posiz + 5) 'unità di misura TextBox7.Text = .Cells(p, posiz + 6) 'data inserimento costo TextBox8.Text = Format(.Cells(p, posiz + 7), "#0.00") 'costo articolo TextBox9.Text = Format(.Cells(p, posiz + 8), "#%") ' % ricarico TextBox10.Text = .Cells(p, posiz + 9) 'prezzo vendita calcola End With End Sub Essendo posiz un valore variabile tramite la scelta della categoria, in questo modo possiamo spostarci nelle varie colonne con una notazione “variabile” nel codice, cioè non usando delle coordinate fisse che andrebbero bene per una categoria ma non per le altre che andremo a scegliere. Nel proseguo del listato incontriamo poi la routine calcola, che si occupa di verificare il prodotto tra il campo “costo articolo” e “percentuale di ricarico” la routine è: Codice:
Private Sub calcola() 'calcolo prezzo articolo con ricarico TextBox10.Text = Format(CDbl(TextBox10) + CDbl(TextBox8) * Val(TextBox9) / 100, "#0.00") End Sub Codice:
Private Sub TextBox8_Change() ' costo di acquisto If TextBox8 <> "" Then TextBox10.Text = Format(CDbl(TextBox8) + CDbl(TextBox8) * Val(TextBox9) / 100, "#0.00") Else End If End Sub Private Sub TextBox9_Change() ' % ricarico If TextBox9 <> "" Then TextBox10.Text = Format(CDbl(TextBox8) + CDbl(TextBox8) * Val(TextBox9) / 100, "#0.00") Else End If End Sub Codice:
Private Sub CommandButton1_Click() If p = 0 Then MsgBox "Devi scegliere un articolo", vbExclamation Exit Sub End If scrivi End Sub Codice:
Private Sub scrivi() On Error Resume Next With Sheets("Listino") .Cells(p, posiz) = TextBox1.Text 'codice articolo .Cells(p, posiz + 1) = TextBox3.Text 'descrizione articolo .Cells(p, posiz + 2) = TextBox4.Text 'note articolo .Cells(p, posiz + 3) = TextBox5.Text 'fornitore .Cells(p, posiz + 4) = TextBox2.Text 'codice articolo fornitore .Cells(p, posiz + 5) = TextBox6.Text 'unità di misura .Cells(p, posiz + 6) = TextBox7.Text 'data inserimento costo .Cells(p, posiz + 7) = TextBox8.Text 'costo articolo .Cells(p, posiz + 8) = TextBox9.Text '% ricarico .Cells(p, posiz + 9) = TextBox10.Text 'Prezzo vendita End With End Sub Codice:
Private Sub CommandButton2_Click() Unload Me End Sub Codice:
Private Sub CommandButton3_Click() stampa End Sub Codice:
Sub stampa() 1) Application.ScreenUpdating = False 2) Sheets("listino").Select 3) Cells(1, posiz).Select 4) ultima = Cells(Rows.Count, posiz).End(xlUp).Row 5) Range(Cells(1, posiz), Cells(ultima, posiz + 9)).Select 6) Selection.Copy 7) Workbooks.Add 8) Range("A1").Select 9) ActiveSheet.Paste 10) Range("a1").Select 11) Range("C:C,I:I").Delete 12) Columns(1).ColumnWidth = 8 'codice 13) Columns(2).ColumnWidth = 30 'descrizione 14) Columns(3).ColumnWidth = 15 'fornitore 15) Columns(4).ColumnWidth = 8 'codice fornitore 16) Columns(5).ColumnWidth = 8 'U.M. 17) Columns(6).ColumnWidth = 10 'data 18) Columns(7).ColumnWidth = 10 'vendita 19) With ActiveSheet.PageSetup 20) .PrintTitleRows = "$1:$2" 21) .CenterHeader = "Listino Articoli - Pagina &P di &N" 22) .RightHeader = "&""Arial,Grassetto\&12Stampa del &D" 23) .LeftMargin = Application.InchesToPoints(0) 24) .RightMargin = Application.InchesToPoints(0) 25) .CenterHorizontally = True 26) .CenterFooter = "Data stampa :&D" 27) .Zoom = 90 28) End With 29) ActiveSheet.PrintOut Copies:=1 30) ActiveWorkbook.Saved = True 31) ActiveWorkbook.Close 32) Windows("Preventivi.xls").Activate 33) Range("Q10").Select 34) Application.CutCopyMode = False 35) Application.ScreenUpdating = True 36) Unload Me End Sub Commentiamo ora il codice della routine. Con l’istruzione presente alla riga 1 si evita di vedere a video le operazioni che compie la macro in esecuzione, alla riga 2 attiviamo il foglio “Listino” e selezioniamo la cella alle coordinate di riga 1 e colonna posiz (che conosciamo già) alla riga 4 troviamo l’ultima cella scritta della colonna posiz e alla riga 5 selezioniamo l’intervallo di celle partendo dalla riga 1 e colonna posiz fino alla riga ultima e colonna posiz + 9. Alla riga 6 copiamo l’intervallo di celle, alla riga 7 aggiungiamo una nuova cartella di lavoro, selezioniamo la cella A1 alla riga 8 e alla riga 9 incolliamo i dati copiati precedentemente, poi selezioniamo la cella A1 alla riga 10 e cancelliamo due colonne alla riga 11. Dalla riga 12 alla riga 18 modifichiamo la larghezza delle prime 7 colonne per adattarle al testo e dalla riga 19 alla riga 28 impostiamo il setup della stampante, per poi mandare il documento in stampa alla riga 29. Alla riga 30 salviamo il file creato, (magari utile per future consultazioni) e alla riga 31 lo chiudiamo. Passiamo poi il controllo al file origine, cioè “Preventivi.xls” alla riga 32, selezioniamo la cella Q10 alla riga 33 e alla riga 34 disabilitiamo la selezioni delle celle copiate nel foglio Listino, per poi riabilitare lo schermo e chiudere la routine alla riga 36
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
13-02-2012, 17.54.55 | #13 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
#2
Gestione Preventivi: Anagrafica Clienti
In un programma di gestione Preventivi non può mancare la gestione dell’anagrafica clienti. Ora vedremo come costruire e gestire un archivio anagrafico, visualizzarne i dati, modificarli e inserirne di nuovi. L’anagrafica oltre ad essere molto importante in ogni supporto informatico risulta essere molto utile in quanto la possiamo strutturare in modo da pianificare il lavoro quotidiano inserendo per ciascun cliente, oltre ai dati anagrafici, anche i recapiti telefonici, il fax, l’indirizzo email e tanto altro. Iniziamo strutturando il foglio clienti che conterrà l’elenco dei dati in questo modo. Fig. 1 Nota: La larghezza delle colonne è stata volutamente ristretta per poterla rappresentare in questa guida in modo graficamente visibile, potete dare le dimensioni che volete alle varie colonne. L’archivio clienti che utilizzeremo in questo contesto è rappresentato dal foglio di lavoro “clienti”, in cui la prima riga viene utilizzata per inserire le intestazioni delle colonne e dalla riga successiva andremo ad inserire l’elenco dei dati. Questa struttura ricalca il concetto di tabella nei database, dove le colonne rappresentano i campi della tabella e le righe i record. Inseriamo 5 clienti di prova e costruiamo una Userform per interrogare l’archivio come quella riportata in figura 2, con 1 controllo LisBox, 16 controlli TextBox inseriti in un controllo Frame e 3 controlli CommandButton Fig. 2 Nell’evento Activate della Form è stato inserito il listato che permette di visualizzare l’archivio clienti in questo modo: Codice:
Private Sub UserForm_Activate() aggiorna End Sub Codice:
Private Sub aggiorna() 1. If ListBox1.ListCount >= 1 Then ListBox1.Clear 2. i = 2 3. Do Until Sheets("clienti").Cells(i, 2).Value = "" 4. With Sheets("clienti") 5. elemento = .Cells(i, 2).Value 6. End With 7. ListBox1.AddItem elemento 8. i = i + 1 9. Loop 10. ListBox1.ListIndex = 0 End Sub Mentre il ciclo scorre le righe vengono letti i valori alle coordinate di riga i e colonna 2 e caricati nella matrice elemento per poi usarla per popolare il ListBox1 con l’istruzione AddItem, presente alla riga 7. Alla riga 9 la parola chiave Loop ci riporta a inizio del ciclo, alla riga 3, e si ripetono tutte le operazioni fino alla riga 9 che terminano quando viene trovata una cella vuota nella colonna 2 che segnala la fine dell’archivio. La riga 10 con l’istruzione ListIndex si Indica al programma che vogliamo far apparire come prima voce dell’elenco nel ListBox, la prima voce dell’elenco dell’archivio clienti, se avessimo assegnato a ListIndex il valore 1 avremmo come prima voce la seconda presente nell’elenco dei clienti, perché questo tipo di controllo ha come valore iniziale “0” [zero], per cui la prima voce presente nell’elenco di questo controllo avrà come valore List 0, la seconda valore 1, la terza valore 2 e così di seguito. A questo punto del programma avremmo il ListBox1 con l’elenco dei clienti, se notate presenta un pallino sulla sinistra del nome del cliente, questa opzione è possibile ottenerla agendo sulla proprietà ListStyle dalla finestra delle proprietà una volta selezionato il controllo come evidenziato in Figura 3 dalla freccia rossa. Fig. 3 Quando selezioniamo un cliente nel ListBox1 facendo clic col mouse su uno di loro, tutti i controlli TextBox verranno popolati con i dati presenti nell’archivio sfruttando l’evento Click del controllo ListBox tramite questo codice Codice:
Private Sub ListBox1_Click() 1. p = ListBox1.ListIndex + 2 2. vedi End Sub Fig. 4 Alla riga 2 viene richiamata la routine vedi, che si occupa di popolare tutti i controlli TextBox con i dati del cliente scelto. Il codice della routine è il seguente: Codice:
Private Sub vedi() TextBox1.Text = Sheets("clienti").Cells(p, 1) 'cod TextBox2.Text = Sheets("clienti").Cells(p, 2) 'rag.sociale TextBox3.Text = Sheets("clienti").Cells(p, 3) 'indirizzo TextBox4.Text = Sheets("clienti").Cells(p, 4) 'cap TextBox5.Text = Sheets("clienti").Cells(p, 5) 'città TextBox6.Text = Sheets("clienti").Cells(p, 6) 'provincia TextBox7.Text = Sheets("clienti").Cells(p, 7) 'p.iva TextBox8.Text = Sheets("clienti").Cells(p, 8) 'pagamento TextBox9.Text = Sheets("clienti").Cells(p, 9) 'banca+agenzia TextBox10.Text = Sheets("clienti").Cells(p, 10) 'iban TextBox11.Text = Sheets("clienti").Cells(p, 11) 'email TextBox12.Text = Sheets("clienti").Cells(p, 12) 'telefono TextBox13.Text = Sheets("clienti").Cells(p, 13) 'telefono diretto TextBox14.Text = Sheets("clienti").Cells(p, 14) 'fax TextBox15.Text = Sheets("clienti").Cells(p, 15) 'responsabile TextBox16.Text = Sheets("clienti").Cells(p, 16) 'cellulare End Sub Nota: Con il termine colonna fissa si intende una colonna definita da un numero preciso e NON da una variabile Abbiamo citato varie volte la routine cancella, vediamo ora il suo codice Codice:
Private Sub cancella() 1. conta = 1 2. For conta = 1 To 16 3. Controls("TextBox" & conta) = "" 4. Next conta End Sub Possiamo ora vedere le azioni svolte dai 3 pulsanti presenti nella Form. Il pulsante Uscita risulta molto semplice e oramai conosciuto per uscire da tutte le Form di VBA, questo è il codice Codice:
Private Sub CommandButton1_Click() Unload Me End Sub Fig. 5 Utilizzeremo il foglio di appoggio inserendo nelle varie righe della prima colonna (A) tutte le descrizioni delle operazioni che ci interessano e poi nella colonna 2 (B) inseriamo i dati che andremo ad utilizzare nelle nostre procedure. Come potete vedere dalla figura 5 il foglio di appoggio non viene utilizzato solo per creare un progressivo del codice cliente, ma dalle descrizioni delle varie operazioni si può ipotizzare che l’uso di questa “tecnica” all’interno dei nostri progetti sia molto vasta e diffusa. Passiamo ora a vedere il codice della routine di inserimento nuovo cliente Codice:
Private Sub CommandButton3_Click() 1. cancella 2. Mt = Mt & "Attenzione vuoi inserire un nuovo Cliente Confermi?" & Chr(13) & Chr(13) 3. rs = MsgBox(prompt:=Mt, Title:="Gestione Clienti", Buttons:=vbYesNo + vbQuestion) 4. If rs = vbNo Then Exit Sub 5. x = Sheets("Setup").Cells(1, 2) 6. TextBox1.Text = x + 1 7. Sheets("Setup").Cells(3, 2) = True 8. TextBox2.SetFocus End Sub Fig. 6 Se abbiamo deciso di proseguire con l’inserimento di un nuovo cliente cliccando sul pulsante Si, alla riga 5 assegniamo alla variabile x il valore che abbiamo precedentemente scritto con altra routine, che vedremo poco sotto, nella riga 1 e colonna 2 del foglio di appoggio Setup e alla riga 6 assegniamo tale valore al controllo TextBox1 della Form incrementandolo di 1 unità. In questo modo con una sola riga di codice abbiamo ottenuto il codice cliente in forma progressiva. Alla riga 7 del listato andiamo a scrivere il valore True alla riga 3 e colonna 2 del foglio setup, questa scrittura la utilizzeremo come Flag (bandierina) per segnalare ad altra routine da dove proviene una determinata richiesta. Nel nostro caso dobbiamo far sapere alla routine che si occupa di salvare tutti i dati che stiamo facendo un nuovo inserimento, per cui dobbiamo calcolare la riga in cui andare a scrivere i nuovi dati. Nel caso di un nuovo cliente si deve trovare la prima riga vuota dell’elenco e in quella inserire i nuovi dati. Alla riga 8 portiamo il focus, cioè portiamo il cursore sul controllo TextBox2 in attesa dell’inserimento da parte dell’utente della ragione sociale del cliente. Passiamo ora al pulsante Salva che si occupa di salvare i dati di un cliente nell’archivio anagrafico tramite questo codice Codice:
Private Sub CommandButton2_Click() 1. If Sheets("Setup").Cells(3, 2) = True Then 2. Application.ScreenUpdating = False 3. Sheets("clienti").Select 4. ultima = Cells(Rows.Count, 1).End(xlUp).Row 5. p = ultima + 1 6. Sheets("Setup").Cells(1, 2) = TextBox1.Text 7. Sheets("Setup").Cells(3, 2) = False 8. ElseIf Sheets("Setup").Cells(3, 2) = False Then 9. End If 10. Sheets("clienti").Cells(p, 1) = TextBox1.Text 'cod 11. Sheets("clienti").Cells(p, 2) = TextBox2.Text 'rag. sociale 12. Sheets("clienti").Cells(p, 3) = TextBox3.Text 'indirizzo 13. Sheets("clienti").Cells(p, 4) = TextBox4.Text 'cap 14. Sheets("clienti").Cells(p, 5) = TextBox5.Text 'città 15. Sheets("clienti").Cells(p, 6) = TextBox6.Text 'provincia 16. Sheets("clienti").Cells(p, 7) = TextBox7.Text 'P.iva 17. Sheets("clienti").Cells(p, 8) = TextBox8.Text 'Pagamento 18. Sheets("clienti").Cells(p, 9) = TextBox9.Text 'Banca 19. Sheets("clienti").Cells(p, 10) = TextBox10.Text 'Iban 20. Sheets("clienti").Cells(p, 11) = TextBox11.Text 'email 21. Sheets("clienti").Cells(p, 12) = TextBox12.Text 'Telefono1 22. Sheets("clienti").Cells(p, 13) = TextBox13.Text 'Telefono diretto 23. Sheets("clienti").Cells(p, 14) = TextBox14.Text 'fax 24. Sheets("clienti").Cells(p, 15) = TextBox15.Text 'responsabile 25. Sheets("clienti").Cells(p, 16) = TextBox16.Text 'cellulare 26. aggiorna 27. cancella End Sub Con il codice presente dalla riga 10 alla riga 25 vengono sostituiti i valori presenti nel foglio clienti alle coordinate di riga p e colonna fissa con il valore contenuto nei controlli TextBox. Alla riga 26 viene richiamata la routine aggiorna, che ripopola il controllo ListBox, se questo non avvenisse, e andiamo a modificare solo il nome del cliente, tale modifica non comparirebbe nel ListBox, mentre invece ricaricando i dati avremo istantaneamente la modifica fatta anche nel ListBox. Alla riga 27 viene richiamata la solita routine cancella, che svuota tutti i controlli TextBox
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
05-03-2012, 15.48.07 | #14 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
#14
Gestione Preventivi - Parte 3
In questa lezione vedremo la memorizzazione dei documenti e la loro consultazione, a completamento del file “Preventivi” usato finora per approfondire gli argomenti trattati nelle lezioni precedenti. L’area di lavoro principale è il foglio “Preventivi” che abbiamo strutturato come da figura Fig. 1 Abbiamo visto che per emettere il documento si deve agire nel seguente modo: 1) Cliccare sul pulsante “Nuovo documento” per inserire data e numero del documento 2) Cliccare sul pulsante “Cliente” per selezionare il destinatario del documento 3) Compilare manualmente i campi “Agente” e “Trasporto” agendo sulle frecce di selezione del campo 4) Inserire gli articoli cliccando sul pulsante “Inserisci Articoli” Una volta eseguite queste fasi il documento è compilato in tutte le sue parti e possiamo eseguire la stampa e la memorizzazione in archivio premendo il pulsante “Memorizza” che ci mostrerà una finestra di scelta come questa Fig. 2 Come si intuisce dall’immagine prima dell’archiviazione viene richiesto se vogliamo stampare il documento, se clicchiamo su Si il Preventivo viene inviato alla stampante di sistema e poi archiviato, scegliendo No si archivia direttamente svuotando il foglio. Vediamo il codice associato al pulsante Memorizza: Codice:
Sub Memorizza() m = Sheets("Setup").[B3] 'riga dove scrivere posiz = Sheets("Setup").[B4] 'colonna dove scrivere Dim Mt As String If Sheets("Setup").[B2] = True Then 'controllo il flag Mt = Mt & "Attenzione Il Preventivo era già in memoria ??" & Chr(13) & Chr(13) Mt = Mt & "Vuoi Sovrascriverlo??" & Chr(13) & Chr(13) rs = MsgBox(prompt:=Mt, Title:="Gestione Preventivi", Buttons:=vbYesNo + vbQuestion) If rs = vbNo Then Exit Sub salva svuota_prev ElseIf Sheets("Setup").[B2] = False Then Sheets("Setup").[B1] = [P14] salva svuota_prev End If End Sub Fig. 3 Tornando al codice della routine “Memorizza”, commentiamo ora le prime due righe di codice m = Sheets("Setup").[B3] posiz = Sheets("Setup").[B4] Con l’enunciato sopra esposto assegniamo alle variabili m e posiz il valore presente nelle celle B3 e B4 del foglio “Setup” che rappresentano rispettivamente il numero di riga e colonna del foglio “Archivio” dove andremo a salvare i dati. Queste due variabili nel modulo VBA in cui sono alloggiate, sono utilizzate da varie Routine (Sub) per cui devono essere accessibili a tutte le procedure o Sub presenti nel modulo stesso. Per renderle disponibili alle varie Routine si devono dichiarare con l’enunciato Dim all’inizio del modulo e prima di qualsiasi altra dichiarazione, come si può vedere dalla figura sottostante Fig. 4 E’ risaputo che il salvataggio dei dati è una fase molto importante, pertanto dobbiamo verificare prima di eseguirla se il documento presente nel foglio “Preventivi” è un Nuovo Documento o se è un documento esistente caricato dall’archivio, in quanto i valori delle variabili m e posiz variano per i due casi. Per identificare la “provenienza” del documento usiamo dei “Segnalatori” o Flag, in questo modo: If Sheets("Setup").[B2] = True In pratica abbiamo precedentemente salvato in una cella del foglio “Setup” la dicitura FALSE o TRUE in base all’operazione che stiamo facendo. Se iniziamo un nuovo documento al momento del click sul pulsante “Nuovo Documento” andremo a scrivere nella cella B2 il valore FALSE, mentre invece se clicchiamo sul pulsante “Richiama” per editare un documento presente in archivio, andremo a scrivere TRUE. E’ come “Segnare il percorso” e in questo modo sappiamo se stiamo facendo un nuovo documento oppure se stiamo editandone uno dall’archivio. Per decidere quale operazione eseguire in base al Flag impostato inseriamo le varie operazioni da eseguire in un ciclo IF come il seguente Codice:
If Sheets("Setup").[B2] = True Then 'controllo il flag Mt = Mt & "Attenzione Il Preventivo era già in memoria ??" & Chr(13) & Chr(13) Mt = Mt & "Vuoi Sovrascriverlo??" & Chr(13) & Chr(13) rs = MsgBox(prompt:=Mt, Title:="Gestione Preventivi", Buttons:=vbYesNo + vbQuestion) If rs = vbNo Then Exit Sub salva svuota_prev ElseIf Sheets("Setup").[B2] = False Then Sheets("Setup").[B1] = [P14] salva svuota_prev End If If Sheets("Setup").[B2] = True Then …………………. Istruzioni ………. ElseIf Sheets("Setup").[B2] = False Then ………… altre istruzioni ……….. End If Possiamo interpretare il codice in maniera molto semplicistica affermando: Se il documento corrente è un Nuovo documento allora esegui queste istruzioni, Altrimenti Se il documento corrente è già presente in archivio e lo stai modificando esegui queste istruzioni. Pertanto in base al valore presente nella cella B2 abbiamo già impartito le istruzioni che devono essere svolte. Vediamo ora la 1° condizione del ciclo If Sheets("Setup").[B2] = True Then Con questa istruzione verifichiamo se il valore della cella B2 del foglio Setup è uguale a TRUE (cioè stiamo editando un documento già archiviato) allora si avvisa l’utilizzatore che il documento era già in memoria e si chiede se vuole sovrascriverlo. L’avviso riportato è come il seguente Fig. 5 Il codice che si occupa di mostrare questo avviso è: Codice:
Mt = Mt & "Attenzione Il Preventivo era già in memoria " & Chr(13) & Chr(13) Mt = Mt & "Vuoi Sovrascriverlo??" & Chr(13) & Chr(13) rs = MsgBox(prompt:=Mt, Title:="Gestione Preventivi", Buttons:=vbYesNo + vbQuestion) IF rs = vbNo Then Exit Sub Usciamo dalla Routine senza eseguire nessuna azione, scegliendo invece SI vengono eseguite le Routine salva e svuota_prev e poi usciamo dalla Sub. Mentre invece la 2° condizione del ciclo, espressa con: Codice:
ElseIf Sheets("Setup").[B2] = False Then Sheets("Setup").[B1] = [P14] salva svuota_prev Sheets("Setup").[B1] = [P14] Bisogna ricordare che per una corretta stesura del Preventivo è fondamentale emettere documenti con una numerazione univoca, eseguire il processo di numerazione è abbastanza semplice. Quando si “stacca” il preventivo n° 1, nella cella B1 del foglio di appoggio “Setup” sarà presente il valore 0 [zero] Nota: ricordo che in quella cella viene memorizzato il numero dell’ultimo preventivo memorizzato Per cui quando clicchiamo sul pulsante “Nuovo Documento” andremo a leggere il valore presente nella cella B1 del foglio Setup incrementandolo di 1 unità e inseriamo tale valore nella cella P14 del foglio Preventivi. In seguito, quando memorizzeremo il preventivo nel foglio “Archivio” andremo a sovrascrivere il valore della cella B1 del foglio “Setup” col valore della cella P14 del foglio “Preventivi”. Il processo si ripete poi per ogni documento che salveremo, per cui diventa importante il salvataggio del documento. Vediamo ora la routine salva Codice:
Private Sub salva() j = 17 With Sheets("Archivio") .Cells(m, posiz) = [M6] 'Cliente .Cells(m, posiz + 1) = [M7] 'Indirizzo .Cells(m, posiz + 2) = [M8] 'Città .Cells(m, posiz + 3) = [B11] 'pagamento .Cells(m, posiz + 4) = [G11] 'banca .Cells(m, posiz + 5) = [M14].Value 'data preventivo .Cells(m, posiz + 6) = [P14] 'n° preventivo .Cells(m + 1, posiz) = [D14] 'email .Cells(m + 1, posiz + 1) = [H14] 'Agente .Cells(m + 1, posiz + 2) = [J14] 'trasporto .Cells(m + 1, posiz + 3) = [P50] 'tot. imponibile .Cells(m + 1, posiz + 4) = [P52] 'importo iva .Cells(m + 1, posiz + 5) = [P54] 'totale .Cells(m + 1, posiz + 6) = [B56] 'note End With m = m + 2 Do Until Sheets("Preventivi").Cells(j, 2) = Empty With Sheets("Archivio") .Cells(m, posiz) = Sheets("Preventivi").Cells(j, 2).Value 'codice .Cells(m, posiz + 1) = Sheets("Preventivi").Cells(j, 3).Value 'descrizione .Cells(m, posiz + 2) = Sheets("Preventivi").Cells(j, 14).Value 'quantità .Cells(m, posiz + 3) = Sheets("Preventivi").Cells(j, 15).Value 'prezzo .Cells(m, posiz + 4) = Sheets("Preventivi").Cells(j, 17).Value 'importo End With j = j + 1: m = m + 1 Loop Mt = Mt & "Stampo il Preventivo?" & Chr(13) & Chr(13) rs = MsgBox(prompt:=Mt, Title:="Gestione Preventivi", Buttons:=vbYesNo + vbQuestion) If rs = vbNo Then Exit Sub Else ActiveSheet.PrintOut copies:=1 stampa End If End Sub j = 17 Con la variabile j indichiamo il numero di riga del foglio Preventivi dove iniziamo a inserire gli articoli del preventivo, lo possiamo vedere in Figura 1 che la prima riga che riceve gli articoli del Preventivo è la 17, inoltre abbiamo precedentemente citato che le variabili m e posiz identificano rispettivamente riga e colonna del foglio Archivio” dove memorizzare i dati, che eseguiamo col ciclo With Codice:
With Sheets("Archivio") .Cells(m, posiz) = [M6] 'Cliente .Cells(m, posiz + 1) = [M7] 'Indirizzo .Cells(m, posiz + 2) = [M8] 'Città .Cells(m, posiz + 3) = [B11] 'pagamento .Cells(m, posiz + 4) = [G11] 'banca .Cells(m, posiz + 5) = [M14].Value 'data preventivo .Cells(m, posiz + 6) = [P14] 'n° preventivo .Cells(m + 1, posiz) = [D14] 'email .Cells(m + 1, posiz + 1) = [H14] 'Agente .Cells(m + 1, posiz + 2) = [J14] 'trasporto .Cells(m + 1, posiz + 3) = [P50] 'tot. imponibile .Cells(m + 1, posiz + 4) = [P52] 'importo iva .Cells(m + 1, posiz + 5) = [P54] 'totale .Cells(m + 1, posiz + 6) = [B56] 'note End With Fig. 6 Come vedete nella prima riga del foglio abbiamo i mesi (riga di colore verde) e i dati principali del preventivo andiamo a salvarli nelle righe gialle (2° e 3° riga), per cui con m identifichiamo la 1° riga gialla e con posiz la 1° colonna del mese, per cui con: .Cells(m, posiz) = [M6] Nella cella alle coordinate m,posiz (1° riga e 1° colonna) del foglio “Archivio” andiamo a scrivere il valore della cella N6 del foglio “Preventivi”. Successivamente dobbiamo scrivere nelle colonne adiacenti, ma senza incrementare e/o modificare il valore delle variabili m e posiz, per cui usiamo l'enunciato .Cells(m, posiz + 1) = [M7] In pratica sommiamo al valore di posiz 1 unità per scrivere nella 2° colonna, 2 unità per scrivere nella 3° colonna e via di seguito fino alla 7° colonna, ultima colonna del mese. Usiamo lo stesso procedimento per scrivere nella 2° riga, incrementando il valore di m (la riga) di 1 unità e il valore di posiz come abbiamo fatto per la riga precedente, pertanto l'enunciato diventa .Cells(m + 1, posiz) = [D14] Ora dobbiamo scrivere il corpo del Preventivo, tramite il seguente codice: Codice:
m = m + 2 Do Until Sheets("Preventivi").Cells(j, 2) = Empty With Sheets("Archivio") .Cells(m, posiz) = Sheets("Preventivi").Cells(j, 2).Value 'codice .Cells(m, posiz + 1) = Sheets("Preventivi").Cells(j, 3).Value 'descrizione .Cells(m, posiz + 2) = Sheets("Preventivi").Cells(j, 14).Value 'quantità .Cells(m, posiz + 3) = Sheets("Preventivi").Cells(j, 15).Value 'prezzo .Cells(m, posiz + 4) = Sheets("Preventivi").Cells(j, 17).Value 'importo End With j = j + 1: m = m + 1 Loop Do Until Sheets("Preventivi").Cells(j, 2) = Empty Ripeti (il ciclo) finchè nel foglio Preventivi non ci sono celle vuote alle coordinate j, 2. Se le celle non sono vuote, tramite il ciclo with si copiano i dati dal foglio “Preventivi” nel foglio Archivio alle coordinate di riga e colonna pari ai valori di m,posiz, mentre invece per scorrere le righe di dati presenti nel foglio “Preventivi” si cicla alle coordinate di riga e colonna pari ai valori di j per la riga e ai valori fissi di colonna impostati nel ciclo. Si termina il ciclo incrementando il valore di m e di j finchè non si soddisfa la condizione iniziale e si esce dal ciclo. A questo punto i dati sono stati trascritti nel foglio “Archivio” e si manda in stampa il documento tramite il codice: Codice:
Mt = Mt & "Stampo il Preventivo?" & Chr(13) & Chr(13) rs = MsgBox(prompt:=Mt, Title:="Gestione Preventivi", Buttons:=vbYesNo + vbQuestion) If rs = vbNo Then Exit Sub Else ActiveSheet.PrintOut copies:=1 stampa End If End Sub Fig. 7 Cliccando su “No” si esce dalla Routine tramite l’enunciato If rs = vbNo Then Exit Sub Altrimenti cliccando su “Si” si invia il documento alla stampante di sistema e si termina la procedura.
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
15-05-2014, 17.59.55 | #15 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Editor di Visual Basic for Applications Abbiamo visto nella lezione precedente come registrare ed eseguire una macro, ora vediamo l’Editor di Visual Basic che offre numerosi strumenti avanzati di sviluppo e programmazione per modificare o scrivere delle macro, creare finestre di dialogo personalizzate e tanto altro, consentendo di far interagire le applicazioni di Microsoft Office con moduli programmati. Faremo una panoramica generale dell’editor di VBA e approfondiremo i comandi dei suoi menù, dei pulsanti delle barre strumenti e di come essi si ambientano in Excel. Le macro in Visual Basic for Applications sono memorizzate in una speciale parte della cartella di lavoro di Excel detta Modulo. Un modulo VBA contiene il codice sorgente della macro, ossia l’insieme delle istruzioni della macro stessa. Quando si registra una macro di Excel si può specificare la cartella di lavoro in cui verrà salvata, che può essere:
Fig. 1 Excel sceglie, o crea, se necessario, il modulo in cui memorizza la macro registrata e gli assegna il nome di default Modulo1, dove 1 è un numero progressivo che indica i moduli che sono stati creati in una cartella di lavoro. Per esempio, la prima volta che si salva una macro registrata nella cartella macro personale (Personal.xls per Excel 2003 e Personal.xlsb per Excel superiore alla 2003) Excel crea un modulo di nome Modulo1, se si continua a registrare macro e si salvano sempre nella cartella macro personale, Excel continua a memorizzare le macro nel medesimo Modulo1. Se in seguito si sceglie di memorizzare una macro in una cartella di lavoro diversa, (questa cartella di lavoro) Excel aggiungerà un nuovo modulo denominato sempre Modulo1 in cui memorizzare la macro. Successivamente se si ritorna a memorizzare una macro nella cartella macro personale Excel aggiungerà un nuovo modulo denominato Modulo2 nella cartella di lavoro Personal.xls Teniamo presente che la cartella macro personale viene caricata all’apertura di Excel pertanto se memorizziamo delle macro in questa cartella esse saranno disponibili per tutte le cartelle di Excel che andremo ad aprire o creare. In pratica se memorizziamo una macro in un foglio di calcolo normale una volta che questo file viene chiuso la macro non sarà più disponibile, mentre se scriviamo una macro che rappresenta una interessante funzione che potrebbe esserci utile in altri file la memorizziamo nel file Personal.xls rendendola così disponibile anche per altri file Excel. Il file Personal.xls non è altro che un normale file di Excel con estensione xls, o xlsb per versioni di Excel superiori alla 2003, che ha solo la particolarità di essere caricato all’avvio di Excel e di essere un file nascosto, cioè non verrà visualizzato, inoltre quando inseriamo una macro al suo interno, alla chiusura del file di Excel ci viene richiesto il salvataggio del file personale in questo modo Fig. 2 Se per qualche motivo viene memorizzata una macro nella cartella macro personale e dovesse sorgere qualche problema o interferire con le normali cartelle di lavoro di Excel si deve editare il file Personal.xls e cancellare o modificare la macro che presenta le anomalie. Se per qualche motivo non si riesce a modificare la macro e si vuole risolvere rapidamente il problema è possibile ricorrere a maniere drastiche, come la cancellazione del file, senza che la rimozione del file Personal.xls pregiudichi la normale esecuzione di Excel, in quanto se il file Personal.xls è assente nel sistema Excel lo ricrea con le impostazioni di default. A solo scopo informativo il percorso dove viene localizzato il file Personal.xlsb (per Excel 2007 o superiori) è il seguente: C: \Utenti\NOME UTENTE\AppData\Roaming\Microsoft\Excel\XLStart Ovviamente dovete prima attivare la visualizzazione dei file nascosti, ma per il momento tralasciamo questo argomento che esula dal contesto della lezione. Per poter vedere i moduli contenuti in un file con estensione xls bisogna ricorrere all'Editor di Visual Basic, che è uno strumento che consente di creare moduli, esaminare i contenuti, creare o modificare il codice sorgente delle macro, creare finestre di dialogo e fare tante altre cose relative alla creazione e alla manutenzione di programmi in Visual Basic For Applications. Per vedere i moduli o il codice sorgente VBA in esso contenuto bisogna avviare l’editor VB e per farlo si può scegliere una di queste opzioni: Selezionare dal menu Strumenti - Macro - Editor Visual Basic oppure premere semplicemente i tasti ALT+F11, Excel avvierà l’editor VB che viene visualizzato come in figura sotto riportata Fig. 3 L’Editor di VB visualizza tre finestre contenute in una finestra principale e ciascuna delle tre finestre visualizza importanti informazioni sul progetto VBA (un progetto è l’insieme di moduli e oggetti memorizzati in una cartella di lavoro). Ognuna delle tre finestre dell’Editor VB viene visualizzata di default nella posizione ancorata come mostrato in figura 3. Le tre finestre dell’Editor VB e le relative funzioni sono: Gestione Progetti: Questa sotto finestra (Posiz. A Fig. 3) contiene un diagramma ad albero delle cartelle di lavoro aperte e degli oggetti Excel in esse contenute (oggetti, moduli, riferimenti, Form e così via). Si userà questa finestra per navigare fra i vari moduli e altri oggetti di un progetto VBA Finestra delle Proprietà: In questa finestra (Posiz. B Fig. 3) compare un elenco di tutte le proprietà dell’oggetto attualmente selezionato. La scheda “Alfabetico”, della finestra proprietà presenta un elenco ordinato alfabeticamente delle proprietà dell’oggetto selezionato. La scheda per “Categoria" sempre nella stessa finestra le elenca invece ordinate per categoria Finestra del Codice: La finestra del codice (Posiz. C Fig. 3) è quella in cui si può esaminare, modificare o creare ex-novo il codice sorgente VBA. Questa finestra viene usata per scrivere nuove macro o editare macro esistenti Finestra Gestione Progetti La finestra “Gestione progetti” consente di visualizzare un elenco gerarchico di tutti gli elementi del progetto che sono contenuti nella cartella di lavoro, che includono fogli di lavoro, Forms e moduli. Per default questa finestra utilizza un sistema di visualizzazione definito “diagramma a albero”. Basta fare clic su uno dei segni + che si trovano alla sinistra di una voce del progetto per espandere l’elenco mostrandone la ramificazione. Una volta espanso il diagramma il segno + si trasforma in segno – e basta cliccare su quest’ultimo per far collassare la ramificazione e chiuderla. La finestra della Gestione progetti contiene altri due pulsanti: Visualizza codice e Visualizza oggetto evidenziati nella figura 4 dal rettangolo rosso Fig 4 Il pulsante Visualizza codice mostra i contenuti o listato del codice del modulo nella finestra del Codice (Posiz. C Fig. 3) mentre il pulsante Visualizza oggetto mostra l’oggetto che corrisponde alla voce selezionata, può essere un foglio di calcolo o una Form. Quando si lavora col codice sorgente di una macro nella sotto finestra Codice, si possono anche chiudere le finestre Gestione progetti e Proprietà, per dare più spazio al codice in modo da vederne una parte maggiore. Si può chiudere quando si vuole una qualsiasi sotto finestra dell’Editor VB (Gestione progetti, Proprietà e Codice) con un clic sul pulsante di chiusura posto nel vertice superiore destro (la classica X) e per visualizzare una delle finestre si può fare clic sul relativo pulsante nella barra strumenti dell’Editor VB evidenziati dal rettangolo rosso in Figura 4 Fig. 5 Oppure tramite il percorso dal menù: Visualizza - Gestione progetti La Finestra delle Proprietà Tutti gli oggetti di Excel hanno delle proprietà che ne controllano l’aspetto e il comportamento, un foglio di lavoro ha la proprietà di essere visibile oppure no, un pulsante ha una proprietà per altezza e larghezza e così via. Per modificare l’aspetto e il comportamento di un oggetto dobbiamo cambiarne le proprietà, e lo possiamo fare selezionando un foglio di lavoro, un modulo o una Form nella finestra Gestione progetti e controllare le sue proprietà nella finestra delle proprietà. La finestra Proprietà contiene due schede: Alfabetico e Categoria. Nella scheda Alfabetico, le proprietà sono visualizzate in ordine alfabetico senza alcun riferimento alla categoria di appartenenza, mentre nella scheda per Categoria, le proprietà sono disposte in ordine alfabetico all'interno di varie categorie. Fig. 6 Le proprietà riportano i valori assegnati agli oggetti che definiscono l'aspetto e le funzionalità degli stessi, solitamente questi valori possono essere letti oppure assegnati, in questo caso si dice che la proprietà è di lettura e scrittura, esistono anche proprietà di sola lettura, alle quali è possibile accedervi in sola lettura. Se la finestra non fosse visibile è possibile accedervi attraverso il percorso dal menu Visualizza - Finestra proprietà La Finestra del Codice La modalità di visualizzazione di default del codice sorgente VBA è visualizza modulo intero, in cui tutto il codice sorgente di un modulo è visualizzato in una finestra di testo che permette lo scorrimento ed ogni macro in questa finestra è separata da una linea continua grigia. L’Editor di VB permette anche di vedere i contenuti di un modulo in modalità Visualizza routine attivabile dalle due icone presenti nel vertice inferiore sinistro della finestra del codice evidenziate dalla freccia rossa in Figura 7 Fig. 7 Quando la finestra Codice è in modalità Routine, come si nota nella figura 8 si può vedere soltanto il codice sorgente di una macro alla volta Fig. 8 Per visualizzare una determinata routine nella finestra del codice in modalità Routine basta solo posizionare il cursore col mouse sulla routine e cliccare sull'icona relativa nella figura 7, per tornare poi alla visualizzazione a modulo intero si deve cliccare sull'icona a fianco. Nella modalità a Modulo intero si può usare l’elenco a discesa delle procedure per passare rapidamente da una macro all'altra.
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti) | |
|
|
Discussioni simili | ||||
Discussione | Autore discussione | Forum | Risposte | Ultimo messaggio |
riserca del corso | rene' | Software applicativo | 1 | 04-04-2008 11.30.22 |
Formare Gruppo di Studio a Napoli | Scognamiglio | Windows 7/Vista/XP/ 2003 | 0 | 14-02-2008 21.46.49 |
Corso su DVD di Tedesco | Downloader | Chiacchiere in libertà | 17 | 26-01-2007 09.46.21 |
Win XP e corso di inglese che non va più | Raboso | Windows 7/Vista/XP/ 2003 | 8 | 11-11-2005 11.16.04 |
svendo corso Cisco | alxdvc | Internet e Reti locali | 0 | 27-01-2005 13.03.45 |