|
| 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 » | |
02-11-2014, 19.31.43 | #61 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
#1
Introduzione al VBA Excel è un programma della suite Microsoft Office dedicato alla produzione e gestione dei fogli di calcolo. Attualmente, è il foglio elettronico più usato, ed è una risorsa sempre più richiesta in ambito aziendale perché fornisce strumenti e funzionalità essenziali per la gestione di ogni attività. In particolare, Excel consente di elaborare ed analizzare dati estraendone risultati omogenei mettendo in evidenza aspetti strategici basandosi su numeri e dati reali. Gli scenari di utilizzo più comuni includono chi si occupa di segreteria, di amministrazione contabile, chi pianifica e redige report periodici e chiunque abbia il bisogno di elaborare e sintetizzare velocemente grandi mole di dati. Per migliorare ulteriormente le sue funzioni Microsoft ha introdotto nel pacchetto Office, e su Excel in particolare, la possibilità di sfruttare la potenza di un vero e proprio linguaggio di programmazione denominato Visual Basic for Applications, noto semplicemente come VBA che è una evoluzione del linguaggio Basic, in dotazione ai personal computer nei primi anni 80, che consente di scrivere codice in grado di eseguire automaticamente azioni su un documento e/o sul suo contenuto Lo scopo della programmazione in VBA è di usare i dati presenti nel foglio di calcolo come input per facilitare le operazioni necessarie per ottenere un risultato, sia esso di calcolo che di ricerca, diventando così potenti strumenti di lavoro e la sua integrazione all’interno del pacchetto Office ha reso questo linguaggio interessante per lo sviluppo di vere e proprie applicazioni interamente automatizzate che sfruttano ed amplificano il "motore" di Office, permettendo di controllare ogni aspetto dell’applicazione espandendone le funzionalità. Basta infatti un semplice Click su un pulsante, perché il computer elabori una serie di dati utilizzando un sottoprogramma sviluppato tramite VBA che, acquisendo i dati presenti nel foglio di calcolo, restituirà il risultato derivante dai calcoli che sono stati fatti eseguire. Sulla disponibilità e l’uso di VBA si devono fare alcune puntualizzazioni:
Fondamenti di Microsoft Excel L'ambiente di programmazione Visual Basic, dipende da Excel, di conseguenza, per utilizzarlo è necessario prima aprire Excel cliccando su Start - Programmi - Microsoft Office - Microsoft Excel, oppure se si dispone di un documento di Excel da esplora risorse di Windows è possibile, facendo doppio clic su di esso, avviare Excel e aprire il documento stesso. Nel corso degli anni, Microsoft ha apportando innumerevoli modifiche rivolte a migliorare la facilità di utilizzo, la funzionalità e l’aspetto di Office, ma la vera innovazione arriva con Excel 2007 che ha segnato veramente un cambio di paradigma. Elencarne tutte le novità non è lo scopo di questo articolo, per cui ci limiteremo alla citazione dei più eclatanti, come la comparsa della Barra Multifunzione che sostituisce sia la barra dei menu che le barre degli strumenti, la presenza di 1 milione di righe e 16.000 colonne in un foglio di lavoro e tanto altro ancora. Sicuramente uno dei cambiamenti più significativi apportato con Office 2007 è l’uso di un nuovo formato di file, e le impostazioni di protezione delle macro, modificate per cercare di evitare che software nocivo si insinui nel computer. Và ricordato che Excel eseguirà le macro solo se sono contenute in una cartella di tipo appropriato, in quanto i file che contengono codice VBA, dalla versione successiva a Office 2007, vengono distinti dagli altri con un’estensione e un’icona diversa, nella figura sotto riportata è rappresentata a sinistra l’icona di un file che NON contiene codice VBA e ha estensione xlsx, mentre l’icona di destra contrassegna un file che contiene codice VBA ed ha estensione xlsm Fig. 1 I file salvati usando il formato xlsx non possono contenere macro, per cui anche il formato di salvataggio è diverso e quando viene salvato un file che contiene codice VBA occorre indicare a Excel che deve salvarlo usando il formato Cartella di lavoro con attivazione macro di Excel come si vede nella figura sotto riportata Fig. 2 Qualora si tenti di salvare il file nel formato tradizionale, Excel avviserebbe che non è possibile salvare le caratteristiche del vostro file nel formato scelto Fig. 3 Nella finestra di avviso sopra riportata si deve scegliere No, in questo modo Excel mostrerà la finestra Salva con nome, nella quale è possibile scegliere il formato corretto per conservare il progetto VBA. Se, invece, viene scelta l'opzione Sì e si procede con il salvataggio comunque in formato xlsx, e il progetto VBA inserito nel file non sarà in alcun modo eseguibile né utilizzabile. Nota: Nelle versioni di Office XP e Office 2003 non vengono distinti i file con codice VBA da quelli che ne sono privi e tutti i file Excel hanno la stessa estensione (.xls) e la stessa icona. Oltre a differenziare il formato, Excel consente di stabilire come gestire i singoli file che contengono codice bloccandone l’esecuzione, d’altronde permettere l’esecuzione di qualsiasi codice, anche quello non scritto da voi, può essere pericoloso. Possiamo ovviare a una impostazione così drastica permettendo ad Excel che, all’apertura di tutti i file che contengono codice, chieda se eseguirlo o meno Per richiedere questo avviso da Excel si deve agire sulle impostazioni e occorre che, sulla barra multifunzione, sia visibile la scheda Sviluppo, se non lo fosse, si deve seguire il percorso File – Opzioni e una volta visualizzata la finestra delle opzioni andare alla scheda Personalizzazione barra multifunzione e nel riquadro di destra, selezionare la scheda Sviluppo e poi premete Ok per tornare al foglio di lavoro. Fig. 4 Nota: In Excel 2007, per visualizzare la scheda Sviluppo, si deve aprire il menu File e selezionare la voce Opzioni, comparirà la finestra Opzioni di Excel e nella sezione Impostazioni generali occorre mettere un segno di spunta alla voce Mostra scheda Sviluppo Una volta ritornati al foglio di Excel dal percorso Sviluppo - Sicurezza macro si aprirà la finestra Centro protezione e viene mostrata la scheda Impostazioni macro con le seguenti opzioni. Fig. 5
Fig. 6 Se si vuole attivare il codice VBA per poterlo utilizzare, basta premete il pulsante Abilita contenuto della figura sopra riportata. In alternativa a questa procedura, si può salvare tutti i file con il codice VBA in una cartella e definire quella cartella come percorso attendibile.
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
02-11-2014, 20.04.32 | #62 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Le colonne di un foglio di lavoro In VBA per Excel, per fare riferimento a livello di programmazione ad una colonna, si utilizza una Collection (raccolta) oppure un Range (Intervallo) e per ottenere un riferimento a una colonna o un gruppo di colonne, si dichiara una variabile di tipo Range Codice:
Sub Prova2() Dim Series As Range End Sub Codice:
Sub Prova2 () ‘ si riferisce alla prima colonna Workbooks(1).Worksheets(2).Columns(1) ' si riferisce alla 12° Colonna Workbooks(1).Worksheets(2).Columns(12) End Sub Codice:
Sub Prova2 () ‘Si riferisce alla quarta colonna Worksheets(2).Columns(4) End Sub Fig. 1 Se si desidera accedere a una specifica colonna, in ogni foglio di lavoro della cartella attiva, è possibile omettere l'indicazione del foglio di lavoro. Ecco un esempio: Codice:
Sub Prova2() ’Si riferisce alla quarta colonna Columns(4) End Sub Codice:
Sub Prova2() ‘ Questo si riferisce alla colonna A Columns("A") 'Questo si riferisce alla colonna denominata DR Columns("DR") End Sub Codice:
Sub Prova2 () ‘ riferito al Range delle colonne da D a G Columns("D:G") End Sub Codice:
Sub Prova2 () ‘Questo si riferisce alle colonne nell'intervallo da D a H Range ("D: H") End Sub Codice:
Sub Prova2() ‘ Questo si riferisce alle colonne H, D, e B Range ("H: H, D: D, B: B") End Sub Per supportare la selezione di una colonna, la classe Columns è dotata di un metodo denominato Select e non necessita di ricevere alcun argomento, semplicemente per selezionare la quarta colonna, si usa il codice come segue: Codice:
Sub Prova2() ‘ Seleziona la quarta colonna Columns(4). Select End Sub Codice:
Sub Prova2() ‘ Questo seleziona la colonna ADH Columns("ADH").Select End Sub Per selezionare una serie di colonne adiacenti, nelle parentesi del metodo Columns, si immette il nome della prima colonna a un'estremità, seguito da due punti ":" e di seguito il nome della colonna che sarà all'altra estremità. Ecco un esempio: Codice:
Sub Prova2() ‘ seleziona l'intervallo di colonne dalla Colonna D alla colonna G Columns("D: G"). Select End Sub Codice:
Sub Prova2 () ‘ seleziona la Colonna G Range ("G: G"). Select End Sub Codice:
Sub Prova2() ‘ seleziona le colonne B, D e H Range ("H: H, D: D, B: B"). Select End Sub Per sostenere la creazione di colonne, la classe Columns è dotata di un metodo denominato Insert e anche questo metodo non richiede alcun argomento o parametro, quando si richiama, è necessario specificare la colonna che succederà a quella nuova, per esempio se si vuole creare una nuova colonna nella terza posizione e spostare le colonne a destra si usa questo codice: Codice:
Sub Prova2 () Columns(3). Insert End Sub Codice:
Sub Prova2 () Range ("H: H, D: D, B: B"). Insert End Sub Per fornire la capacità di eliminare una colonna, la colonna classe è dotata di un metodo denominato Delete. Per eliminare una colonna, si utilizza la raccolta Columns per specificare l'indice o il nome della colonna che verrà cancellata e richiamato il metodo Delete. Ecco un esempio che rimuove la quarta colonna. Codice:
Sub Prova2 () Columns("D: D"). Delete End Sub Codice:
Sub Prova2 () Columns ("D: F"). Delete End Sub Codice:
Sub Prova2 () Range ("C: C, E: E, P: P"). Delete End Sub Per supportare le dimensioni delle colonne, la classe Columns è dotata di una proprietà denominata ColumnWidth, pertanto si può modificare la larghezza di una colonna accedendo alla sua proprietà ColumnWidth e assegnare il valore desiderato. Ecco un esempio che imposta la larghezza della colonna di C a 4,50: Codice:
Sub Prova2 () Columns ("C"). ColumnWidth = 4.5 End Sub Codice:
Private Sub Prova2 () Selection.Columns.AutoFit End Sub Codice:
Sub Prova2 () Range ("C: C, E: E, H: H"). ColumnWidth = 5 # End Sub Per nascondere una colonna si deve prima selezionarla, quindi assegnare il valore TRUE alla proprietà Hidden dell’oggetto EntireColumn della selezione. Si consideri il seguente codice: Codice:
Private Sub Prova2() ‘Questo codice nascondere la colonna F Columns ("F: F"). Select Selection.EntireColumn.Hidden = True End Sub Codice:
Private Sub Prova2 () Colonne ("F: F"). Select Selection.EntireColumn.Hidden = False End Sub
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
02-11-2014, 20.06.42 | #63 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Le righe in un foglio di lavoro Sappiamo già che in un foglio di lavoro le informazioni vengono organizzate in colonne e righe e come per le colonne, ciascuna riga è etichettata e numerata. Queste etichette sono rappresentate da piccoli rettangoli posti sul lato sinistro dell'interfaccia di Excel e ogni rettangolo che mostra l'etichetta di una riga è chiamata intestazione di riga. E’ possibile identificare le righe in un foglio di lavoro tramite la proprietà Rows di cui è dotato il foglio, pertanto, per fare riferimento a una riga, è possibile utilizzare l'oggetto foglio di lavoro per accedere alla proprietà Rows, in alternativa è possibile fare riferimento alle righe utilizzando l’oggetto Range. Per identificare una riga si deve indicare il relativo foglio di lavoro e passare il suo indice tra le parentesi al metodo Rows, ecco un esempio che si riferisce alla 5 ° riga del secondo foglio di lavoro della cartella di lavoro corrente: Codice:
Sub Prova () Workbooks.Item(1).Worksheets.Item(2).Rows(5) End Sub Codice:
Sub Prova () Range("4:4") End Sub Codice:
Sub Prova () Dim Serie_r As Range Set Serie_r = Workbooks.Item(1).Worksheets.Item("Foglio1").Range("4:4") Serie_r. Select End Sub Un gruppo di righe viene definito un intervallo se sono una accanto all'altra e per fare riferimento alle righe in un intervallo, tra le parentesi della collezione Rows, si deve passare una stringa che corrisponda al numero della riga di una estremità, seguita da due punti, e seguito dal numero di riga dell'altra estremità. Ecco un esempio che si riferisce all’intervallo di righe da 2 a 6 Codice:
Sub Prova () Rows ("2:6") End Sub Codice:
Sub Prova () Range ("3:3, 5:5, 8:8") End Sub E’ possibile selezionare una riga o un gruppo di righe utilizzando il mouse, la tastiera, o una combinazione di entrambi. Per selezionare una riga con il mouse, si posiziona il cursore su un'intestazione di riga e si trasforma in una freccia rivolta verso destra, quindi basta clic sulla riga Fig. 1 È inoltre possibile utilizzare solo la tastiera per selezionare una riga, assicurandosi che una cella sul lato destro sia selezionata, premere e tenere premuto il tasto Shift e contemporaneamente premere la barra spaziatrice e rilasciare il tasto Maiusc. Per supportare la selezione la classe Rows è dotata di un metodo denominato Select, pertanto, per selezionare una riga utilizzando codice VBA, si deve accedere a una riga utilizzando i riferimenti che abbiamo visto in precedenza e richiamare il metodo Select. Ecco un esempio che seleziona la riga 6 Codice:
Sub Prova () Rows(6). Select End Sub Codice:
Sub Prova () Range("4:4"). Select End Sub È anche possibile selezionare più di una riga sia utilizzando il mouse, la tastiera, o una combinazione di entrambi. Per selezionare un intervallo di righe con il mouse, si deve cliccare su una intestazione di riga e tenere premuto il mouse verso il basso (il cursore assume la forma di una croce bianca), quindi trascinare nella direzione del campo Fig. 2 Per selezionare più righe utilizzando solo la tastiera, si seleziona la riga di partenza e tenendo premuto il tasto Maiusc, premere il tasto freccia su o il tasto freccia giù. Una volta selezionato l'intervallo di righe, si rilascia il tasto Maiusc. È inoltre possibile utilizzare una combinazione di mouse e tastiera per selezionare una o più righe. Per selezionare un intervallo di righe utilizzando una combinazione di mouse e tastiera, si sceglie una riga col mouse e si tiene premuto il tasto Shift, quindi si sceglie la riga all'altra estremità dell’intervallo e si rilascia il mouse. Per selezionare righe a caso utilizzando una combinazione di mouse e tastiera, si deve cliccare su una intestazione di riga, e tenendo premuto il tasto Ctrl si clicca su ogni intestazione di riga desiderata. Dopo aver selezionato le righe desiderate, si rilascia il mouse. Ogni riga selezionata sarà evidenziata Fig. 3 Per selezionare un intervallo di righe utilizzando il codice, si deve fare riferimento al metodo Range, utilizzando le tecniche che abbiamo visto in precedenza, quindi richiamare il metodo Select. Ecco un esempio che seleziona le righe da 2 a 6 Codice:
Sub Prova () Rows("2:6"). Select End Sub Codice:
Sub Prova () Range("3:3, 5:5, 8:8"). Select End Sub Codice:
Sub Prova () Rows.Select End Sub L'altezza di una riga è data dalla distanza della parte superiore dai bordi inferiori della riga e ci sono varie tecniche che è possibile utilizzare per modificare l'altezza di una riga. Per modificare manualmente l'altezza di una riga, si deve posizionare il mouse sul bordo inferiore che separa dalla riga successiva, il mouse si trasformerà come in Fig. 4, e poi si deve cliccare e trascinare verso l'alto o verso il basso fino a raggiungere l'altezza desiderata, quindi rilasciare il mouse. Fig. 4 È inoltre possibile ridimensionare un gruppo di righe, in primo luogo, si devono selezionare le righe come abbiamo descritto in precedenza e poi posizionare il mouse sul bordo inferiore di una delle righe selezionate e cliccare e trascinare verso l'alto o verso il basso fino ad ottenere l'altezza desiderata. Quindi rilasciare il mouse. Oppure si può modificare l’altezza di una riga cliccando sull'intestazione della riga e seguire il percorso dalla barra multifunzione Home – Celle - Formato e cliccare su Adatta Altezza righe Fig. 5 È possibile utilizzare una finestra di dialogo per impostare esattamente all'altezza desiderata di una riga o di un gruppo di righe. Per specificare l'altezza di una riga si deve cliccare con il pulsante destro del mouse sull'intestazione della riga e nel menu che appare clic su Altezza righe. Per specificare la stessa altezza per molte righe si deve selezionare un intervallo di righe, come abbiamo visto in precedenza, e cliccare con il pulsante destro del mouse su una riga (o una delle intestazioni di riga o all'interno della selezione) e poi cliccare su Altezza righe nel menu a discesa che appare. Per sostenere l'altezza di una riga, l'oggetto Row è dotato di una proprietà denominata RowHeight, pertanto, per specificare a livello di codice l'altezza di una riga, si deve accedere alla riga utilizzando un riferimento, come abbiamo visto in precedenza, e accedere alla sua proprietà RowHeight assegnando il valore desiderato. Ecco un esempio che imposta l'altezza della riga 6 a 2,50 Codice:
Sub Prova () Rows(6).RowHeight = 20 End Sub Sappiamo che Excel crea e mette a disposizione più di un milione di righe (dalla versione 2007 in poi) che è possibile utilizzare quando si lavora su un foglio di lavoro e, a volte, può essere necessario inserire una riga tra due righe esistenti. Quando si aggiunge una nuova riga, Excel elimina l'ultima riga per mantenere il conteggio totale delle righe, e per inserire solo una nuova riga sopra uno esistente, si deve cliccare con il pulsante destro del mouse sull'intestazione della riga che sarà al di sotto della nuova che si desidera aggiungere e cliccare su Inserisci dal menu a discesa che compare, oppure cliccare sull'intestazione della riga o qualsiasi casella sul lato destro e dal percorso della barra multifunzione, Home – Celle - Inserisci e cliccare su Righe e dal menu a discesa che appare scegliere Inserisci righe foglio Fig. 6 E’ possibile aggiungere una nuova riga usando il codice VBA, sfruttando la classe Rows che è dotata di un metodo denominato Insert, pertanto, per aggiungere una riga di codice, si deve fare riferimento alla riga che si posizionerà al di sotto della nuova e chiamare il metodo Insert. Ecco un esempio: Codice:
Sub Prova () Rows(3). Insert End Sub Codice:
Sub Prova () Range("3:3, 6:6, 10:10").Insert End Sub Per eliminare una riga si deve cliccare con il pulsante destro del mouse sull'intestazione della riga e fare clic su Elimina nel menu a discesa che appare, oppure dalla barra multifunzione, seguendo il percorso Home – Celle - Elimina quindi dal menu a discesa che appare cliccare su Elimina righe foglio Fig. 7 Per supportare la rimozione riga via codice, la classe Row è dotata di un metodo chiamato Delete che non necessita di alcun argomento per individuare la riga. Sulla base di questo, per eliminare una riga, si deve accedere utilizzando un riferimento come abbiamo visto prima, e richiamare il metodo Delete. Ecco un esempio che cancella la riga 3 Codice:
Sub Prova () Rows(3).Delete End Sub Codice:
Sub Prova () Range("3:3, 6:6, 10:10").Delete End Sub Fig. 8 Per nascondere una riga via codice, si deve prima selezionare, quindi usare la proprietà EntireRow . Ecco un esempio che nasconde la riga 6 Codice:
Private Sub Prova () Rows("6:6").Select Selection.EntireRow.Hidden = True End Sub
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
02-11-2014, 20.08.52 | #64 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Le celle di un foglio di lavoro Un foglio di calcolo è una serie di intersezioni verticali denominate colonne e orizzontali chiamate righe e un foglio è fatto di colonne e righe, che si intersecano, l'intersezione di una colonna e una riga crea un rettangolo chiamato cella: Fig. 1 Quando si avvia Excel, vengono create 16.384 colonne e 1.048.576 righe (dalla versione 2007 in poi) e come risultato, in un foglio elettronico avremmo a disposizione 17.179.869 (16,384 * 1.048.576) celle disponibili a cui è possibile accedervi utilizzando il mouse cliccando su una cella o con la tastiera premendo un tasto freccia. È inoltre disponibile un menu a più parti cliccando col tasto destro del mouse su una cella Fig. 2 Quando si utilizza un foglio di calcolo, per esempio quando si immettono le informazioni in esso, in realtà si sta lavorando su una cella, pertanto, in qualsiasi momento, si deve sempre essere in grado di identificare la cella che si sta utilizzando e per facilitare tale informazione, ogni cella ha un indirizzo, ottenuto dalla combinazione dell’etichetta della sua colonna e della sua riga, noto anche come nome primario della cella. Posizione di una Cella La combinazione del nome della colonna e l'etichetta della riga fornisce l'indirizzo o il nome di una cella e quando si clicca su una cella, la sua intestazione di colonna e di riga vengono evidenziate, inoltre per conoscere il nome (o indirizzo) di una cella, è possibile fare riferimento al Box, che si trova all'incrocio superiore sinistro tra colonne e righe Fig. 3 Ogni volta che si lavora con le celle, e una di loro è selezionata i bordi appaiono più spessi rispetto alle altre celle, in questo modo la cella viene indicata come cella attiva. Per identificare visivamente la cella attiva, si può solo guardare la zona di lavoro e individuare la cella con bordi spessi. Nella schermata sopra, la cella attiva è D5 e In VBA, la cella attiva è rappresentato da un oggetto denominato ActiveCell. Come già detto, prima di fare qualsiasi cosa su una cella, è necessario essere in grado di identificare o riconoscere la cellula, per fare questo visivamente, si può solo guardare, e individuare, la cella desiderata, ma per identificare a livello di programmazione una cella, si hanno diverse opzioni. È possibile identificare una cella utilizzando l'oggetto Range, a tale scopo, nelle parentesi dell'oggetto, si passa una stringa contenente il nome della cella. Ecco un esempio che fa riferimento alla cella situata come D6: Codice:
Sub Prova1() Workbooks.Item (1) .Worksheets.Item ("Foglio1"). Range ("D6") End Sub Codice:
Sub Prova1() Dim cella As Range Set cella = Workbooks.Item (1) .Worksheets.Item ("Foglio1"). Range ("D6") End Sub Codice:
Sub Prova1() Range ("B2: H6") End Sub Codice:
Sub Prova1 () Range ("D4: D4") End Sub Codice:
Sub Prova1 () Range (" D2: B5, F8: I14 ") End Sub Prima di fare qualsiasi cosa su una cella o un gruppo di celle, è necessario innanzitutto selezionarle, e la selezione delle celle è quasi equivalente a evidenziare una parola in un documento di testo. Vari mezzi sono disponibili per selezionare una cella o un gruppo di celle, è possibile utilizzare il mouse, la tastiera, o una combinazione di mouse e tastiera. Vediamo alcuni esempi:
Codice:
Sub Prova1 () Range ("D6"). Select End Sub Esempio: Per selezionare tutte le celle di una colonna
Esempio: Per selezionare tutte le celle di una riga:
Fig. 5 Esempio: Per selezionare le celle nella stessa regione
Per selezionare tutte le celle di un foglio di lavoro, è possibile premere Ctrl + A, in alternativa, è possibile cliccare sul pulsante nel punto di intersezione della intestazione di riga e di colonna Fig. 6 Per selezionare a livello di codice un gruppo di celle adiacenti, si deve fare riferimento al gruppo con le tecniche che abbiamo visto in precedenza, quindi richiamare il metodo Select, mentre per selezionare a livello di codice tutte le celle di una colonna, si deve accedere alla colonna e usare il nome della colonna come stringa, quindi richiamare il metodo Select. Ecco un esempio: Codice:
Sub Prova1() ‘ selezionare tutte le celle dalla quarta colonna Columns (4) .Select End Sub Codice:
Sub Prova1() ‘seleziona tutte le celle dalla colonna denominata ADH Columns ("ADH"). Select End Sub Codice:
Sub Prova1() ‘ seleziona tutte le celle della colonna G Range ("G: G"). Select End Sub Codice:
Sub Prova1() ‘ seleziona tutte le celle dell'intervallo dalla colonna D alla colonna G Columns ("D: G"). Select End Sub Codice:
Sub Prova1() ‘ seleziona le celle da colonne B, D e H Range ("H: H, D: D, B: B"). Select End Sub Codice:
Sub Prova1() ‘ Seleziona tutte le celle della riga 6 Rows (6) .Select End Sub Codice:
Sub Prova1() Range ("4: 4"). Select End Sub Codice:
Sub Prova1() Rows ("2: 6"). Select End Sub Codice:
Sub Prova1() Range ("3: 3, 5: 5, 8: 8"). Select End Sub Codice:
Sub Prova1 () Range ("B2: H6"). Select End Sub Codice:
Sub Prova1() Range (" D4: D4 ").Select End Sub Codice:
Sub Prova1 () Range ("D2: B5, F8: I14"). Select End Sub Codice:
Sub Prova1() Rows.Select End Sub Per conoscere o definire il nome di una cella, è possibile controllare la Casella Nome agendo in questo modo: Cliccare sulla cella, e nella casella nome, inserire il nome e premere INVIO, Oppure sulla barra multifunzione, fare clic su Formule – Definisci Nomi, cliccare su Definisci nome e nella casella di testo Nome della finestra di dialogo Nuovo nome, digitare il nome desiderato e cliccare su OK Oppure cliccare sulla cella nella cartella di lavoro e sulla barra multifunzione, cliccare su Formule – Definisci Nomi e nella finestra di dialogo Nuovo nome, nella casella di testo Nome, digitare il nome desiderato, nella casella combinata Ambito, accettare o specificare la cartella di lavoro, nella casella di testo Commento, digitare alcune parole se volete e nel campo Riferito a cliccare sul pulsante di destra, verrete riportati nella cartella di lavoro, selezionate la cella e cliccare poi di nuovo sul pulsante della finestra di dialogo e cliccare su OK Fig. 7 Oppure sulla barra multifunzione, cliccare su Formule – Gestione Nomi e nella finestra di dialogo Gestione nomi, cliccare su Nuovo e si ripete quanto sopra specificato Fig. 8 Abbiamo già visto che, per fare riferimento a una cella utilizzando il suo nome, è possibile passare quel nome come stringa al Campo all'oggetto. Ora sappiamo come selezionare un gruppo di celle e se si seleziona più di una cella, il nome della prima cella viene visualizzato nella casella Nome. Nella maggior parte delle operazioni, questo non può essere utile, soprattutto se si desidera eseguire la stessa operazione su tutte le celle della selezione. Fortunatamente, Microsoft Excel consente di specificare un nome comune per il gruppo di celle selezionate. Per specificare un nome per un gruppo di celle: Selezionare le celle con le tecniche che abbiamo visto in precedenza e nella casella nome, sostituire la stringa con il nuovo nome, Oppure selezionare le celle e dalla barra multifunzione, cliccare su Formule Definisci Nomi e nella casella di testo Nome della finestra di dialogo Nuovo nome, digitare il nome desiderato e cliccare su OK. Dopo aver creato un nome per un gruppo di celle, si può fare riferimento a quelle celle che utilizzano il nome, utilizzando l’oggetto Range e passare il nome come stringa. Ecco un esempio Codice:
Sub Prova1 () Range ("pippo"). Select End Sub
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
03-11-2014, 17.07.02 | #65 |
Newbie
Registrato: 21-10-2014
Messaggi: 2
|
Rif: Corso VBA
Grazie di cuore per questa bellissima lezione continua cosi
|
04-11-2014, 17.51.08 | #66 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Metodi di elaborazione dei file con VBA L'elaborazione dei file è la capacità di memorizzare i valori di un documento nel computer in modo da poter recuperare tali valori successivamente, oppure è la possibilità di salvare i valori da un'applicazione e recuperare tali valori quando è necessario. Prima di eseguire l'elaborazione dei file, la prima azione che è necessario eseguire consiste nel creare un file e per sostenere tale processo, VBA fornisce una procedura denominata Open che presenta la seguente sintassi Open pathname For Output [Access access] [lock] As [#]filenumber [Len=reclength] La dichiarazione Open mostra molti argomenti, alcuni sono necessari e altri no, le espressioni obbligatorie sono: La dichiarazione Open, l’espressione For Output e la dichiarazione As #, oltre all’argomento, pathname (percorso) che è rappresentato da una stringa che può essere il nome del file, inoltre Il file può avere un'estensione o meno. Ecco un esempio: Open "Prova.txt" Se si specifica solo il nome del file, sarebbe considerato nella stessa cartella in cui è la cartella di lavoro corrente (la cartella di lavoro che è stata aperta quando è stata eseguita questa istruzione). Se si desidera, è possibile fornire un percorso completo per il file, che include l'unità, il nome della cartella, fino al nome del file, con o senza estensione. Oltre al nome del file o il suo percorso, la modalità è un fattore necessario in quanto indica l'azione reale che si desidera eseguire, come la creazione di un nuovo file o solo l'apertura di uno esistente. Questo fattore può essere rappresentato da una delle seguenti parole chiave
Codice:
Sub apri () Open "Prova.txt" For Output As #1 End Sub
Chiusura di un file Quando si crea e si inizia ad usare un file, o dopo aver aperto un file e mentre lo si utilizza, si impegnano risorse di sistema che potrebbero essere significative, ed è necessario quando si è terminato di utilizzare il file, liberare la memoria che si stava usando e rilasciare le risorse impegnate. Per eseguire questa operazione VBA fornisce una procedura denominata Close, la cui sintassi è: Close [filenumberlist] Dove l’argomento filenumberlist è lo stesso argomento filenumber che è stato precedentemente utilizzato per creare o aprire il file. Ecco un esempio di chiusura di un file: Codice:
Sub Prova () Open "Prova.txt" For Output As #1 Close #1 End Sub Dopo aver creato un file, si deve scrivere dei valori al suo interno, a sostegno di questa azione, VBA fornisce due procedure, una si chiama Print e la sua sintassi è: Print #filenumber, [outputlist] La sintassi della dichiarazione Print richiede due argomenti, ma è necessario solo filenumber che corrisponde all’argomento filenumber che si è usato per creare il file. Filenumber è seguito da una virgola e poi dall’argomento outputlist che può essere costituito da 0 a 1 o più valori. Questo argomento è facoltativo, se non si vuole assegnare un valore al file, si può lasciare vuoto. Se invece volete assegnare un valore, si deve digitare una virgola dopo filenumber e seguire queste regole:
Codice:
Sub Prova () Open "Prova.txt" For Output As #1 Print #1, "Gino" Print #1, "Gigetto" Print #1, True Print #1, #17/08/2014# Close #1 End Sub Codice:
Sub Prova () Open "Prova.txt" For Output As #1 ‘I valori sono separate dal punto e virgola Print #1, "Gino"; "Gigetto" ‘ I valori sono separate da uno spazio vuoto Print #1, True #17/08/2014# Close #1 End Sub Oltre alla procedura Print, VBA fornisce anche una procedura denominata Write che può essere utilizzata per scrivere uno o più valori in un file. La sintassi è la stessa di quella dell’argomento Print: Write #filenumber, [outputlist] Dove l’argomento filenumber è necessario e deve essere specificato al momento della creazione del file, mentre l’argomento outputlist è facoltativo e se si vuole omettere, si deve digitare una virgola dopo la dichiarazione filenumber e terminare la dichiarazione di scrittura. In questo caso, una riga vuota verrà scritta nel file. Per scrivere i valori nel file, si devono seguire queste regole.
Codice:
Sub Prova () Open "Prova.txt" For Output As #1 Write #1, "Gino" Write #1, "Dott." Write #1, "Ginetto" Write #1, #17/08/2014# Write #1, 12.30 Write #1, True Close #1 End Sub Codice:
Sub Prova () Open "Prova.txt" For Output As #1 ‘ I valori sono separate da un punto e virgola Write #1, "Gino"; "Dott."; "Ginetto" ‘ I valori sono separate da uno spazio vuoto Write #1, #17/08/2014#, 12.30 Write #1, True Close #1 End Sub A volte è necessario aprire un file esistente per poter leggere o scrivere altri dati, in questo caso VBA fornisce una procedura denominata Open, la cui sintassi è. Open pathname For Input [Access access] [lock] As [#]filenumber [Len=reclength] La sintassi della procedura Open mostra molti argomenti, alcuni sono necessari e altri no. Sono da ritenersi obbligatori i seguenti argomenti: La dichiarazione Open, l’espressione As # e il percorso che può essere il nome del file, inoltre il file può avere un'estensione o meno. Ecco un esempio: Open "Prova.txt" Se si specifica solo il nome del file, si cerca il file nella stessa cartella in cui è alloggiata la cartella di lavoro corrente. Se si desidera, è possibile fornire un percorso completo, ciò include l'unità, la cartella (opzionale), fino al nome del file, con o senza estensione. Oltre al nome del file o il suo percorso, è necessario fornire il tipo di accesso che si desidera fare. Per aprire un file, le modalità possono essere:
Codice:
Sub Prova () Open "Prova.txt" For Input As #1 End Sub
La lettura da un file Dopo l'apertura di un file, è possibile leggere i valori al suo interno, e prima di leggere il valore, si dovrebbe dichiarare una o più variabili che riceverebbero i valori da leggere. Si deve ricordare che i benefici utilizzando una variabile sono di riservare uno spazio di memoria in cui è possibile memorizzare un valore. Allo stesso modo, quando si legge un valore da un file, si otterrebbe il valore dal file e quindi memorizzare tale valore nella memoria del computer. Una variabile renderebbe più facile per fare riferimento a tale valore in caso di necessità. Per sostenere la possibilità di aprire un file, il VBA fornisce due procedure. Se i valori sono stati memorizzati usando la dichiarazione Print, si possono leggere i valori, utilizzando la dichiarazione Input o Line Input. La sintassi della procedura è Input #filenumber, varlist La dichiarazione richiede due argomenti, ma il secondo può essere realizzato in varie parti. L’argomento filenumber è lo stesso che si è usato per aprire il file ed è seguito da una virgola. L’argomento varlist può essere di 1 o più parti. Per leggere un solo valore, dopo la virgola di filenumber, si deve digitare il nome della variabile che riceverà il valore. Ecco un esempio: Codice:
Sub Prova () Dim primo As String Open "Prova.txt" For Input As #1 Input #1, primo Close #1 End Sub Codice:
Sub Prova () Dim primo As String Dim secondo As String Dim tempo As Boolean Open "Prova.txt" For Input As #1 Input #1, primo, secondo, tempo Close #1 End Sub Line Input #filenumber, varname Questa affermazione necessita di due argomenti, ed entrambi sono necessari. L’argomento filenumber è il numero che si sarebbe usato per aprire il file. Quando l’istruzione Line Input viene richiamata chiamato, legge una riga di testo fino a raggiungere la fine del file. Uno dei limiti di Line Input è la difficoltà a leggere qualcosa di diverso testo perché potrebbe non essere in grado di determinare dove termina la linea. Nel riesaminare la possibilità di scrivere i valori in un file, abbiamo visto che l’istruzione Print scrive un valore booleano come Vero o Falso, se si utilizza l’istruzione Input per leggere tale valore, l'interprete potrebbe non essere in grado di leggere il valore. Abbiamo visto che in alternativa alla dichiarazione Print si può usare la dichiarazione Write, inoltre abbiamo visto che, tra le differenze tra Input e Write, quest'ultimo scrive i valori booleani con il simbolo #, questo rende possibile per l'interprete di leggere facilmente tale valore. Per queste ragioni, nella maggior parte dei casi, può essere più utile usare la scrittura quando si creano valori stringa diversi in un file.
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
07-11-2014, 17.45.03 | #67 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Cartelle di lavoro Nozioni di base Quando si avvia Excel, viene creata di default una cartella di lavoro vuota e dopo aver eseguito le varie elaborazioni è possibile salvarla, oppure, se si dispone di una cartella di lavoro esistente da qualche parte nel computer è possibile aprirla come un documento di Excel. Nel linguaggio VBA, una cartella di lavoro è un oggetto che appartiene ad una collezione chiamata cartelle di lavoro e ogni cartella di lavoro è un oggetto di tipo Workbook. Per quanto riguarda le collezioni, ogni cartella di lavoro può essere identificata utilizzando le sue proprietà e per fare riferimento a una cartella di lavoro in programmazione, si deve accedere alle sue proprietà usando l'indice della cartella o il nome della cartella di lavoro stessa. Dopo aver fatto riferimento a una cartella di lavoro, se si desidera eseguire un'azione, è necessario ottenere un riferimento dichiarando una variabile e assegnarle una chiamata che dovrebbe essere fatta nel modo seguente. Codice:
Sub Prova1() Dim cart As Workbook Set cart = Workbooks.Item(2) End Sub Workbooks.Add(Template) As Workbook Questo metodo richiede un solo argomento, ed è facoltativo, ciò significa che è possibile richiamare il metodo senza argomenti e senza parentesi, ecco un esempio. Codice:
Sub Prova1 () Workbooks.Add End Sub Codice:
Sub Prova1 () Dim cart As Workbook Set cart = Workbooks.Add End Sub Per modificare a livello di programmazione la cartella predefinita, la classe Application è dotato di una proprietà denominata DefaultFilePath, pertanto, per specificare a livello di codice la cartella predefinita, si deve assegnare una stringa alla proprietà Application.DefaultFilePath, ecco un esempio. Codice:
Sub Prova1 () Application.DefaultFilePath = "C: \Prova\gestione preventivi" End Sub Workbook.Save () Come si può vedere, questo metodo non richiede nessun argomento, se si clicca sul pulsante Salva o se si richiama il metodo Workbook.Save () su una cartella che non è stata ancora salvata, verrebbe richiesto di fornire un nome alla cartella di lavoro. Per salvare una cartella di lavoro in una posizione diversa, è possibile fare cliccare sul pulsante Salva con nome e selezionare una delle opzioni presentate, oppure è anche possibile premere F12. Come ausilio alla programmazione per il salvataggio di una cartella di lavoro, la classe cartella di lavoro è dotata di un metodo denominato Salva con nome. La sua sintassi è. Workbook.SaveAs(FileName, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodepage, TextVisualLayout, Local) Il primo argomento è l'unico richiesto e contiene il nome o il percorso del file, pertanto, è possibile fornire solo il nome del file con estensione quando si richiama. Ecco un esempio. Codice:
Sub Prova1 () Dim cart As Workbook Set cart = Workbooks.Add cart.SaveAs "cart.xlsx" End Sub Apertura di una cartella di lavoro Excel è un'interfaccia a documenti multipli (MDI), ciò significa che è possibile aprire molte cartelle di lavoro allo stesso tempo, per questo motivo, la possibilità di aprire una cartella di lavoro a livello di programmazione è gestita dalla raccolta cartelle di lavoro e a sostegno di questo, la classe è dotata di un metodo denominato Open, la sua sintassi è. Workbooks.Open( FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMru, Local, CorruptLoad ) FileName è l'unico argomento obbligatorio e quando si richiama questo metodo, è necessario fornire il nome del file o il suo percorso, ciò significa che è possibile fornire un nome di file con la sua estensione, ecco un esempio. Codice:
Sub Prova1 () Workbooks.Open "cart.xlsx" End Sub Chiusura cartelle di lavoro Dopo aver usato una cartella di lavoro o per chiudere un documento non più necessario, la classe cartella di lavoro è dotata di un metodo denominato Close, la sua sintassi è. Sub Close (Optional ByVal SaveChanges As Boolean, Optional ByVal Filename As String, Optional ByVal RouteWorkbook As Boolean) Tutti e tre gli argomenti sono opzionali, il primo argomento indica se si desidera salvare le modifiche, se sono state fatte, da quando è stata aperta la cartella di lavoro. Se non è stato fatto nessun cambiamento dal momento in cui la cartella di lavoro è stata creata o dall'ultima volta che è stata aperta, questo argomento non viene considerato. Se il primo argomento è impostato su True e la cartella di lavoro ha delle modifiche che devono essere salvare, il secondo argomento specifica il nome del file in cui salvare la cartella di lavoro, mentre invece il terzo argomento specifica se la cartella di lavoro deve essere disponibile per l'utente successivo. Accesso a una cartella di lavoro Per accedere a una cartella di lavoro, la classe cartella di lavoro è dotata di un metodo denominato Activate e la sua sintassi è. Workbook.Activate () Questo metodo non richiede alcun argomento, pertanto, per richiamarlo, è possibile ottenere un riferimento alla cartella di lavoro che si desidera accedere, quindi si deve richiamare il metodo Activate () in questo modo. Codice:
Sub Prova1 () Dim cart As Workbook Set cart = Workbooks.Item (2) cart.Activate End Sub Codice:
Sub Prova1 () Workbooks (2) .Activate End Sub Se si crea o si aprono molte cartelle di lavoro, ognuna è rappresentata sulla barra delle applicazioni da un pulsante. Per fare riferimento a una cartella di lavoro, si deve accedere alle proprietà e passare l'indice o il nome del file della cartella di lavoro. Ecco un esempio: Codice:
Sub Prova1 () Workbooks.Item (2) End Sub Codice:
Sub Prova1 () Dim cart As Workbook Set cart = Workbooks.Item (2) End Sub
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
10-11-2014, 02.34.00 | #68 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Variabili e tipi di dati Prima di addentrarci nell'argomento della lezione faremo una panoramica su come vengono memorizzati vari tipi di informazioni come numeri, date e testi, in modo che possano essere distinti tra di loro e come possano essere manipolati ed elaborati. Per chiarire meglio l’argomento e cercare di capire di cosa stiamo parlando è opportuno occuparsi ora delle diverse tipologie di dati che può trattare VBA e anche dello spazio che questi dati occupano in memoria. Faremo ora alcune considerazioni sulla distinzione dei tipi di dato (tipo di un dato è il termine che fa riferimento alla particolare natura dei dati che il VBA può memorizzare e manipolare quali testo e numeri) e cercheremo di vedere come può un programma lavorare con dati di tipo diverso come stringhe (la stringa è una sequenza di caratteri di testo) e numeri. Possiamo comprendere meglio quanto esposto e la sua importanza con un esempio. Prendiamo una sequenza di caratteri "17081974" a prima vista sembra trattarsi di un numero, ma potrebbe anche rappresentare una data, il 17 Agosto del 1974 oppure potrebbe essere un numero di telefono (170 81 974). Come facciamo allora a determinare che cosa rappresenta quella stringa? Possiamo determinare cosa rappresenta la stringa in base all'uso che ne dobbiamo fare del dato. Se si tratta di un importo sicuramente usato per eseguire dei calcoli, di conseguenza si tratta di un numero, se invece rappresenta una data verrà utilizzata in modo particolare, si può sommare ma va trattata in modo diverso oppure se è un numero di telefono sappiamo che non può essere trattato per il calcolo anche se è costituito da una sequenza numerica Da queste considerazioni nasce l’esigenza o la necessità di dover sapere sempre la natura e lo scopo di un dato all'interno di un programma. I vari tipi di dati possono essere di tipo: Booleano, Byte, Date, String, Integer, Single, Long, Double, Currency, Variant, I più utilizzati sono:
Tipi di dati Un tipo di dati indica al computer che tipo di variabile si intende utilizzare perché prima di utilizzare una variabile, si dovrebbe sapere quanto spazio occuperà in memoria. Diverse variabili utilizzano diverse quantità di spazio in memoria e le informazioni che specificano la quantità di spazio di cui ha bisogno la variabile è chiamato tipo di dati e viene misurato in byte. Per specificare il tipo di dati che verrà utilizzato per una variabile, dopo aver digitato la parola chiave Dim seguito dal nome della variabile si deve digitare la parola chiave As seguita da uno dei tipi di dati che esamineremo successivamente. La formula utilizzata è: Dim nome_variabile As tipo_dati Abbiamo detto in precedenza che è possibile utilizzare diverse variabili se sono necessarie e quando si dichiara tali variabili, si possono dichiarare su righe separate e per specificare il tipo di dati si utilizza la stessa formula di cui sopra. Abbiamo anche visto che si possono dichiarare varie variabili sulla stessa riga a patto che siano separate con una virgola, ora se si specifica il tipo di dati di ogni variabile si usa la stessa regola, si digita la virgola dopo ogni variabile in questo modo: Dim Nome As tipo_dati, Cognome As tipo_dati Il codice sopra esposto appare come se vi fosse un solo tipo di dati, di seguito passeremo in rassegna i vari tipi di valori che sono disponibili, e per dichiarare le variabili di tipi di dati diversi, si dichiara ognuna su una riga come abbiamo visto in precedenza. È inoltre possibile dichiarare variabili di tipi di dati diversi sulla stessa linea e per fare questo, si utilizza sempre la parola chiave Dim separando le dichiarazioni con le virgole. Tipo di Caratteri Per rendere la dichiarazione della variabile più veloce e anche conveniente, è possibile sostituire l’espressione As tipo_dati con un carattere speciale che rappresenta il tipo di dati previsto. Questo carattere si chiama Tipo di carattere e dipende dal tipo di dati che si intende applicare a una variabile e se viene utilizzato, il tipo di carattere deve essere l'ultimo carattere del nome della variabile. Vedremo quali caratteri sono disponibili e quando possono essere applicati Valore di conversione Ogni volta che l'utente inserisce un valore in un'applicazione, tale valore viene considerato in primo luogo come testo, ciò significa che, se si desidera utilizzare tale valore in un'espressione o un calcolo che prevede un valore specifico diverso dal testo, è necessario convertire quel testo. Fortunatamente, Microsoft Visual Basic fornisce un meccanismo efficace per convertire un valore di testo di uno degli altri valori che vedremo dopo. Per convertire il testo ad un altro valore, vi è una parola chiave adatta allo scopo e che dipende dal tipo di valore in cui si desidera convertirlo. Variabili numeriche - Integer Se vogliamo utilizzare un numero nel programma, Visual Basic è in grado di riconoscere un numero naturale qualsiasi che non include una parte frazionaria e il numero è costituito da una combinazione di 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9, nessun altro carattere è consentito. Byte Per dichiarare una variabile che conterrebbe numeri naturali che vanno da 0 a 255, si utilizza come tipo di dati Byte. In questo modo:Dim AnniServizio As Byte Non esiste un tipo di carattere per il tipo di dati Byte e dopo aver dichiarato la variabile, è possibile assegnare un piccolo numero positivo. Codice:
Dim Valore As Byte Valore = 246 Integer Per dichiarare una variabile che potrebbe contenere un numero che varia -32.768 a 32.767, si utilizza come tipo di dati Integer con questa sintassi: Dim conta As Integer Invece di utilizzare l’espressione As Integer, è possibile utilizzare il carattere % come tipo di dati, pertanto, la dichiarazione di cui sopra può essere fatta come segue: Dim conta % Dopo aver dichiarato la variabile, è possibile assegnarle il valore desiderato, se si assegna un valore inferiore a -32768 o superiore a 32767, quando si decide di usarla, si riceverà un errore. Se si vuole convertire un testo in un numero, si può usare la funzione CInt () utilizzando la seguente formula: Numero = CInt (Valore da convertire) dove tra le parentesi di CInt () si deve inserire il testo, o l'espressione che deve essere convertita. Long Un intero Long è un numero che può essere utilizzato per una variabile che coinvolge un numero maggiore di Integer, pertanto per dichiarare una variabile che potrebbe contenere un numero così elevato, si utilizza il tipo di dati Long in questo modo: Dim Popolazione As Long Il tipo di carattere per il tipo di dati Long è @, pertanto la variabile di cui sopra può essere dichiarata come segue: Dim Popolazione @ Una variabile Long può memorizzare un valore compreso tra -2,147,483,648 e 2,147,483,647 (le virgole sono usate per facilitare la lettura, non devono essere utilizzati nel codice), pertanto, dopo aver dichiarato una variabile Long, è possibile assegnare un numero in tale intervallo. Per convertire un valore testo in un intero Long, si usa l’espressione CLng () utilizzando la seguente formula: Numero = CLng (Valore da convertire), ricordando di inserire nelle parentesi di CLng () il testo da convertire Single Nella programmazione, un numero decimale è quello che rappresenta una frazione, esempi sono 1.85 e 426,88. Se si prevede di utilizzare una variabile che sarebbe di quel tipo di numero, ma la precisione non è la vostra preoccupazione principale, si dichiara come tipo di dati Single così: Dim Distanza As Single Il tipo di carattere per il tipo di dati Single è ! pertanto la dichiarazione di cui sopra potrebbe essere scritta in questo modo: Dim Distanza ! Se si dispone di un valore testo che deve essere convertito, si utilizza la funzione CSng () con la seguente formula: Numero = CSng (Valore da convertire), nelle parentesi di CSng () immettere il valore da convertire. Double Se si desidera utilizzare un numero decimale che richiede una buona dose di precisione, si dichiara una variabile con tipo di dati Double con questa sintassi: Dim Distanza As Double . Invece di As Double, è possibile utilizzare il tipo di carattere # in questo modo: Dim Distanza # Per convertire un valore testo in Double si utilizza la funzione CDbl () con la seguente formula: Numero = CDbl (Valore da convertire) inserendo nelle parentesi di CDbl () , il valore che deve essere convertito. String Una stringa è un carattere o una combinazione di caratteri che costituiscono il testo di qualsiasi tipo e quasi qualsiasi lunghezza. Per dichiarare una variabile di tipo stringa, si utilizza come tipo di dati String in questo modo: Dim Paese As String. Il tipo di carattere per i dati String è $, pertanto, la dichiarazione di cui sopra può essere scritta come: Dim Paese $ Come già detto, dopo aver dichiarato una variabile, è possibile assegnarle un valore, nel caso di una variabile stringa il valore deve essere incluso all'interno di doppi apici in questo modo: Codice:
Dim Paese As String Paese = "Italia" Currency - Valuta Il tipo di dati valuta viene utilizzato per trattare valori monetari. Ecco un esempio di dichiarazione: Dim Salario As Currency . Invece di utilizzare la valuta come espressione, è possibile utilizzare il carattere @ come tipo di dati per dichiarare una variabile di valuta così: Dim Salario @ Quando si assegna un valore a una variabile Currency non si deve utilizzare il simbolo di valuta. Ecco un esempio di assegnazione di un numero di valuta per una variabile: Codice:
Dim Salario As Currency Salario = 66500 Date - Data Una data come tipo di dati può essere utilizzata per memorizzare un valore data, pertanto, per dichiarare una variabile data si utilizza come tipo di dati Date in questo modo: Dim Data_nascita As Date. Dopo aver dichiarato la variabile, è possibile assegnare un valore, che deve essere compreso tra due simboli # (cancelletto). Ecco un esempio: Codice:
Dim Data_nascita As Date Data_nascita = # 10/8/1988 # Time In Visual Basic, il tipo di dati Date può essere utilizzato anche per memorizzare un valore di tempo, ecco un esempio di dichiarazione di una variabile che può contenere un valore di tempo: Dim tempo As Date Per assegnare un valore alla variabile si segue la sintassi della funzione Date Variant Fino ad ora, abbiamo dichiarato variabili conoscendone il tipo di valore che dovevano contenere, VBA offre un tipo di dati universale che è possibile utilizzare per qualsiasi tipo di valore, il tipo di dati Variant. Questo tipo di dati viene utilizzato per dichiarare una variabile il cui contenuto non è esplicitamente specificato, ciò significa che un tipo di dati Variant può contenere qualsiasi tipo di valore che si desidera. Ecco alcuni esempi di variabili di tipo Variant, che contengono diversi tipi di valori: Codice:
Sub Test () Dim Nome, Paese, Salario, DataN As Variant Nome = "Eva Kant" Paese = 2 Salario = 35.65 DataN = # 24/02/2004# End Sub Fino ad ora, abbiamo dichiarato le variabili tra le linee di codice Sub e End Sub, questo tipo di variabile è definita come variabile locale. Una variabile locale è limitata alla zona in cui è dichiarata, in pratica non è possibile utilizzare tali variabili al di fuori della Sub in cui è stata dichiarata. Ecco un esempio: Codice:
Option Explicit Sub Test () Dim Nome As String Nome = "Eva" End Sub Una variabile globale è una variabile dichiarata al di fuori della Sub e questo tipo di variabile è normalmente dichiarata nella sezione superiore del file. Ecco un esempio: Codice:
Option Explicit Dim Cognome As String Sub Test () ..... End Sub In Modulo1 Codice:
Option Explicit Dim Cognome As String In Modulo2 Sub Test () Dim Nome As String Nome = "Eva" Cognome = "Kant" End Sub Variabili private Una variabile è indicata come Private se può accedere solo al codice all'interno dello stesso modulo, dove viene utilizzato. Per dichiarare una tale variabile, invece della parola chiave Dim, si utilizza la parola chiave Private. Ecco un esempio: Codice:
Option Explicit Private Cognome As String Sub Test () Dim Nome As String Nome = "Eva" Cognome = "Kant" End Sub Variabili pubbliche Una variabile è denominata Public se si può accedere al codice sia all'interno dello stesso modulo in cui è dichiarata o dal codice esterno relativo modulo. Per dichiarare una variabile pubblica, invece della parola chiave Dim, si utilizza la parola chiave Public. Ecco un esempio: Codice:
Option Explicit Private Cognome As String Public Nome_esteso As String Sub Test () Dim Nome As String Nome = "Eva" Cognome = "Kant" Nome_esteso = Nome & "" & Cognome End Sub Codice:
Modulo 1 : Option Explicit Private Cognome As String Modulo 2 : Option Explicit Private Cognome As String Private Nome As String Sub Test () Nome = "Eva" Cognome = "Kant" Nome_esteso = Nome & "" & Cognome ActiveCell.FormulaR1C1 = Nome_esteso End Sub
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
14-11-2014, 23.23.54 | #69 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Importare dati da un file di testo in Excel con VBA Essere in grado di manipolare i file di testo e/o CSV con VBA è una competenza che in programmazione risulta molto utile e in questa sezione verrà illustrato il modo per poterlo fare. Un file CSV è composto da dati separati tra di loro da virgole, infatti l’acronimo CSV indica Comma Separated Value, ovvero valori separati da virgole e i dati terminano con un ritorno a capo premendo il tasto Invio sulla tastiera (Fig. 1), mentre se un file ha ogni voce su una riga separata con il carattere di tabulazione, allora si dice che sia un file TXT (Fig. 2) Fig. 1 Fig. 2 Il formato CSV generalmente viene utilizzato per importare e esportare i dati presenti in una tabella e ogni linea di testo del file rappresenta una riga della tabella, mentre le linee rappresentano i campi, divisi da un carattere separatore, che rappresentano i valori presenti nelle varie colonne. È possibile, naturalmente, aprire un file di testo direttamente da Excel, basta seguire il percorso Dati - Carica dati esterni dalla sezione Opzioni Testo della barra multifunzione di Excel e verrebbe in tal modo richiamata l'importazione guidata del testo. Tuttavia, è utile sapere che è possibile farlo a livello di programmazione usando VBA. Per meglio comprendere il procedimento in questa lezione andremo ad aprire il file CSV illustrato in figura 1 spostando il codice numerico che si vede all'estrema destra in figura 1 nella prima colonna. Come prima operazione si apre Excel, si crea una nuova cartella di lavoro vuota, si clicca sulla colonna A e si formatta come testo, questo perché il codice nel file di testo è in formato numerico e se si lascia la colonna A formattata come generale (di default), si può ottenere un numero "strano". A questo punto si apre l'Editor di VBA per arrivare alla finestra del codice e si crea una nuova Sub chiamandola ApriFile e come prima riga di codice, si aggiunge la seguente: Codice:
Dim percorso As String Codice:
percorso = Application.DefaultFilePath & "\Prova.csv" Codice:
percorso = "C:\Users\user\Documents\Test\Prova.csv" Codice:
Open FileName For Mode As FileNumbe
Codice:
Open percorso For Input As #1 Codice:
Open "C:\Users\user\Documents\Test\Prova.csv" For Input As #1 Nriga = 0 Al momento, abbiamo solo detto al VBA di aprire il file, non abbiamo eseguito nessuna azione sul file. Di solito come prima azione si dovrebbe eseguire la lettura dei dati nel file, useremo un ciclo Do Until per questo: Codice:
Do Until EOF (1) ......... Loop Codice:
Line Input # 1, LineaFile Mario, Rossi, 12345678 A questo punto è necessario analizzare le righe del file di testo in qualche modo, sia per togliere le virgole che per inserire i valori nelle righe del file Excel. Un buon modo per analizzare una linea è usando la funzione Split tramite la quale è possibile inserire ogni elemento di una riga in un array, cosa che possiamo fare con un codice come il seguente: Codice:
RigaF = Split (LineaFile, ",") Codice:
ActiveCell.Offset (Nriga, 0) .Value = RigaF (2) ActiveCell.Offset (Nriga, 1) .Value = RigaF (1) ActiveCell.Offset (Nriga, 2) .Value = RigaF (0) A destra del segno di uguale, abbiamo il nostro array RigaF, poiché vogliamo che il codice numerico sia posto nella colonna A, abbiamo usato RigaF (2) che indica l’ultimo valore della riga letta nel file di testo e posto come primo valore nel foglio di lavoro dopo il segno di uguale. Abbiamo poi inserito RigaF (1) , che conterrà l'ultimo nome della riga del file di testo e infine, abbiamo RigaF (0) , che conterrà il primo nome della riga del file di testo. L'ultima cosa che rimane da fare all'interno del ciclo è quella di incrementare la variabile Nriga, altrimenti saremo bloccati sulla prima riga del foglio di calcolo, usando questo codice. Codice:
Nriga = Nriga + 1 Codice:
Close # 1 Codice:
Sub ApriFile() Dim percorso As String percorso = "C:\Users\user\Documents\Test\Prova.csv" Open percorso For Input As #1 Nriga = 0 Do Until EOF(1) Line Input #1, LineaFile RigaF = Split(LineaFile, ",") ActiveCell.Offset(Nriga, 0).Value = RigaF(2) ActiveCell.Offset(Nriga, 1).Value = RigaF(1) ActiveCell.Offset(Nriga, 2).Value = RigaF(0) Nriga = Nriga + 1 Loop Close #1 End Sub Fig. 3 Scrittura di file di testo in Excel VBA Abbiamo appena visto come importare i dati da un file di testo con VBA, ora vediamo come scrivere dei dati da un foglio di lavoro in un file di testo, prendendo come base dati quelli elencati in Fig. 3 e scrivere di nuovo in un file Txt. Il primo compito è quello di trovare un modo per fare riferimento alle celle che ci interessano del foglio di lavoro che come vediamo è composto da 3 colonne e 7 righe, potremmo usare 2 cicli, 1 per scorrere le righe e un altro per scorrere le colonne. Codice:
For I = 1 To 7 For j = 1 To 3 Next j Next i Codice:
For I = 1 To UltimaR For j = 1 To UltimaC Next j Next i Codice:
UltimaR = Cells(1, “A”).End(xlDown).Row Codice:
Open percorso For Output As #1 Codice:
Write #1, contenutoF Codice:
Dim percorso As String Dim CellaD As String Dim UltimaC As Long Dim UltimaR As Long Codice:
UltimaR = Cells(1, “A”).End(xlDown).Row UltimaC = Cells(1, “A”).End(xlToRight).Column Codice:
CellD = "" percorso = Application.DefaultFilePath & “\Prova.csv” Codice:
percorso = “C:\Users\user\Documents\Test\Prova.txt” Codice:
Open percorso For Output As #2 NOTA: Su alcuni sistemi, si può ottenere un errore che indica che il file è già aperto quando si esegue il codice, se è così, chiudete Excel e riapritelo. Il codice successivo da aggiungere è il doppio ciclo For per leggere i dati e prepararli per la scrittura nel file. Questo spezzone di codice è abbastanza complesso, quindi vediamo prima il listato e poi lo commenteremo. Codice:
For I = 1 To UltimaR For j = 1 To UltimaC If j = UltimaC Then CellD = CellD + Trim(ActiveCell(I, j).Value) Else CellD = CellD + Trim(ActiveCell(I, j).Value) + “,” End If Next j Write #2, CellD CellD = “” Next i Codice:
If j = UltimaC Then CellD = CellD + Trim(ActiveCell(I, j).Value) Else CellD = CellD + Trim(ActiveCell(I, j).Value) + “,” End If Mario, Rossi, 12345678 In pratica stiamo scorrendo una cella alla volta del foglio di lavoro e ognuno degli elementi deve essere separato da una virgola, tuttavia, non c’è la virgola alla fine del terzo elemento, per cui se j è uguale a UltimaC non la aggiungiamo eseguendo questo codice Codice:
CellD = CellD + Trim(ActiveCell(I, j).Value) Codice:
CellD = CellD + Trim(ActiveCell(I, j).Value) + “, “ Codice:
Write #2, CellD CellD = “” Codice:
Close # 2 MsgBox (“Fatto”) Codice:
Sub ScriviFile() Dim percorso As String, CellaD As String, UltimaC As Long, UltimaR As Long UltimaR = Cells(1, “A”).End(xlDown).Row UltimaC = Cells(1, “A”).End(xlToRight).Column percorso = “C:\Users\user\Documents\Test\Prova.txt” CellData = “” Open percorso For Output As #2 For i = 1 To UltimaR For j = 1 To UltimaC If j = UltimaC Then CellD = CellD + Trim(ActiveCell(i, j).Value) Else CellD = CellD + Trim(ActiveCell(i, j).Value) + “,” End If Next j Write #2, CellD CellD = “” Next i Close #2 MsgBox (“Fatto”) End Sub Fig. 4 Non preoccupatevi per i doppi apici che VBA ha aggiunto all'inizio e alla fine di ogni riga
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
19-11-2014, 22.47.14 | #70 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Introduzione alle Istruzioni condizionali In alcuni compiti di programmazione, è necessario scoprire se una data situazione porta un valore valido e questa operazione viene fatta controllando una condizione. A supporto di questo, il linguaggio Visual Basic fornisce una serie di parole chiave e operatori che possono essere combinati per eseguire questo controllo, verificare se una condizione produce un risultato vero o falso. Una volta che la condizione è stata verificata, è possibile utilizzare il risultato (True o False) per compiere delle azioni. Ci sono diversi modi per controllare una condizione, anche utilizzando diversi tipi di parole chiave per verificare cose diverse, essendo ben consapevoli di ciò che ciascuna parola chiave fa o non può fare per è importante scegliere quella giusta. La dichiarazione IF ... Then esamina la veridicità di un'espressione ed è strutturata in questo modo: If CondizioneX Then Dichiarazione Pertanto, il programma esamina una condizione, in questo caso CondizioneX che può essere una semplice espressione o una combinazione di espressioni e se CondizioneX è vera, allora il programma esegue la dichiarazione. Ci sono due modi per utilizzare la dichiarazione IF ... Then, se la formula condizionale è abbastanza breve, un modo è quello di scrivere su una riga, in questo modo: Codice:
Sub Test() Dim ricco As Boolean, tassa As Double tassa = 30 MsgBox ("Imposta : " & tassa & "%") ricco = True If ricco = True Then tassa = 40.5 MsgBox ("Imposta : " & tassa & "%") End Sub Fig. 1 Fig. 2 Se per verificare la condizione ci sono molte istruzioni da eseguire, si dovrebbero scrivere le istruzioni su righe alternate, naturalmente, è possibile utilizzare questa tecnica anche se la condizione che si sta esaminando è breve. Se si scrive l'istruzione condizionale in più di una riga, è necessario terminare con End IF su una riga propria. La formula utilizzata è: Codice:
If CondizioneX Then Dichiarazione End If Codice:
Sub Test() Dim ricco As Boolean, tassa As Double tassa = 30 MsgBox ("Imposta : " & tassa & "%") ricco = True If ricco = True Then tassa = 40.5 MsgBox ("Imposta : " & tassa & "%") End If End Sub Codice:
Sub Test() Dim ricco As Boolean MsgBox ("Sei ricco? " & ricco) End Sub Fig. 3 Sulla base di questo, se si desidera controllare se una variabile booleana dichiarata di recente e non inizializzata è uguale a False, è possibile omettere l'espressione di = False. Ecco un esempio: Codice:
Sub Test() Dim ricco As Boolean, tassa As Double tassa = 33 If ricco Then tassa = 40.5 MsgBox ("Percentuale tassabile : " & tassa & "%") End Sub Fig. 4 Si noti che non ci sono simboli di uguale (=) dopo l'espressione If ricco, in questo caso, il valore della variabile è False, d'altra parte, se si vuole verificare se la variabile è True (Vera), assicuratevi di includere l’espressione = True. In generale, in caso di dubbio, è più sicuro inizializzare sempre la variabile e includere l’espressione = True o = False quando si valuta la variabile: Codice:
Sub Test() Dim ricco As Boolean, tassa As Double tassa = 33 ricco = True If ricco = False Then tassa = 40.5 MsgBox ("Percentuale tassabile : " & tassa & "%") End Sub Codice:
If CondizioneX Then Dichiarazione1 Else Dichiarazione2 End If Codice:
Sub Test() Dim eta As Integer, FasciaEta As String eta = 16 If eta <= 18 Then FasciaEta = "Ragazzo" Else FasciaEta = "Adulto" End If MsgBox ("Categoria : " & FasciaEta) End Sub Fig. 5 IF Immediato Per aiutarvi con il controllo di una condizione e la sua alternativa, il linguaggio Visual Basic fornisce una funzione chiamata IIf . La sua sintassi è: Codice:
Public Function IIf( _ ByVal Expression As Boolean, _ ByVal TruePart As Variant, _ ByVal FalsePart As Variant _ ) As Variant Codice:
Sub Test() Dim eta As Integer, FasciaE As String eta = 16 FasciaE = IIf(eta <= 18, "Ragazzo", "Adulto") MsgBox ("Categoria : " & FasciaE) End Sub Scelta di un valore Abbiamo imparato come controllare se una condizione è vera o falsa ed eseguire un'azione. Ecco un esempio: Codice:
Sub Test() Dim flag As Integer, tipo As String flag = 1 tipo = "Sconosciuto" If flag = 1 Then tipo = "Tempo Pieno" End If MsgBox ("Tipo di impiego : " & tipo) End Sub Codice:
Public Function Choose( _ ByVal Index As Double, _ ByVal ParamArray Choice() As Variant _ ) As Variant Codice:
Sub Test() Dim flag As Byte, tipo As String flag = 1 tipo = Choose(flag, ...) MsgBox ("Tipo di impiego : " & tipo) End Sub Choose(flag, "Tempo Pieno") Il secondo argomento è in realtà un elenco di valori e ogni valore ha una posizione specifica detta indice. Si tenga presente che per utilizzare la funzione in uno scenario If ... Then, si passa un solo valore come secondo argomento e questo valore (o argomento) ha un indice di 1. Quando la funzione Choose viene richiamata in un ciclo If, se il primo argomento contiene il valore 1, il secondo argomento viene convalidato. Quando la funzione Choose viene richiamata, restituisce un valore di tipo Variant ed è possibile recuperare quel valore, memorizzarlo in una variabile e usarlo all’occorrenza. Ecco un esempio: Codice:
Sub Test() Dim flag As Byte, tipo As String flag = 1 tipo = Choose(flag, "Tempo Pieno") MsgBox ("Tipo di impiego : " & tipo) End Sub Fig. 6 In alcuni casi, la funzione Choose può produrre un risultato nullo, se consideriamo lo stesso listato usato in precedenza, ma con un diverso valore: Codice:
Sub Test() Dim flag As Byte, tipo As String flag = 2 tipo = Choose(flag, "Tempo Pieno") MsgBox ("Tipo di impiego : " & tipo) End Sub Fig. 7 In quanto non vi è alcun valore con indice 2 dopo la variabile che è stato inizializzato con il valore 2. Per utilizzare questa funzione come alternativa all’operazione If ... Then ... Else, si devono passare due valori per il secondo argomento in quanto ogni valore ha una posizione specifica in base al suo indice. Per utilizzare la funzione in una applicazione If ... Then ... Else, si devono passare due valori per il secondo argomento. Ecco un esempio: Choose(Tipo di Impiego, "Tempo Pieno", "Part Time") Il secondo argomento della funzione, che è il primo valore dell’argomentazione Choose, ha un indice di 1, mentre il terzo argomento della funzione, che è il secondo valore dell’argomento Choose, ha un indice di 2. In sostanza quando viene richiamata la funzione Choose, se il primo argomento ha il valore 1, il secondo argomento viene convalidato, mentre se il primo argomento ha il valore 2, viene convalidato il terzo argomento. Come già menzionato, è possibile recuperare il valore restituito della funzione, ecco un esempio: Codice:
Sub Test() Dim flag As Byte, tipo As String flag = 2 tipo = Choose(flag, "Tempo Pieno", "Part Time") MsgBox ("Tipo di impiego : " & tipo) End Sub Fig. 8 Il passaggio di un valore Come ulteriore alternativa a un If ... Then, il linguaggio Visual Basic fornisce una funzione denominata Switch . La sua sintassi è: Codice:
Public Function Switch( _ ByVal ParamArray VarExpr() As Variant _ ) As Variant Switch(CondizioneX, Statement) Dove CondizioneX è un segnaposto e si deve passare una espressione booleana che può essere valutata a Vero o Falso, se tale condizione è vera, il secondo argomento sarebbe stato ignorato. Quando la funzione Switch viene richiamata, si produce un valore di tipo Variant (come una stringa) che è possibile utilizzare all’occorrenza, ad esempio, è possibile memorizzarla in una variabile in questo modo: Codice:
Sub Test() Dim flag As Byte, tipo As String flag = 1 tipo = "sconosciuto tipo = Switch(flag = 1, "Part Time") MsgBox ("Tipo di impiego : " & tipo) End Sub Codice:
Private Enum tipo FullTime PartTime Stagionale Sconosciuto End Enum Sub Test() Dim flag As tipo, Result As String flag = tipo.FullTime Result = "Sconosciuto" Result = Switch(flag = tipo.FullTime, "Full Time") MsgBox ("Tipo di Impiego : " & Result) End Sub Switch(CondizioneX1, Stato1, CondizioneX2, Stato2) Dove il segnaposto CondizioneX1 passa una espressione booleana che può essere valutata a Vero o Falso, se tale condizione è vera, il secondo argomento sarebbe stato eseguito. Per fornire un'alternativa alla prima condizione, si può passare un'altra condizione come CondizioneX2 e se viene valutata come Vero, allora sarebbe stata eseguita l’istruzione2.
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
19-11-2014, 22.50.47 | #71 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Le Funzioni Condizionali Una valida alternativa ad una condizione Vera o Falsa può essere la dichiarazione If ... Then ... ElseIf in quanto si comporta come l’espressione If ... Then ... Else, salvo che offre un maggior numero di scelte, se necessario. La sintassi è la seguente: Codice:
If Condizione1 Then Istruzioni1 ElseIf Condizione2 Then Istruzioni2 ElseIf CondizioneX Then IstruzioniX End If Codice:
Sub Test() Dim eta As Byte eta = 32 If eta <= 18 Then MsgBox ("Fascia Età : " & "Ragazzo") ElseIf eta < 55 Then MsgBox ("Fascia Età : " & "Adulto") End If End Sub Fig. 1 Esiste però la possibilità che nessuna delle condizioni indicate sia vera, in questo caso, è necessario fornire una condizione "generica" e viene fatta con un ultimo Else, che deve essere l'ultima nella lista di condizioni e deve agire se nessuna delle condizioni precedenti è risultata vera. La formula da usare potrebbe essere: Codice:
If Condizione1 Then Istruzioni1 ElseIf Condizione2 Then Istruzioni2 ElseIf CondizioneX Then IstruzioniX Else CondizioneG End If Codice:
Sub Test() Dim eta As Byte eta = 65 If eta <= 18 Then MsgBox ("Fascia Età : " & "Ragazzo") ElseIf eta < 55 Then MsgBox ("Fascia Età : " & "Adulto") Else MsgBox ("Fascia Età : " & "Anziano") End If End Sub Fig. 2 Dichiarazioni condizionali e funzioni Come abbiamo già visto, sappiamo che una funzione viene utilizzata per eseguire un compito specifico e produrre un risultato. Ecco un esempio: Codice:
Private Function etaF() Dim eta eta = InputBox("Inserisci l'età") etaF = "" End Function Codice:
Private Function etaF() Dim eta eta = InputBox("Inserisci l'età") If eta <= 18 Then etaF = "Ragazzo" ElseIf eta < 55 Then etaF = "Adulto" End If End Function Sub Test() Dim tipo tipo = etaF MsgBox ("Fascia di età : " & tipo) End Sub Fig. 3 Fig. 4 Se invece l'utente fornisce un numero compreso tra 18 (incluso) e 55, la funzione restituisce “Adulto”. Ecco un altro esempio del programma: Fig. 5 Fig. 6 Si deve tener presente che i valori restituiti sono dovuti esclusivamente alle istruzioni condizionali inserire e non alla funzione, e che la condizione viene verificata quando è Vera, pertanto se viene inserito un valore che non si “adatta” alle istruzioni la funzione non restituisce nessun valore. Nel nostro esempio, se l'utente inserisce un numero superiore a 55 (escluso), la funzione non eseguirà nessuna delle dichiarazioni, ciò significa che l'esecuzione raggiungerà la linea End Function senza trovare un valore da restituire. Ecco un altro esempio del programma: Fig. 7 Fig. 8 Per risolvere questo problema, si dispone di varie alternative, se la funzione utilizza una condizione If ... Then, è possibile creare una condizione Else che abbraccia un valore diverso da quelli validati in precedenza. Ecco un esempio: Codice:
Private Function etaF() Dim eta eta = InputBox("Inserisci l'età") If eta <= 18 Then etaF = "Ragazzo" ElseIf eta < 55 Then etaF = "Adulto" Else etaF = "Anziano" End If End Function Sub Test() Dim tipo tipo = etaF MsgBox ("Fascia di età : " & tipo) End Sub Fig. 9 Fig. 10 Un'altra alternativa è quella di fornire un ultimo valore di ritorno prima della linea End Function, in questo caso, se l'esecuzione raggiunge la fine della funzione, troverebbe dei dati da restituire, ma si dovrebbe conoscere il dato da restituire. Ciò dovrebbe essere fatto nel modo seguente: Codice:
Private Function etaF() Dim eta eta = InputBox("Inserisci l'età") If eta <= 18 Then etaF = "Ragazzo" ElseIf eta < 55 Then etaF = "Adulto" End If etaF = "Anziano" End Function Uso della funzione Immediate IIF La funzione IIf può essere usata anche al posto di uno scenario If ... Then ... ElseIf, infatti quando la funzione viene richiamata, l'espressione viene controllata e, come abbiamo già visto, se l'espressione è vera, la funzione restituisce l’argomento True e ignora l'ultimo argomento. Per utilizzare questa funzione come alternativa alla dichiarazione If ... Then ... ElseIf, se l'espressione è falsa, anziché immediatamente restituire il valore dell'argomento False, è possibile tradurre la parte in una nuova funzione IIf. La sintassi diventerebbe: Codice:
Public Function IIf( _ ByVal Expression As Boolean, _ ByVal TruePart As Object, _ Public Function IIf( _ ByVal Expression As Boolean, _ ByVal TruePart As Object, _ ByVal FalsePart As Object _ ) As Object ) As Object Codice:
Sub Test() Dim eta As Byte, fasciaE As String eta = 74 fasciaE = IIf(eta <= 18, "Ragazzo", IIf(eta < 55, "Adulto", "Anziano")) MsgBox ("Fascia eta : " & fasciaE) End Sub Codice:
Public Function IIf( _ ByVal Expression As Boolean, _ ByVal [COLOR="rgb(139, 0, 0)"]TruePart [/COLOR]As Object, _ Public Function IIf( _ ByVal Expression As Boolean, _ ByVal [COLOR="rgb(139, 0, 0)"]TruePart [/COLOR]As Object, _ [COLOR="rgb(139, 0, 0)"]Public Function IIf[/COLOR]( _ ByVal Expression As Boolean, _ ByVal [COLOR="rgb(139, 0, 0)"]TruePart [/COLOR]As Object, _ [COLOR="rgb(139, 0, 0)"]Public Function IIf[/COLOR]( _ ByVal Expression As Boolean, _ ByVal TruePart As Object, _ ByVal [COLOR="rgb(139, 0, 0)"]FalsePart [/COLOR]As Object _ ) As Object ) As Object ) As Object ) As Object Scegliere un valore alternativo Come abbiamo visto finora, la funzione Choose prende una lista di argomenti e per usarla come alternativa al If ... Then ... ElseIf ... ElseIf, è possibile passare i valori che si giudicano necessari per il secondo argomento. L'indice del primo elemento del secondo argomento sarebbe 1, mentre l'indice del secondo elemento del secondo argomento sarebbe 2, e così via. Quando la funzione viene richiamata, si dovrebbe prima ottenere il valore del primo argomento, allora si devono controllare gli indici dei membri disponibili del secondo argomento. Ecco un esempio: Codice:
Sub Test() Dim statoC As Byte, tipo As String statoC = 3 tipo = Choose(statoC, "Tempo Pieno", "Part Time", "Stagionale", "A chiamata") MsgBox ("Tipo di Inquadramento : " & tipo) End Sub Fig. 11 Finora, abbiamo usato solo le stringhe per i valori del secondo argomento della funzione Choose, in realtà, i valori del secondo argomento può essere anche nullo, può essere una costante o una stringa. Ecco un esempio: Codice:
Private Function Moperat() Moperat = "**-- Lista Operatori --**" & vbCrLf & vbCrLf & _ "James Bond" & vbCrLf & _ "Eva Kant" & vbCrLf & _ "Arsenio Lupin" & vbCrLf & _ "Rocky Balboa" & vbCrLf & _ "Sandro Pertini" End Function Sub Test() Dim tipo As Byte, Result$ tipo = 3 Result = Choose(tipo, _ "Tipo Contratto : Full Time", _ "Tipo Contratto : Part Time", _ Moperat, _ "Tipo Contratto : Stagionale") MsgBox (Result) End Sub Fig. 12 I valori del secondo argomento possono anche essere di diversi tipi. Il passaggio a un valore alternativo La funzione Switch è un metodo alternativo alla condizione If ... Then ... ElseIf ... ElseIf e l'argomento di questa funzione viene passato come un elenco di valori, come visto in precedenza, ogni valore viene passato come una combinazione di due valori: CondizioneX, StatementX Come si accede alla funzione, il compilatore controlla ogni condizione, se una condizione è vera, la sua dichiarazione viene eseguita, e se una condizione Y è falsa, il compilatore la salta. È anche possibile fornire un maggior numero di queste combinazioni. Ecco un esempio: Codice:
Private Enum tipoC TPn PTm Stg Ach End Enum Sub Test() Dim tipo As tipoC, Result As String tipo = tipoC.Stg Result = "Sconosciuto" Result = Switch(tipo = tipoC.TPn, "Tempo Pieno", _ tipo = tipoC.PTm, "Part Time", _ tipo = tipoC.Stg, "Stagionale", _ tipo = tipoC.Ach, "A Chiamata") MsgBox ("Tipo Contratto : " & Result) End Sub Fig. 13 In una condizione If ... Then ... ElseIf ... ElseIf, abbiamo visto che c'è una possibilità che nessuna delle condizioni si adatterebbe, nel qual caso è possibile aggiungere una ultima dichiarazione Else. La funzione Switch supporta anche questa situazione se si utilizza un numero, un carattere o una stringa e per fornire questa ultima alternativa, invece di un CondizioneX, si deve immettere un valore Vero e includere la dichiarazione. Ecco un esempio: Codice:
Sub Test() Dim tipo As Byte, Result As String tipo = 12 Result = Switch(tipo = 1, "Tempo Pieno", _ tipo = 2, "Part Time", _ tipo = 3, "A Chiamata", _ tipo = 4, "Stagionale", _ True, "Sconosciuto") MsgBox ("Tipo Contratto : " & Result) End Sub Fig. 14 Ricorda che puoi utilizzare anche un carattere. Ecco un esempio: Codice:
Sub Test() Dim sesso As String, Result As String sesso = "H" Result = Switch(sesso = "f", "Femmina", _ sesso = "F", "Femmina", _ sesso = "m", "Maschio", _ sesso = "M", "Maschio", _ True, "Sconosciuto") MsgBox ("Tipo Sesso: " & Result) End Sub Fig. 15
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
21-11-2014, 10.43.38 | #72 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Le Selezioni condizionali Se si dispone di un gran numero di condizioni da esaminare, la dichiarazione If ... Then ... Else è costretta a verificarle tutte, ma il linguaggio Visual Basic offre l'alternativa di saltare direttamente all’istruzione che si applica allo stato di una condizione. Questo processo è indicato come selezionare le condizioni utilizzando le parole chiave Select Case e Case, la cui formula è: Codice:
Select Case Expression Case Expression1 Statement1 Case Expression2 Statement2 Case ExpressionX StatementX End Select All'interno del Select Case e prima della linea End Select, è necessario fornire una o più sezioni e ognuna contiene una parola chiave Case seguita da un valore sul lato destro e i valori di Expresion1, Expresion2 o ExpresionX, devono essere dello stesso tipo come il valore di Expression. Dopo il Case e la sua espressione (Expression), si può scrivere una dichiarazione e quando si accede a questa sezione di codice, viene considerato il valore di Expression e viene confrontato con ciascun valore di Expression di ogni Case:
Codice:
Sub Test() Dim risp As Byte risp = CByte(InputBox( _ "Una delle seguenti parole non è una parola chiave di Visual Basic" & vbCrLf & vbCrLf & _ "1) Function" & vbCrLf & _ "2) Except" & vbCrLf & _ "3) ByRef" & vbCrLf & _ "4) Each" & vbCrLf & vbCrLf & _ "Inserisci la tua risposta ")) Select Case risp Case 1 MsgBox ("Giusto: Function è una parola chiave di Visual Basic " & vbCrLf & _ "Viene utilizzata per creare una procedura di tipo funzione") Case 2 MsgBox ("Sbagliato: Except non è una parola chiave di " & vbCrLf & _ "Visual Basic ma è una parola chiave " & vbCrLf & _ "utilizzata in C++ per la Gestione delle eccezioni") Case 3 MsgBox ("Giusto: ByRef è una parola chiave di Visual Basic" & vbCrLf & _ "Viene utilizzata per passare un argomento a una procedura") Case 4 MsgBox ("Giusto: Each è una parola chiave di Visual Basic " & vbCrLf & _ "utilizzata in un ciclo per scorrere una lista di voci ") End Select End Sub Fig. 1 Fig. 2 Il codice di cui sopra presuppone che uno dei Case corrisponderà al valore di Expression, ma non è sempre così. Se si prevede che ci potrebbe essere nessuna corrispondenza tra l'espressione (Expression) e uno dei vari Expression dei Case, è possibile utilizzare una dichiarazione Case Else alla fine della lista. La dichiarazione sarebbe allora simile a questa: Codice:
Select Case Expression Case Expression1 Statement1 Case Expression2 Statement2 Case Expression3 Statement3 Case Else Statementk End Select Codice:
Sub Test() Dim risp As Byte risp = CByte(InputBox( _ "Una delle seguenti parole non è una parola chiave di Visual Basic" & vbCrLf & vbCrLf & _ "1) Function" & vbCrLf & _ "2) Except" & vbCrLf & _ "3) ByRef" & vbCrLf & _ "4) Each" & vbCrLf & vbCrLf & _ "Inserisci la tua risposta ")) Select Case risp Case 1 MsgBox ("Giusto: Function è una parola chiave di Visual Basic " & vbCrLf & _ "Viene utilizzata per creare una procedura di tipo funzione") Case 2 MsgBox ("Sbagliato: Except non è una parola chiave di " & vbCrLf & _ "Visual Basic ma è una parola chiave " & vbCrLf & _ "utilizzata in C++ per la Gestione delle eccezioni") Case 3 MsgBox ("Giusto: ByRef è una parola chiave di Visual Basic" & vbCrLf & _ "Viene utilizzata per passare un argomento a una procedura") Case 4 MsgBox ("Giusto: Each è una parola chiave di Visual Basic " & vbCrLf & _ "utilizzata in un ciclo per scorrere una lista di voci ") Case Else MsgBox ("Selezione non valida") End Select End Sub Fig. 3 Fig. 4 Come accennato nell'introduzione, il Select Case può utilizzare un valore diverso da un numero intero, ad esempio, è possibile utilizzare un carattere: Codice:
Sub Test() Dim sesso As String sesso = "M" Select Case sesso Case "F" MsgBox ("Femmina") Case "M" MsgBox ("Maschio") Case Else MsgBox ("Sconosciuto") End Select End Sub Fig. 5 Si noti che in questo caso stiamo usando solo caratteri maiuscoli, se si desidera convalidare anche caratteri minuscoli, potremmo essere costretti a creare sezioni aggiuntive di Case per ciascuno. Ecco un esempio: Codice:
Sub Test() Dim sesso As String sesso = "f" Select Case sesso Case "F" MsgBox ("Femmina") Case "f" MsgBox ("Femmina") Case "M" MsgBox ("Maschio") Case "m" MsgBox ("Maschio") Case Else MsgBox ("Sconosciuto") End Select End Sub Fig. 6 Invece di utilizzare un valore per Case, è possibile applicare più di una condizione, per fare ciò, sul lato destro della parola chiave Case, è possibile separare le espressioni con una virgola. Ecco alcuni esempi: Codice:
Sub Test() Dim sesso As String sesso = "F" Select Case sesso Case "f", "F" MsgBox ("Femmina") Case "m", "M" MsgBox ("Maschio") Case Else MsgBox ("Sconosciuto") End Select End Sub È possibile utilizzare un intervallo di valori per un Case, a tale scopo, sul lato destro del Case, si deve inserire il valore più basso, seguito dalla parola chiave To e seguito dal valore più alto. Ecco un esempio: Codice:
Sub Test() Dim eta As Integer eta = 24 Select Case eta Case 0 To 17 MsgBox ("Ragazzo") Case 18 To 55 MsgBox ("Adulto") Case Else MsgBox ("Anziano") End Select End Sub Fig. 7 Verificare un valore Si consideri la seguente procedura: Codice:
Sub Test() Dim num As Integer num = 448 Select Case num Case -602 MsgBox ("-602") Case 24 MsgBox ("24") Case 0 MsgBox ("0") End Select End Sub Is Operator Value Si inizia con la parola chiave Is seguita da uno degli operatori booleani che abbiamo visto precedentemente, come: =, <>, <, <=,> o> = e sul lato destro dell'operatore booleano, si digita il valore desiderato. Ecco alcuni esempi: Codice:
Sub Test() Dim num As Integer num = -448 Select Case num Case Is < 0 MsgBox ("Il numero è negativo") Case Is > 0 MsgBox ("Il numero è positivo") Case Else MsgBox ("Il numero è 0") End Select End Sub Codice:
Sub Test() Dim num As Integer, cat As String num = 2 Select Case num Case 1 cat = "Ragazzo" Case 2 cat = "Adulto" Case Else cat = "Anziano" End Select MsgBox ("La categoria è : " & cat) End Sub Fig. 8 Abbiamo anche visto che il linguaggio Visual Basic fornisce la funzione Choose che può controllare una condizione e intraprendere un'azione, inoltre è un'altra alternativa a una dichiarazione Select Case. Se prendiamo in considerazione la sintassi della funzione Choose: Codice:
Function Choose( ByVal Index As Double, ByVal ParamArray Choice() As Variant ) As Object Codice:
Choose(num, "Ragazzo", "Adulto", "Anziano") Codice:
Sub Test() Dim num As Integer, cat As String num = 1 cat = Choose(num, "Ragazzo", "Adulto", "Anziano") MsgBox ("Il tipo di categoria è: " & cat) End Sub Fig. 9 Fino ad ora, abbiamo visto come creare istruzioni condizionali normali. Ecco un esempio: Codice:
Sub Test() Dim num% num% = InputBox("Inserisci un numero inferiore a 5") If num% >= 0 Then MsgBox (num%) End If End Sub Codice:
Sub Test() Dim num% num% = InputBox("Inserisci un numero inferiore a 5") If num% >= 0 Then If num% < 12 Then MsgBox (num%) End If End If End Sub L’istruzione Goto consente di passare ad un’altra sezione del programma mentre è in esecuzione e per poter utilizzare l’istruzione Goto, si deve inserire un nome su una particolare sezione del procedimento in modo da poter fare riferimento a tale nome. Il nome, chiamato anche etichetta, è fatto di una sola parola e segue le regole che abbiamo applicato ai nomi e poi seguito da due punti ":". Ecco un esempio: Codice:
Sub Test() Etichetta1: End Sub Codice:
Sub Test Dim num% num% = InputBox("Inserisci un numero inferiore a 5") If num% < 0 Then GoTo Nnum Else MsgBox (num%) End If Nnum: MsgBox "Hai inserito un numero negativo" End Sub Codice:
Sub Test() Dim risp As Byte risp = InputBox(" **__ Voci Multiple __** " & vbCrLf & vbCrLf & _ "Per creare una costante nel codice, " & _ "devi utilizzare la parola chiave Constant" & vbCrLf & _ "Cosa scegli (1=True/2=False)? ") If risp = 1 Then GoTo sb If risp = 2 Then GoTo gt sb: MsgBox ("La parola chiave utilizzata per creare una costante è Const") GoTo Lv gt: MsgBox ("Constant non è una parola chiave") Lv: End Sub Fig. 10 Fig. 11 Ecco un altro esempio di esecuzione dello stesso programma con risposta = 2: Fig. 12 Fig. 13 La negazione di una istruzione condizionale Fino ad ora, abbiamo visto come un'istruzione condizionale che è vera o falsa, ma è possibile invertire il valore di una condizione, rendendolo Falso (o Vero). A sostegno di questa operazione, il linguaggio Visual Basic fornisce un operatore chiamato Not. La sua formula è: Not Expression Quando si scrive l'istruzione Not, deve essere seguita da un'espressione logica che può essere una semplice espressione booleana. Ecco un esempio: Codice:
Sub Test() Dim sposata As Boolean MsgBox ("La Signora è : " & sposata) MsgBox ("La Signora è : " & Not sposata) End Sub Codice:
Sub Test() Dim dsp As Boolean, tax As Double tax = 33# MsgBox ("Importo tassato : " & tax & "%") dsp = True If dsp = True Then tax = 30.65 MsgBox ("Importo tassato : " & tax & "%") End If End Sub Fig. 14 Fig. 15 Probabilmente il modo più classico di utilizzare l’operatore Not consiste in una “retromarcia” di un'espressione logica e per fare questo, si precedere l'espressione logica con l’operatore Not. Ecco un esempio: Codice:
Sub Test() Dim dsp As Boolean, tax As Double tax = 33# MsgBox ("Importo tassato : " & tax & "%") dsp = True If Not dsp Then tax = 30.65 MsgBox ("Importo tassato : " & tax & "%") End If End Sub Fig. 16 Allo stesso modo, è possibile negare qualsiasi espressione logica.
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - Ultima modifica di AMIGA : 24-01-2015 alle ore 03.03.03 |
12-04-2015, 23.53.19 | #73 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Il Debug in Visual Basic Editor Il Debug è un aspetto molto importante in programmazione e gli sviluppatori hanno bisogno di identificare e rettificare rapidamente gli errori durante la scrittura del codice. VBA fornisce numerosi strumenti di debug per risolvere i problemi nella fase di sviluppo, e oltre alla possibilità di aggiungere le routine di gestione degli errori, fornisce soluzioni rapide quando si manifestano gli errori durante l'esecuzione. Indentazione del codice Per poter facilitare la lettura e la comprensione del codice è buona cosa ricorrere all’indentazione del codice che consiste nel precedere le righe di codice con un certo numero di spazi e ha lo scopo di evidenziare i blocchi di codice per permettere di cogliere visivamente la struttura del programma, inoltre si deve indentare il codice mentre lo si sviluppa, non successivamente per renderlo “bello”. Il numero di spazi è sempre multiplo di un certo valore scelto come base (in genere 3 o 4) e normalmente si può definire il tasto Tab tramite il menu Strumenti – Opzioni dell’Editor di VBE, in modo che introduca quel numero di spazi Fig. 1 Indentare il codice è un requisito non obbligatorio e viene spesso messo in secondo piano, tuttavia, è fondamentale per incrementare la leggibilità del codice, in particolare delle strutture di controllo come le condizioni o i loop allo scopo di separare più chiaramente le istruzioni e, in particolare, di rappresentare esplicitamente le relazioni di annidamento e viene considerata come una norma fondamentale di buona programmazione. Esempio codice NON Indentato Codice:
Private Sub UserForm_Activate() Dim elemento As String If ListBox1.ListCount >= 1 Then ListBox1.Clear i = 1 Do Until Sheets("Archivio").Cells(1, i).Value = Empty With Sheets("Archivio") elemento = .Cells(1, i).Value End With ListBox1.AddItem elemento i = i + 8 Loop ListBox1.ListIndex = 0 svuota_box End Sub Codice:
Private Sub UserForm_Activate() Dim elemento As String If ListBox1.ListCount >= 1 Then ListBox1.Clear i = 1 Do Until Sheets("Archivio").Cells(1, i).Value = Empty With Sheets("Archivio") elemento = .Cells(1, i).Value End With ListBox1.AddItem elemento i = i + 8 Loop ListBox1.ListIndex = 0 svuota_box End Sub Nota: Non è ancora stata rilasciata una versione che supporti Office 64bit, per cui la versione 2013 non viene supportata, ma è possibile usare un indentatore on-line a questo Link Debug utilizzando una finestra di messaggio Uno dei metodi più elementari e spesso utilizzati durante la scrittura di codice è quello di usare una finestra di messaggio per controllare i valori mutevoli di una variabile (MsgBox). Generalmente si utilizza una finestra di messaggio immediatamente dopo la riga di codice in cui la variabile assume un valore, per verificare come la procedura viene eseguita con i valori delle variabili che cambiano dinamicamente. Per visualizzare la finestra di messaggio per ottenere il valore di una variabile si utilizza la sintassi: MsgBox NomeVariabile Questa riga di codice verrà rimossa dopo aver terminato la verifica del valore. Di seguito vediamo alcuni esempi che mostrano come utilizzare la funzione MsgBox per verificare i valori delle variabili che cambiano mentre viene eseguito il codice. Esempio: Verifica dei valori delle variabili alla fine del Ciclo Codice:
Sub Prova1() Dim I, tot As Integer i = 0 Do i = i + 1 MsgBox i 'Restituisce 1, 2, 3 tot = tot + i Loop Until i > 2 'restituisce 6 MsgBox tot End Sub Codice:
Sub Prova1() Dim i , tot As Integer For i = 1 To 2 Do Until tot > 3 tot = tot + 2 MsgBox " i = " & i 'Restituisce i=1 MsgBox "tot =" & tot 'Restituisce tot=2 Loop Next i MsgBox " Totale Complessivo = " & tot 'restituisce 4 End Sub Utilizzare i punti di interruzione È possibile inserire uno o più punti di interruzione su qualsiasi riga del codice, che permette di fermare temporaneamente l’esecuzione della macro in quel punto. A questo punto la macro è in modalità interruzione e consente di vedere il valore corrente delle variabili spostando il cursore del mouse su di loro. Un punto di interruzione può essere posizionato su qualsiasi riga del codice, ma non sulle righe che definiscono le variabili o nella sezione generale delle dichiarazioni. I punti di interruzione sono generalmente fissati a una riga di codice specifico in cui si immagina un errore e che vengono eliminati quando sono stati risolti gli errori. Fig. 2 Aggiungere o Cancellare un punto di interruzione Per aggiungere un punto di interruzione, si deve operare in questo modo: • Cliccare sul bordo sinistro della riga di codice in cui si desidera inserirlo • Cliccare sulla riga e premere F9 • Dal menu Debug – Imposta/rimuovi punto di interruzione Per cancellare un punto di interruzione, si deve ripetere l’operazione appena descritta, mentre se sono presenti vari punti di interruzione per rimuoverli tutti si deve premere Ctrl + Maiusc + F9 oppure dal menu Debug - Rimuovi punti di interruzione. Utilizzo della modalità Interruzione o Pausa La macro và in modalità interruzione quando si interrompe l'esecuzione del codice e si mette in pausa temporaneamente, oppure quando • Si incontra un punto di interruzione • Premendo i tasti Ctrl + Pausa durante l'esecuzione del codice • Se si incontra una istruzione Stop nel codice • Al verificarsi di un errore di sintassi o di un errore Run-Time. Interrompendo questa modalità è possibile visualizzare lo stato corrente della macro e controllare il valore delle variabili portando il cursore del mouse sulla variabile stessa. Una volta che il codice è in modalità interruzione, è possibile scegliere di continuare con l'esecuzione premendo il tasto F5, oppure cliccando su Ripristina dal menu Esegui. Al verificarsi di un errore, è possibile correggere l'errore e scegliere di continuare, oppure terminare l'esecuzione del codice e riavviare la macro. Esecuzione Passo - Passo del codice Per attivarla si deve fare clic su Esegui istruzione dal menu Debug o premere F8. In fase di progettazione, all'interno di una procedura, l'esecuzione del codice parte dall'inizio della macro ed entra in modalità pausa prima di eseguire la prima riga di codice. Questo è un modo per entrare in modalità pausa passando attraverso il codice che verrà eseguito una riga alla volta per poi passare alla riga successiva. Finestra Immediata Si può visualizzare la Finestra Immediata dal menu Visualizza oppure premere i tasti Ctrl + G. La finestra Immediata è una zona di debug primaria, ed è utilizzato per: • Visualizzare i risultati delle istruzioni della macro • Digitare un'istruzione o una riga di codice direttamente nella finestra e premere Invio per eseguirlo • Modificare il valore di una variabile durante l'esecuzione di una macro Quando la macro è in modalità di pausa, è possibile assegnare un nuovo valore alla variabile nella finestra Immediata come si farebbe nella macro stessa, inoltre nella finestra Immediata è possibile valutare le dichiarazioni VBA o le espressioni che possono essere correlate o meno alla macro. Quando la macro è in modalità di interruzione, una dichiarazione VBA nella finestra immediata viene eseguita nel contesto di tale macro, per esempio se si digita MsgBox i, dove i è il nome di una variabile utilizzata nella macro, nella finestra Immediata, si otterrà il valore corrente della variabile i come se il comando fosse stato utilizzato all'interno della macro in esecuzione. Per restituire un valore, si deve precedere l'espressione con un punto interrogativo, per esempio, se digitiamo un’espressione come ? 100/2, viene riportato il valore della divisione dei due numeri, come è possibile vedere nell’immagine sotto riportata Fig. 3 Per visualizzare il valore di una varibile nella finestra Immediata è possibile usare il comando Debug.Print che permette di vedere lo stato delle variabili e le decisioni che il nostro programma prende, in quanto con l'aggiunta di questa dichiarazione vengono stampate informazioni utili a correggere i nostri programmi nella finestra immediata. La sintassi è la seguente: Debug.Print Expression Ad esempio, se nel foglio di Excel nella cella A1 abbiamo il testo “Prova debug.print” e ci posizioniamo su quella cella possiamo conoscerne il contenuto scrivendo nella finestra immediata il comando ?activecell.Value che riporterà: Fig. 4 Questo comando può essere usato in abbinamento alla punteggiatura in questo modo: ?activecell.Value, se inseriamo una virgola alla fine del comando, alla prossima istruzione Debug.Print il risultato viene posto sulla stessa riga usando una tabulazione predefinita, mentre se inseriamo ?activecell.Value; con un punto e virgola alla fine al prossimo comando il risultato viene inserito sulla stessa riga attaccato a quello precedente Finestra Locale Possiamo utilizzare la finestra Locale per vedere tutte le variabili dichiarate nella routine corrente e il loro tipo e valore corrente. La finestra Locale visualizzerà per le variabili locali dichiarate nella routine corrente e le variabili dichiarate nella sezione di dichiarazione moduli - il diplay è in 3 colonne: Espressione, Valore e Tipo. Si noti che la finestra Locale viene usata solo quando la macro è in modalità Pausa. Fig. 5 Il valore di una variabile locale può essere modificata nella finestra Locale facendo clic sulla colonna Valore Finestra Espressioni di controllo Tramite questa finestra è possibile monitorare i valori delle variabili in modalità di interruzione, mentre la finestra Locale automaticamente tiene traccia di tutte le variabili dichiarate nella routine corrente, nella finestra di controllo è necessario specificare le variabili che si desidera tenere traccia. Nella finestra di controllo, indipendentemente da quella attuale, è possibile monitorare i valori delle variabili attraverso moduli e procedure. È possibile aggiungere manualmente le variabili e persino le espressioni alla finestra di controllo, quando è in modalità di interruzione. Per aggiungere una variabile alla finestra di controllo, si deve cliccare col destro del mouse sulla variabile e selezionare Aggiungi Espressione di Controllo dal menu del tasto destro del mouse, oppure posizionare il cursore sulla variabile e selezionare Aggiungi Espressione di Controllo dal menu Debug, e in entrambi i casi, verrà visualizzata una finestra di dialogo in cui compare il campo Espressione e verrà visualizzato il nome della variabile. Fig. 6 Per modificare o eliminare il controllo, si deve selezionare la variabile nella finestra di controllo, fare clic col destro del mouse e selezionare Elimina Espressione di controllo
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
12-04-2015, 23.56.26 | #74 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Lavorare con stringhe di testo in Excel VBA Un tipo di variabile che abbiamo toccato marginalmente in questo corso è il tipo String che come suggerisce il suo nome, viene utilizzato per contenere le stringhe di testo. Questo tipo di variabile viene utilizzata moltissimo, quindi vale la pena di approfondire questo argomento. Per impostare una variabile per contenere il testo è sufficiente usare la parola chiave Dim seguita dal nome della variabile e dalla notazione As String in questo modo: Dim MyString As String, mentre per memorizzare il testo all'interno della variabile è necessario circondarlo con virgolette doppie così: MyString = "Testo" Si tenga presente che anche se si inseriscono dei numeri racchiusi dalle virgolette vengono trattati come testo e non come numeri: MyString = "25", in questo modo viene assegnato il valore 25 come testo, e non memorizza nella variabile il numero 25. È inoltre possibile inserire il testo in una cella del foglio di calcolo in questo modo: Codice:
Dim MyString As String MyString = "Testo" ActiveCell.Value = MyString Codice:
Dim MyString As String MyString = ActiveCell.Value Nota: Alcune funzioni elencate in questo articolo sono già state trattate in questo corso, vengono riprese in questo contesto per mostrarne l’uso con altre funzioni VBA Le funzioni LCase e UCase Le funzioni Ucase e Lcase vengono utilizzate per modificare le lettere in caratteri minuscoli o maiuscoli, dove Ucase converte tutti i caratteri in lettere maiuscole, mentre Lcase converte in lettere minuscole. Vediamo come funzionano con un esempio pratico, creiamo una nuova cartella di lavoro vuota e inseriamo alcune voci nelle celle A1, B1 e C1 come si vede in figura, e inseriamo un nome nella cella A2 Fig. 1 A questo punto entriamo nell’editor VBA e inseriamo una routine in un Modulo e scriviamo del codice per leggere il valore presente nella cella A2 come il seguente Codice:
Sub Prova1 () Dim Nome As String Nome = Range ("A2"). Value End Sub Qualunque cosa si sta cercando di convertire va posto tra le parentesi tonde della funzione LCase e il testo che si sta tentando di convertire può essere immesso direttamente, circondato da virgolette, o in una variabile che contiene una stringa di testo. Se vogliamo inserire il testo presente nella cella A2 convertito nella cella B2, tutto quello che dobbiamo fare è scrivere un codice come il seguente: Range ("A2"). Offset (, 1) .Value = LCase (Nome) Con Range ("A2"). Offset (, 1) ci si sposta di una colonna a destra della cella A2, e poi accediamo alla proprietà Value della cella stessa e a destra del segno di uguale inseriamo la funzione LCase col nome della variabile che conterrà il testo da convertire e il codice sarà simile a questo Codice:
Sub Prova1 () Dim Nome As String Nome = Range ("A2"). Value Range("A2").Offset(, 1).Value = LCase(Nome) End Sub Fig. 2 Al tempo stesso se vogliamo convertire il nome in maiuscolo il codice è molto simile, basta solo cambiare il nome della funzione in questo modo: Range("A2").Offset(, 2).Value = UCase(Nome) Se guardiamo questa nuova riga di codice, notiamo che sono cambiate solo due cose, il valore di Offset, in quanto abbiamo un 2 invece di 1, questo perché ci si sposta di due colonne a destra della cella A2 e la funzione che converte in maiuscolo è UCase. Se si aggiunge questa la linea al codice e si manda in esecuzione la routine si ottiene Fig. 3 Così ora abbiamo trasformato il valore della cella A2 a caratteri minuscoli e maiuscoli. Si noti che il nome in A2, Nelson Mandela, è scritto con la prima lettera maiuscola, in gergo si capitalizza la prima lettera di ogni parola. Excel dispone della funzione di conversione, e usando VBA possiamo usare la funzione chiamata Proper che permette la capitalizzazione di una stringa utilizzando il seguente codice: Codice:
Dim Nome As String Nome = "nelson mandela" Range ("A2"). Offset (, 3) .Value = Application.WorksheetFunction.Proper (Nome) Il codice che converte la prima lettera in maiuscolo è: Application.WorksheetFunction.Proper (Nome) Si consideri che Application è un oggetto di livello superiore, ovvero l'intero Excel, mentre WorksheetFunction viene utilizzato per accedere alla funzione di Excel, mentre tra le parentesi tonde di Proper, si digita la variabile che si sta tentando di convertire. Così come la digitazione di un nome di variabile, è possibile digitare il testo direttamente circondato da virgolette. Le funzioni Trim e Len La funzione Trim viene utilizzata per tagliare lo spazio bianco indesiderato nel testo, quindi, se si ha la seguente stringa: " Un testo" usando Trim si eliminerebbero gli spazi e rimane "Un testo", mentre invece la funzione Len viene utilizzata per ottenere il numero di caratteri di una stringa. Se si inserisce il codice seguente in una routine: Codice:
Dim Nome As String Dim LNome As Integer Nome = " Nelson Mandela " LNome = Len (Nome) MsgBox LNome In questa riga di codice stiamo utilizzando la funzione Len e tra le parentesi tonde abbiamo la variabile Nome. La funzione Len conterà quanti caratteri sono presenti nel testo che abbiamo memorizzato all'interno della variabile Nome. Quando VBA ha eseguito questo calcolo lo memorizza nella variabile denominata LNome. Poiché la funzione Len conta i caratteri, il valore restituito sarà un numero intero. Una volta eseguito il codice verrà mostrato in una finestra il numero 18, tuttavia, il nome Nelson Mandela è lungo 14 caratteri, la finestra di messaggio visualizza 18 perché ha contato gli spazi extra all'inizio e alla fine della stringa. Per rimuovere lo spazio, si deve utilizzare la funzione Trim in questo modo: Nome = Trim (" Nelson Mandela ") Il testo o la variabile che si sta cercando di tagliare va tra le parentesi tonde alla destra della funzione e VBA quindi rimuovere qualsiasi spazio bianco dalla parte anteriore e dalla fine della stringa. Se si esegue di nuovo il codice la finestra di messaggio visualizza il valore di 14. La funzione Space A volte si rende necessario inserire uno spazio vuoto prima o dopo una stringa, per fare questo si usa la funzione space inserendo il numero di spazi tra le parentesi tonde. Ecco un codice per illustrare la funzione: Codice:
Dim Nome As String Nome = "Nelson Mandela" MsgBox Len(Nome) Nome = Space(5) & Nome MsgBox Len(Nome) Questa ci dice: "Prendi tutto ciò che è presente nella variabile denominata Nome e aggiungi 5 spazi."(Il simbolo & viene utilizzato per concatenare) e una volta che VBA ha concatenato il testo e lo spazio, si deve memorizzare da qualche parte, e il luogo in cui sarà memorizzato è alla sinistra del segno uguale. A sinistra del segno di uguale, abbiamo di nuovo la variabile Nome, pertanto qualunque sia stato il valore in precedenza della variabile sarà sostituito dal valore dalla destra del segno di uguale. La Funzione Replace Abbiamo già visto che la funzione Replace permette di sostituire il testo in una stringa con qualcos'altro. Supponiamo, per esempio, di avere una parola errata nella cella A5. È possibile utilizzare replace per modificare le lettere non corrette con quelle corrette. È possibile utilizzare il foglio di lavoro per provarlo, aggiungendo due voci nelle celle A4 e B4 e digitare il titolo Originale nella cella A4 e la voce Sostituisci nella cella B4. Ora se inseriamo all'interno della cella A5 la parola errata Micrasaft, il foglio di calcolo dovrebbe apparire così: Fig. 5 Per utilizzare la funzione Replace, sono necessari almeno tre argomenti tra la parentesi tonde: Replace( string_to_search, string_to_replace, replace_with ) La prima cosa che serve è una stringa di testo da ricercare, poi si specifica il carattere o i caratteri che si vuole sostituire e infino il nuovo personaggio o personaggi. Con la funzione Replace si hanno anche tre optional che è possibile specificare. Queste sono: start, count, compare. I parametri opzionali vanno dopo il terzo elemento in sostituzione, con ciascuno dei quali è separato da una virgola: Replace( string_to_search, string_to_replace, replace_with, start, count, compare ) Il parametro Start rappresenta il carattere della stringa in cui si desidera avviare la ricerca, il valore di default è il carattere 1, che è il primo carattere della stringa. Se si vuole iniziare da una posizione nella stringa diverso dal primo carattere, quindi è necessario digitare il numero di partenza. Il parametro count è il numero di occorrenze da sostituire, il default è di sostituire ogni occorrenza presente in replace_with . Se si desidera solo per sostituire, le prime due ricorrenze quindi si digita il numero 2. Il parametro compare ha tre opzioni: vbBinaryCompare, vbTextCompare, vbDatabaseCompare, ma non preoccupatevi di confrontare, in quanto viene utilizzato raramente. A titolo di esempio, aggiungiamo una nuova routine con il seguente codice Codice:
Dim OTesto As String Dim CTesto As String OTesto = Range("A5").Value CTesto = Replace(OTesto, "a", "o") Range("A5").Offset(, 1).Value = CTesto Fig. 6 È possibile sostituire più di un carattere, se è necessario. Il seguente codice sostituisce l'errata Microsft con Microsoft: Ctesto = Replace(Otesto, "sft", "soft") È possibile sostituire spazi nel testo digitando due virgolette. La prima serie di virgolette avrà uno spazio tra loro, mentre la seconda serie non ha spazio. Ad esempio: Ctesto = Replace("M i c r o s o f t ", " ", "") Questa volta, la parola Microsoft ha uno spazio dopo ogni lettera, se vogliamo rimuovere gli spazi, il secondo parametro della funzione Replace è di due virgolette con uno spazio tra di loro, mentre il terzo parametro è di due virgolette senza spazio tra loro. Due doppi apici insieme significano "nessun carattere". Le Funzioni InStr, InStrRev, StrReverse InStr è l'abbreviazione di inString, e questa funzione stringa viene utilizzata per la ricerca di una stringa all'interno di un'altra. Necessita di almeno due elementi tra le parentesi tonde della funzione InStr: il testo da cercare, e ciò che si desidera trovare. VBA poi vi darà un intero in cambio. Questo numero sarà 0 se la stringa non viene trovata, mentre se la stringa viene trovata, allora si ottiene la posizione di inizio della stringa di ricerca. Ecco un esempio per provare: Codice:
Dim Email As String Dim Posizione As Integer Email = "mia_email@prova.com" Posizione = InStr(Email, "@") MsgBox Posizione La prima voce tra le parentesi tonde è la variabile email, mentre il secondo elemento è quello che vogliamo cercare, cioè la chiocciolina dell'indirizzo di posta elettronica. Se il simbolo @ non è nella variabile Email, VBA colloca uno 0 nella variabile Posizione. Quando si esegue il codice verrà visualizzato una finestra di messaggio con il numero 10, in quanto il simbolo @ è il decimo carattere della stringa indirizzo email. Ora se NON inseriamo il simbolo @ nella stringa della E-mail: Email = "mia_emailprova.com" Eseguendo il codice la finestra di messaggio visualizza il valore 0, è possibile utilizzare questo risultato per un test di base sugli indirizzi di posta elettronica con questo codice: Codice:
Dim Email As String Dim Posizione As Integer Email = "mia_emailprova.com" Posizione = InStr(Email, "@") If Posizione = 0 Then MsgBox "Non hai inserito un indirizzo email valido" Else MsgBox "Indirizzo email valido" End If Se si omette il numero di partenza, la funzione InStr cerca dall'inizio della stringa, mentre se si digita un numero per la partenza InStr inizia la ricerca da quel numero di carattere nella stringa. Il parametro compare ha quattro opzioni: • vbUseCompareOption • vbBinaryCompare • vbTextCompare • vbDatabaseCompare Questi parametri vengono utilizzati raramente. Simile a Instr c’è la funzione InStrRev, che sarebbe l’acronimo di Reverse, infatti questa funzione è la stessa di InStr con la sola differenza che InStrRev inizia la ricerca dalla fine della stringa invece che all'inizio. La funzione StrReverse Questa funzione è abbastanza facile da usare, come suggerisce il suo nome StrReverse inverte le lettere in una stringa di testo. Ecco un po’ di codice per provare: Codice:
Dim Otesto As String Dim Rtesto As String Otesto = "Inserisci una frase" Rtesto = StrReverse(Otesto) MsgBox (Rtesto) Le Funzioni Left e Right Le funzioni Left e Right vengono utilizzate per tagliare i caratteri da una stringa. Si utilizzare Left per tagliare i caratteri dall'inizio della stringa, e Right per tagliare i caratteri a partire dalla fine della stringa. Tra le parentesi tonde di sinistra e destra della funzione si digita il numero di caratteri che si desidera tagliare. Qualche esempio può chiarire le cose. Codice:
Dim Email As String Email = "mia_email@prova.com" MsgBox Left(Email, 9) MsgBox Right(Email, 9) Quando si esegue il codice vedrete che la finestra di messaggio visualizza i primi 9 caratteri dell'indirizzo e-mail, partendo dalla sinistra del simbolo @. La quarta linea è questa: MsgBox Right(Email, 9) La funzione di destra visualizza 9 caratteri a partire dal carattere finale dell'indirizzo e-mail. Questo è un esempio abbastanza semplice, adesso per un uso più complesso di Left e Right, supponiamo di avere un nome completo nella cella A1 in questo formato: Nelson Mandela, tuttavia, si supponga di voler avere il cognome prima del nome in questo modo: Mandela Nelson È possibile utilizzare le funzioni Left, Right e InStr per raggiungere questo obiettivo. Creiamo una nuova routine e impostiamo quattro variabili, in questo modo: Codice:
Dim NomeC As String Dim PNome As String Dim SNome As String Dim PosSpc As Integer Per ottenere solo il primo nome si può cominciare all'inizio del nome completo e andare fino alla posizione dello spazio (PosSpc) e togliere 1: PNome = Left(NomeC, PosSpc - 1) Il motivo per cui è necessario detrarre 1 dalla variabile PosSpc è perché la funzione InStr restituisce la posizione dello spazio, un valore di 7 per il nostro nome, mentre invece il carattere finale del nome, è di 1 in meno di questo valore, infatti Nelson ha solo 6 caratteri. Per ottenere il cognome, abbiamo bisogno di qualcosa di leggermente diverso. La posizione di partenza è la lunghezza del nome completo meno la lunghezza del nome, con questa operazione si otterrà il numero di caratteri partendo dalla destra del nome. Il codice è questo: SNome = Right(NomeC, Len(NomeC) - Len(PNome)). Così come il parametro finale di destra abbiamo questo codice: Len(NomeC) - Len(PNome) Questo utilizza la funzione Len per ottenere la lunghezza delle variabili NomeC e PNome, infine, si visualizzano i risultati in una finestra di messaggio: MsgBox (SNome & ", " & PNome) Ora abbiamo la variabile SNome e PNome separate dal simbolo di concatenazione (&), ma abbiamo anche bisogno di una virgola, e dobbiamo inserirla tra virgolette in modo che VBA lo vede come testo. Quindi stiamo dicendo, di inserire il cognome, poi una virgola, quindi il Nome. Inoltre si potrebbe anche aggiungere una funzione Trim per i nomi, per sbarazzarsi di qualsiasi spazio bianco. Come questo: MsgBox (Trim(SNome) & ", " & Trim(PNome)) Ma non è necessario per questo piccolo esempio, comunque si tenga presente anche questo aspetto nell’utilizzo futuro di queste funzioni. L'intero codice, quindi, dovrebbe essere simile a questo: Codice:
Sub Prova2() Dim NomeC As String Dim PNome As String Dim SNome As String Dim PosSpc As Integer NomeC = "Nelson Mandela" PosSpc = InStr(NomeC, " ") PNome = Left(NomeC, PosSpc - 1) SNome = Right(NomeC, Len(NomeC) - Len(PNome)) MsgBox (SNome & ", " & PNome) End Sub Fig. 7 NOTA: Il codice precedente funziona solo per i nomi che hanno due parti, se il nome è composto da 3 parti si deve usare un’altra funzione (Split) La Funzione Mid Questa funzione viene utilizzata per catturare i caratteri di una stringa di testo. Ha tre parti: Mid(string_to_search, start_position, number_of_characters_to_grab) La prima parte è la stringa che si desidera cercare e può essere un testo, una variabile oppure il testo diretto tra virgolette. La seconda parte è dove iniziare la ricerca della stringa e la parte finale è il numero di caratteri che si desidera catturare. Per dimostrare la funzione Mid, esaminare il seguente codice: Codice:
Dim Email As String Dim Pcar As String Email = "mia_emailprova.com" Pcar = Mid(Email, 15, 4) MsgBox Pcar Il testo che stiamo cercando è nella variabile Email variabile e vogliamo iniziare a catturare i caratteri dalla posizione 15 della stringa e Il numero di caratteri che vogliamo prendere è 4. Quando viene eseguito il programma, nella finestra di messaggio verrà visualizzato .com. La funzione Mid è molto utile in un Loop, in quanto permette di esaminare un carattere alla volta da una stringa di testo. Esercizio con il Metodo String Per ottenere una certa dimestichezza con i metodi String, vediamo un altro esercizio. Supponete di avere un codice prodotto su un foglio di calcolo che si presentava così: PD-23-23-45, tuttavia, è nel formato sbagliato. Per ottenere il codice giusto si devono rimuovere tutti i trattini, e poi si devono sostituire le lettere PD nel codice del prodotto con PDC, in modo che il codice si presenti simile a questo: PDC232345 La prima parte del problema è la rimozione dei trattini, abbastanza facile, basta usare Replace: Codice:
Dim Pcode As String Pcode = "PD-23-2345" Pcode = Replace(Pcode, "-", "") La seconda parte del problema, si deve aggiungere la "C" dopo "PD", sarebbe facile, se VBA aveva una funzione di inserimento, ma non è così e questo rende il problema un po’ più difficile. Ci sono alcuni modi per inserire la "C" nel posto giusto, noi lo faremo utilizzando le funzioni di stringa Left e Mid. Useremo Left per prendere i primi due caratteri, quindi aggiungeremo la "C", poi usiamo la funzione Mid per ottenere i numeri. Per ottenere i primi due caratteri e aggiungere la "C", il codice è questo: Codice:
Dim Ncar As String Ncar = Left(Pcode, 2) & "C" Codice:
Dim Num As String Num = Mid(Pcode, 3) Codice:
Dim NewCar As String NewCar = Ncar & Num MsgBox NewCar Codice:
Sub Prova3() Dim Pcode As String Dim Ncar As String Dim Num As String Dim NewCar As String Pcode = "PD-23-2345" Pcode = Replace(Pcode, "-", "") Ncar = Left(Pcode, 2) & "C" Num = Mid(Pcode, 3) NewCar = Ncar & Num MsgBox NewCar End Sub
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
12-04-2015, 23.59.36 | #75 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Efficienza e prestazioni in VBA Assieme ai prodotti Office di Microsoft viene distribuito un linguaggio di programmazione, denominato Visual Basic for Application (VBA) ed è utilizzato principalmente per automatizzare le attività, per risparmiare tempo e gestire i dati in modo più efficiente. Usare VBA può causare, a volte, dei rallentamenti all’applicazione principalmente imputabili allo stile di programmazione, infatti è facile cadere in cattive abitudini di programmazione quando si lavora in questo ambiente, sia che si elaborano piccole o ingenti quantità di dati, o che determinate macro vengano richiamate in maniera ricorrente, pertanto è molto importante scrivere un codice snello ed efficiente in modo da ottimizzare le attività riducendone i tempi di esecuzione e migliorando le prestazioni. Ci sono diversi modi per ottenere ottimi risultati con VBA, lo scopo di questo articolo è quello di illustrare delle semplici regole che indicheranno come migliorare l'efficienza delle cartelle di lavoro, in quanto possono avere un forte impatto sulle prestazioni delle macro. 1. Disattivare il calcolo automatico del foglio di lavoro Questa regola è nota a molti ed è quella più importante. Quando un nuovo valore viene immesso in una cella del foglio di lavoro, Excel ricalcolerà tutte le celle che fanno riferimento al foglio e se la macro sta scrivendo dei valori nel foglio di lavoro, sarà necessario attendere che venga ricalcolata ogni voce prima di riprenderne il controllo. L'impatto di lasciare il calcolo automatico attivato nel programma può essere una scelta inopportuna e si consiglia vivamente di disattivarlo utilizzando il seguente comando all'inizio della macro. Application.Calculation = xlCalculationManual Se è necessario ricalcolare i valori del foglio di calcolo, mentre la macro è in esecuzione è possibile utilizzare uno dei comandi di seguito descritti, dove il primo ricalcola solo un foglio specifico e il secondo ricalcola solo un intervallo specifico. Codice:
Worksheets ("Foglio1").Calculate Range ("A1:A25").Calculate Application.Calculation = xlCalculationAutomatic. 2. Disattivare gli aggiornamenti dello schermo Ogni volta che VBA scrive i dati nel foglio viene aggiornata l'immagine sullo schermo, e questo costituisce un notevole freno alle performance dell’applicazione, per cui è opportuno disattivare questa operazione utilizzando il seguente comando. Application.ScreenUpdating = FALSE Al termine dell'utilizzo della macro è possibile attivare gli aggiornamenti dello schermo con il seguente comando Application.ScreenUpdating = TRUE 3. Lettura e scrittura di dati in una singola operazione E’ fondamentale ridurre al minimo il traffico tra VBA e Excel, specialmente quando è possibile leggere e scrivere dati in blocchi. Ci sono diversi metodi per ottenere questo risultato, un esempio di lettura in un blocco di dati può essere quello di lettura in una matrice. Questo esempio è circa 50 volte più veloce in lettura in ciascuna cella rispetto ad usare un ciclo. Codice:
Dim myArray() As Variant myArray= Worksheets("Foglio1").Range("A1:S500").value Codice:
Worksheets("Foglio1").Range("A1:S500").value = myArray Codice:
With Worksheets("Foglio1") .Range("A1:S500").Value = myArray End With Codice:
Dim intervallo As Range Set intervallo = Range("A1:S500") intervallo.value = myArray E’ meglio evitare di dichiarare una variabile numerica come Variant se non strettamente necessario. Si noti che se si sceglie di utilizzare "Option Explicit" all'inizio della macro qualsiasi variabile indefinita sarà di tipo Variant. Le Variant sono molto flessibili perché possono essere numerico o testo, ma sono lente per l’elaborazione in una formula. Idealmente, è meglio utilizzare variabili Integer o Boolean ove possibile 5: Evitare l'uso eccessivo di funzioni di Excel nel codice A volte si dà per scontato che funzioni native di Excel sarebbero state efficacemente trattate anche da VBA, ma non è sempre così. Ad esempio, sappiamo che VBA non ha una funzione Max () o Min () e molti utenti utilizzano la funzione di Excel tramite il codice Codice:
variabile = Application.Max(Value1, Value2) Codice:
Function Max2 (Value1, Value2) If Value1 > Value2 Then Max2 = Value1 Else Max2 = Value2 End If End Function 6: Evitare la valutazione Strings Le variabili Strings (testo) sono lenti da valutare, si consiglia di evitare di valutare stringhe in codice come questo: Codice:
Select Case Sesso Case "Maschio" …… codice Caso "Femmina" ….. codice End Select Codice:
Public num numSesso maschio = 0 Femmina = 1 End num Dim Sesso As numSesso Select Case Sesso Case Maschio ... codice Case Femmina ... codice End Select Codice:
If bMaschio Then ... codice ElseIf bFemmina Then ... codice End If In genere non è necessario utilizzare il comando Select per leggere o scrivere su un foglio di lavoro, non selezionando il foglio si velocizza la procedure di circa 30 volte, evitare questo: Codice:
Worksheets ("Foglio1"). Select variabile = Cells (1, 1) Codice:
variabile = Worksheets ("Foglio1"). Cells (1,1) Le funzioni di Copia e Incolla (o PasteSpecial) sono lente, si velocizza di circa 25 volte il processo utilizzare il seguente metodo per copiare e incollare valori. Range("A1:K100").value = Range("A101:K200").value. Considerazioni finali Ho trovato utile scrivere una piccola macro per valutare il risparmio di tempo con i vari metodi. La macro esegue semplicemente una funzione un milione di volte e registra il tempo trascorso eseguendo tale metodo. La macro semplice sotto confronta la funzione di Excel Max () per la funzione Max2 indicato nella Regola # 5. Codice:
'**Valutazione prima funzione Start_time = Now For i = 1 To 1000000 value1 = Application.Max(amt1, amt2) Next i End_time = Now Worksheets("sheet1").Cells(1, 2) = End_Time — Start_Time '**Valutazione seconda funzione Start_time = Now For i = 1 To 1000000 value1 = Max2(amt1, amt2) Next i End_time = Now Worksheets("sheet1").Cells(2, 2) = End_Time — Start_Time
___________________________________
- 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) | |
Strumenti discussione | |
|
|
Discussioni simili | ||||
Discussione | Autore discussione | Forum | Risposte | Ultimo messaggio |
riserca del corso | rene' | Software applicativo | 1 | 04-04-2008 10.30.22 |
Formare Gruppo di Studio a Napoli | Scognamiglio | Windows 7/Vista/XP/ 2003 | 0 | 14-02-2008 20.46.49 |
Corso su DVD di Tedesco | Downloader | Chiacchiere in libertà | 17 | 26-01-2007 08.46.21 |
Win XP e corso di inglese che non va più | Raboso | Windows 7/Vista/XP/ 2003 | 8 | 11-11-2005 10.16.04 |
svendo corso Cisco | alxdvc | Internet e Reti locali | 0 | 27-01-2005 12.03.45 |