Telefonino.net network
 
| 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 » |

Torna indietro   WinTricks Forum > WinTricks > Guide

Notices

Rispondi
 
Strumenti discussione
Vecchio 02-11-2014, 20.31.43   #61
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
Alexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tutti
#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:
  • VBA, come tutti i linguaggi di programmazione, ha una propria sintassi e non tollera errori, uno spazio omesso o fuori luogo, un punto invece di una virgola e verrà rimandato un errore.
  • Il codice che viene prodotto è immagazzinato nel file dell’applicazione che è stata utilizzata per lo sviluppo e non in un file separato, questo spiega anche il fatto che non è possibile effettuare un programma eseguibile indipendente con VBA, in quanto il codice sviluppato sarà eseguito attraverso il programma host utilizzato (Excel, Word etc.) per la sua scrittura.
  • Da un codice in Excel è possibile gestire altri documenti della Suite Office, come Word o presentazioni PowerPoint
Si deve tener presente che VBA è organizzato in un modello gerarchico di elementi (tipo le matriosche) ed è un contenitore per oggetti che possiamo manipolare tramite le loro proprietà (es. il colore), i metodi (es. aggiunta di un elemento) ed eventi (es. risposta a un clic del mouse) pertanto possiamo considerare Il Visual Basic for Application lo strumento ideale per la creazione di veri e propri applicativi di Office Automation.



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 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
  • Disattiva tutte le macro senza notifica se ne consiglia l’uso quando le macro non sono considerate attendibili e tutte le macro nei documenti e gli avvisi di protezione per le macro verranno disattivati;
  • Disattiva tutte le macro con notifica Questa opzione disattiva le macro, ma viene mostrato un avviso qualora siano presenti delle macro nel file che si va ad aprire. In questo modo è possibile scegliere se attivarle o meno
  • Disattiva tutte le macro tranne quelle con firma digitale. Questa opzione è uguale alla precedente, con la differenza che la macro può essere eseguita se è firmata da un editore attendibile che è già stato considerato tale. In caso contrario, si riceverà una notifica e sarà possibile scegliere se attivare le singole macro firmate o considerare attendibile l’editore. Tutte le macro senza firma vengono disattivate senza notifica;
  • Attiva tutte le macro. Con questa impostazione tutte le macro vengono eseguite senza mostrare nessun avviso. È un’impostazione pericolosa e si sconsiglia di adottarla.
Si consiglia di selezionare l’opzione Disattiva tutte le macro con notifica in modo che quando viene aperto un file contenente codice VBA Excel rimanda un avviso che il file che si sta per aprire contiene un progetto VBA che identifica come potenzialmente pericoloso

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 -
Alexsandra non è collegato   Rispondi citando
Vecchio 02-11-2014, 21.04.32   #62
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
Alexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tutti
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
Per inizializzare la variabile, è possibile identificare le cartelle di lavoro e i fogli di lavoro che si stanno utilizzando, vediamo con degli esempi in cui utilizzeremo l’indice della colonna racchiuso tra le parentesi
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
È possibile omettere l’indice (1) per identificare la prima cartella di lavoro se sappiamo che si fa riferimento alla cartella di lavoro di default. Pertanto, il codice precedente può essere scritto come segue:
Codice:
Sub Prova2 ()
    ‘Si riferisce alla quarta colonna
    Worksheets(2).Columns(4)
End Sub
Quando questo codice viene eseguito, Excel deve avere il secondo foglio di lavoro attivo, se così non fosse e il foglio attivo è un foglio di lavoro diverso dal secondo, si riceverà un errore:

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
Questa volta, il codice indica che ci si riferisce alla quarta colonna di qualsiasi foglio di lavoro che è attualmente attivo. E’ possibile fare riferimento a una colonna utilizzando il suo nome, passando la sua lettera o combinazione di lettere come una stringa tra le parentesi del metodo Columns in questo modo:
Codice:
Sub Prova2()
    ‘ Questo si riferisce alla colonna A
Columns("A")
    'Questo si riferisce alla colonna denominata DR
    Columns("DR")
End Sub
Per fare riferimento a colonne adiacenti, è possibile utilizzare il metodo Columns e nelle parentesi si digita il nome della colonna all'estrema sinistra del Range, seguito da due punti ":" e seguito dal nome della colonna situata all'estrema destra del Range. Ecco un esempio che si riferisce alle colonne nell'intervallo da D a G:
Codice:
Sub Prova2 ()
    ‘ riferito al Range delle colonne da D a G
    Columns("D:G")
End Sub
È inoltre possibile selezionare le colonne utilizzando il metodo Range e per effettuare questa operazione, si digita il nome della prima colonna, seguita da due punti, e seguito dal nome della colonna all'altra estremità
Codice:
Sub Prova2 ()
    ‘Questo si riferisce alle colonne nell'intervallo da D a H
    Range ("D: H") 
End Sub
Per fare riferimento a colonne non adiacenti, si utilizza il metodo Range e nelle sue parentesi, si digita ogni nome di una colonna, seguito da due punti e seguito con lo stesso nome di colonna, quindi separare queste combinazioni con virgole in questo modo:
Codice:
Sub Prova2()
   ‘ Questo si riferisce alle colonne H, D, e B
    Range ("H: H, D: D, B: B") 
End Sub
Selezionare colonne
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
Mentre invece per selezionare una colonna utilizzando il suo nome, si usa questo codice:
Codice:
Sub Prova2()
    ‘ Questo seleziona la colonna ADH
    Columns("ADH").Select 
End Sub
Quando viene selezionata una colonna, viene memorizzato in un oggetto chiamato Selection, ed è quindi possibile utilizzare l'oggetto per intraprendere l'azione da applicare alla colonna.
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
È possibile utilizzare questa stessa notazione per selezionare una colonna utilizzando il metodo Range, inserendo nelle parentesi il nome della colonna, seguita da due punti, e seguito dal nome della stessa colonna. Ecco un esempio:
Codice:
Sub Prova2 ()
    ‘  seleziona la Colonna G
    Range ("G: G"). Select 
End Sub
Per selezionare invece delle colonne non adiacenti, si utilizza la tecnica che abbiamo visto in precedenza per fare riferimento alle colonne, quindi si richiama il metodo Select. Ecco un esempio:
Codice:
Sub Prova2()
    ‘ seleziona le colonne B, D e H
    Range ("H: H, D: D, B: B"). Select 
End Sub
Inserire colonne
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
Per aggiungere nuove colonne, si deve specificare la loro posizione utilizzando la classe Range come abbiamo visto prima, quindi richiamare il metodo Insert della classe Columns. Ecco un esempio che crea nuove colonne nelle posizioni delle colonne B, D e H che vengono spostate verso destra per far posto a quelle nuove
Codice:
Sub Prova2 ()
     Range ("H: H, D: D, B: B"). Insert 
End Sub
Eliminare colonne
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
Per eliminare varie colonne adiacenti, si deve specificare il Range delle colonne raccolta e richiamare il metodo Delete. Ecco un esempio:
Codice:
Sub Prova2 ()
     Columns ("D: F"). Delete 
End Sub
Per eliminare più colonne non adiacenti, si utilizza la classe Range richiamando il metodo Delete. Ecco un esempio che elimina le colonne C, E, e P:
Codice:
Sub Prova2 ()
     Range ("C: C, E: E, P: P"). Delete 
End Sub
Dimensioni delle colonne
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
Per utilizzare la proprietà Adatta si deve prima selezionare la colonna e usare la selezione oggetto, accedere alla sua proprietà, quindi richiamare il metodo Adatta della proprietà della Colonna. Questo può essere fatto come segue:
Codice:
Private Sub Prova2 ()
     Selection.Columns.AutoFit 
End Sub
Per specificare la larghezza di molte colonne, si deve utilizzare la classe Range, quindi accedere alla proprietà ColumnWidth, e assegnare il valore desiderato. Ecco un esempio che imposta la larghezza delle colonne C, E e H a 5 per ciascuna colonna:
Codice:
Sub Prova2 ()
     Range ("C: C, E: E, H: H"). ColumnWidth = 5 # 
End Sub
Nascondere le colonne
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
Per nascondere una serie di colonne, si devono selezionare come abbiamo già visto, quindi assegnare il valore True (vero) alla proprietà Hidden. Si tenga presente che per rivelare le colonne nascoste si può agire anche cliccando col pulsante destro del mouse su un'intestazione di colonna e scegliere Scopri dal menu a discesa che compare, oppure dalla barra multifunzione, cliccando su Home e nella sezione celle, cliccare su Formato, posizionare il mouse su Hide & Scopri, quindi fare clic su Scopri colonne. Per visualizzare una colonna nascosta, si deve assegnare il valore False alla proprietà Hidden
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 -
Alexsandra non è collegato   Rispondi citando
Vecchio 02-11-2014, 21.06.42   #63
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
Alexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tutti
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
Come per le colonne, il codice funziona solo se il secondo foglio della cartella di lavoro corrente è attivo, se si esegue il codice mentre un foglio di lavoro diverso dal secondo è attivo, si riceverà un errore. Come già detto, è possibile fare riferimento a una riga utilizzando l’oggetto Range, passando una stringa in cui nelle parentesi, si inserisce il numero della riga, seguito da due punti, e seguito dallo stesso numero di riga. Ecco un esempio che si riferisce alla Riga 4.
Codice:
Sub Prova ()
     Range("4:4")
End Sub
Se si vuole fare riferimento alle righe più di una volta, è possibile dichiarare una variabile di tipo Range e inizializzarla utilizzando l'operatore Set e assegnare l'intervallo che si desidera. Ecco un esempio:
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
Individuazione di un gruppo di righe
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
Le righe di un gruppo si qualificano come non adiacenti se non sono posizionate una accanto all'altra e per fare riferimento alle righe non adiacenti, si deve usare l’oggetto Range e usare una stringa da inserire nelle parentesi che rappresenta il numero di ogni riga seguita da due punti, e seguita dallo stesso numero di riga. Queste combinazioni sono separate da virgole. Ecco un esempio che si riferisce alle righe 3, 5 e 8
Codice:
Sub Prova ()
     Range ("3:3, 5:5, 8:8")
End Sub
Selezione di una riga
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
Abbiamo anche visto che si potrebbe fare riferimento a una riga utilizzando l'oggetto Range, basta richiamare il metodo Select dopo l'accesso alla riga. Ecco un esempio che seleziona la riga 4
Codice:
Sub Prova ()
     Range("4:4"). Select
End Sub
Selezione di un gruppo di righe
È 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
Per selezionare righe non adiacenti, si deve fare riferimento alle tecniche viste in precedenza e richiamare il metodo Select. Ecco un esempio che seleziona le righe 3, 5 e 8
Codice:
Sub Prova ()
     Range("3:3, 5:5, 8:8"). Select
End Sub
Per selezionare tutte le righe di un foglio di lavoro, si utilizza il metodo Select abbinandolo al metodo Rows. Ecco un esempio
Codice:
Sub Prova ()
  Rows.Select
End Sub
Altezze delle righe
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
Creazione di righe
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
Per aggiungere più di una riga, sia adiacenti che non adiacenti, si devono seguire i metodi poco sopra esposti, ricordando che la nuova si verrebbe a creare al di sotto delle righe selezionate. Per aggiungere nuove righe a livello di programmazione, si deve fare riferimento alle righe interessate e richiamare il metodo Insert. Ecco un esempio che aggiungerà nuove righe nelle posizioni 3, 6, e 10
Codice:
Sub Prova ()
Range("3:3, 6:6, 10:10").Insert
End Sub
Eliminare una riga
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
Naturalmente, è possibile utilizzare anche l'oggetto Range per fare riferimento alla riga. Per cancellare più di una riga, prima si devono selezionare e seguire i percorsi sopra esposti, mentre per eliminare un gruppo di righe via codice si utilizza l’0ggetto Range in questo modo
Codice:
Sub Prova ()
     Range("3:3, 6:6, 10:10").Delete
End Sub
Per nascondere una riga si deve selezionare la riga e fare clic su Nascondi dal menu a discesa che compare, oppure seguire il percorso dalla barra multifunzione Home – Celle - Formato, quindi cliccare sulla voce Nascondi e Scopri e dal menu a discesa che appare cliccare su Nascondi righe

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
Allo stesso modo, per nascondere un gruppo di righe, prima si deve selezionare il Range, quindi usare il comando Selection.EntireRow.Hidden = True, mentre per mostrare le righe nascoste basta cambiare il valore assegnato da TRUE a FALSE
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato   Rispondi citando
Vecchio 02-11-2014, 21.08.52   #64
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
Alexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tutti
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
Per ottenere un riferimento a una cella, si dichiara una variabile di tipo Range e per inizializzare la variabile, si individua la cella e si assegna alla variabile utilizzando l'operatore Set. Ecco un esempio:
Codice:
Sub Prova1()
     Dim cella As Range
    Set cella = Workbooks.Item (1) .Worksheets.Item ("Foglio1"). Range ("D6")
End Sub
Le celle sono indicate come adiacenti quando si toccano e per fare riferimento a un gruppo di celle adiacenti, tra parentesi dell'oggetto Range, si passa una stringa che corrisponde all'indirizzo della cella che sarà sull'angolo, superiore sinistro seguito da due punti, seguito dall'indirizzo della cella posta nell'angolo inferiore destro. Ecco un esempio:
Codice:
Sub Prova1()
     Range ("B2: H6") 
End Sub
È possibile utilizzare questa stessa tecnica per fare riferimento a una cella, a tale scopo, si utilizza lo stesso indirizzo della cella da entrambi i lati dell’indirizzo. Ecco un esempio:
Codice:
Sub Prova1 ()
     Range ("D4: D4") 
End Sub
Invece di riferirsi ad un gruppo di celle adiacenti, è possibile fare riferimento a più di un gruppo di celle non adiacenti, Per fare questo, passare una stringa al Campo all'oggetto. Nella stringa, creare ogni intervallo come si vuole, ma separarli con virgole. Ecco un esempio:
Codice:
Sub Prova1 ()
    Range (" D2: B5, F8: I14 ")
End Sub
Selezione di celle
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:
  • Per selezionare una cella usando il mouse, è sufficiente cliccare su di essa
  • Per selezionare una cella utilizzando la tastiera, in quanto potrebbe essere necessario spostare lo stato attivo da una cella attiva a un'altra, premere i tasti freccia fino a selezionare la cella desiderata
  • Per selezionare una cella in base al suo nome con il mouse e la tastiera, fare clic nella casella Nome e digitare il nome o l'indirizzo della cella
  • Per selezionare la prima cella del documento utilizzando solo la tastiera, premere Ctrl + Home
Per supportare la selezione di celle, l'Intervallo oggetto è dotato di un metodo denominato Select, pertanto, per selezionare una cella in programmazione, dopo il riferimento cella, si richiama il metodo Select. Ecco un esempio:
Codice:
Sub Prova1 ()
     Range ("D6"). Select 
End Sub
Dopo aver selezionato una cella, viene memorizzato in un oggetto denominato Selection ed è possibile utilizzare questo oggetto per eseguire un'azione sulla cella che è attualmente selezionata. Invece di una sola cella, si consiglia di eseguire un'operazione comune in molte celle, il che significa che è necessario selezionarle prima. È possibile selezionare le celle basate su colonne o su file ed è possibile selezionare le celle in una determinata regione; vale a dire, le celle adiacenti, oppure celle non adiacenti

Esempio: Per selezionare tutte le celle di una colonna
  • Si deve cliccare sull'intestazione della colonna
  • Oppure digitare il nome di una cella della colonna nella casella Nome e premere Invio, quindi premere il tasto Ctrl + barra spaziatrice
  • Per selezionare tutte le celle di una serie di colonne adiacenti, si seleziona una colonna e si trascina il mouse nella direzione voluta tenendo premuto il tasto, una volta che la selezione è completa rilasciare il tasto del mouse
Fig. 4

Esempio: Per selezionare tutte le celle di una riga:
  • Si deve cliccare sull'intestazione di riga
  • Oppure digitare il nome della cella di quella riga nella casella Nome e premere Invio e poi premere Shift + barra spaziatrice
  • Per selezionare tutte le celle di una serie di righe, si seleziona la riga e si trascina il mouse nella direzione voluta tenendo premuto il tasto, una volta che la selezione è completa rilasciare il tasto del mouse

Fig. 5

Esempio: Per selezionare le celle nella stessa regione
  • Si deve cliccare su una cella e tenendo premuto il mouse sulla cella si trascina verso il basso o verso l'alto, a sinistra o a destra, fino all'ultima cella dell'intervallo
  • Se si utilizza la tastiera, si deve premere i tasti freccia fino a selezionare la cella voluta che sarà in un angolo e tenendo premuto il tasto Shift, premere i tasti freccia sinistra, destra, in alto o in basso fino a raggiungere l’angolo opposto dell’intervallo e rilasciare il tasto Shift.
Per selezionare le celle non adiacenti, si deve cliccare su una delle celle e tenendo premuto il tasto Control si selezionano le celle desiderate, una volta che la selezione è completa, rilasciare Ctrl
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
Per eseguire questa operazione utilizzando il nome di una colonna(etichetta), si deve usare quel nome come argomento. Ecco un esempio che seleziona tutte le celle della colonna ADH:
Codice:
Sub Prova1()
   ‘seleziona tutte le celle dalla colonna denominata ADH
    Columns ("ADH"). Select 
End Sub
È inoltre possibile eseguire questa operazione utilizzando l'oggetto Range e per effettuare questa operazione, si deve utilizzare il Range immettendo il nome della colonna, seguito da due punti, seguito dal nome della colonna stessa. Ecco un esempio:
Codice:
Sub Prova1()
    ‘ seleziona tutte le celle della colonna G
    Range ("G: G"). Select 
End Sub
Per selezionare a livello di programmazione tutte le celle che appartengono a un gruppo di colonne adiacenti, si deve inserire tra le parentesi della colonne il nome della prima colonna da un lato, seguito da due punti ":" e poi il nome della colonna che sarà all'altra estremità. Ecco un esempio:
Codice:
Sub Prova1()
    ‘ seleziona tutte le celle dell'intervallo dalla colonna D alla colonna G
    Columns ("D: G"). Select 
End Sub
Per selezionare le celle che appartengono a un gruppo di colonne non adiacenti, utilizzano la tecnica che abbiamo visto in precedenza per fare riferimento alle colonne non adiacenti, quindi richiamare il metodo Select. Ecco un esempio:
Codice:
Sub Prova1()
    ‘ seleziona le celle da colonne B, D e H
    Range ("H: H, D: D, B: B"). Select 
End Sub
Per selezionare a livello di programmazione tutte le celle che appartengono a una riga, accedere a una riga, quindi richiamare il metodo Select. Ecco un esempio:
Codice:
Sub Prova1()
    ‘ Seleziona tutte le celle della riga 6
     Rows (6) .Select 
End Sub
È anche possibile utilizzare l'oggetto Range, dopo l'accesso alla riga, si richiama il metodo Select. Ecco un esempio che seleziona tutte le celle della riga 4:
Codice:
Sub Prova1()
     Range ("4: 4"). Select 
End Sub
Per selezionare tutte le celle che appartengono a un intervallo di righe, si deve fare riferimento all'oggetto Range e richiamare il metodo Select. Ecco un esempio che seleziona tutte le celle che appartengono alle righe da 2 a 6:
Codice:
Sub Prova1()
     Rows ("2: 6"). Select 
End Sub
Per selezionare tutte le celle che appartengono a righe non adiacenti, si deve fare riferimento alle righe e richiamare il metodo Select. Ecco un esempio che seleziona tutte le celle appartenenti alle righe 3, 5 e 8:
Codice:
Sub Prova1()
     Range ("3: 3, 5: 5, 8: 8"). Select 
End Sub
Per selezionare a livello di programmazione le celle nella stessa regione, si inserisce l’intervallo come stringa nell'oggetto Range, quindi si richiama il metodo Select. Ecco un esempio:
Codice:
Sub Prova1 ()
     Range ("B2: H6"). Select 
End Sub
Ricordate che è possibile utilizzare la stessa tecnica per fare riferimento a una sola cella e selezionarla. Ecco un esempio:
Codice:
Sub Prova1()
    Range (" D4: D4 ").Select
End Sub
Per selezionare più di un gruppo di celle non adiacenti, si deve fare riferimento alla combinazione come abbiamo visto in precedenza e richiamare il metodo Select. Ecco un esempio:
Codice:
Sub Prova1 ()
     Range ("D2: B5, F8: I14"). Select 
End Sub
Per selezionare tutte le celle di un foglio di calcolo, è possibile richiamare il metodo Select sulle righe. Ecco un esempio:
Codice:
Sub Prova1()
     Rows.Select 
End Sub
Al posto delle righe, è possibile utilizzare le Colonne e si otterrebbe lo stesso risultato. Dopo aver selezionato un gruppo di celle, il gruppo viene memorizzato in un oggetto denominato Selection. È possibile utilizzare questo oggetto per intraprendere un'azione comune in tutte le celle che sono attualmente selezionate. Sappiamo che ognuno ha un nome fatto della combinazione del nome della colonna e il nome di una riga, se si desidera, è possibile modificare il nome di una cella, oppure è anche possibile creare un nome per un gruppo di celle.

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 -
Alexsandra non è collegato   Rispondi citando
Vecchio 03-11-2014, 18.07.02   #65
MEDEO
Newbie
 
Registrato: 21-10-2014
Messaggi: 2
MEDEO promette bene
Rif: Corso VBA

Grazie di cuore per questa bellissima lezione continua cosi
MEDEO non è collegato   Rispondi citando
Vecchio 04-11-2014, 18.51.08   #66
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
Alexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tutti
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
  • Output: verrà creato il file e pronto a ricevere i valori (normali)
  • Binary: verrà creato il file e pronto a ricevere i valori in formato binario (come combinazioni di 1 e 0)
  • Append: Se il file esiste già, verrà aperto e nuovi valori possono essere aggiunti alla fine
Ecco un esempio di creazione di un file:
Codice:
Sub apri ()
    Open "Prova.txt" For Output As #1  
End Sub
Il tipo di accesso al file è facoltativo, questo argomento specifica quali tipi di azioni saranno eseguite sul file, come ad esempio la scrittura dei valori o solo la lettura dei valori esistenti. Questo fattore può avere uno dei seguenti valori:
  • Scrittura: Dopo che è stato creato un nuovo file, verranno scritti i nuovi valori
  • Lettura e Scrittura: Quando un nuovo file è stato creato o un file esistente è stato aperto, i valori possono essere letti o scritti
Se si decide di specificare il tipo di accesso, si deve precedere il suo valore con la parola chiave Access mentre il fattore di Lock (Blocco) è facoltativo, e indica come il processore dovrebbe comportarsi mentre si utilizza il file. I suoi possibili valori sono:
  • Shared (In comune): Altre applicazioni (effettivamente richiamati dal processo) possono accedere al file mentre l'applicazione corrente lo sta utilizzando
  • Blocca Scrittura: Non lasciare che altre applicazioni (processi) possano accedere a questo file, mentre l'applicazione corrente (processo) sta scrivendo su di esso
  • Blocca Lettura e Scrittura: Non permettere ad altre applicazioni (processi) di accedere a questo file, mentre l'applicazione corrente (processo) lo sta utilizzando
Sul lato destro dell’espressione #, si deve digitare un numero, per l’argomento filenumber, compreso tra 1 e 511 e se si lavora su un file solo, si consiglia di utilizzare il numero 1, mentre se si sta lavorando su più file, è necessario utilizzare un numero incrementale. Se non si è riuscito a tenere traccia del numero o esiste la possibilità di confondersi, per conoscere il numero successivo è possibile utilizzare, la funzione FreeFile (), che restituisce il numero successivo disponibile nella sequenza. L’argomento reclength è facoltativo, se il file è stato aperto, questo fattore specifica la lunghezza del record che è stato letto.


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
Scrittura in un file
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:
  • Se si desidera assegnare un valore con spazi vuoti, utilizzare la funzione Spc () e passare un numero intero, tra parentesi che rappresenta il numero di spazi vuoti. Per esempio Spc (4) includerebbe 4 spazi vuoti. Questo argomento è facoltativo, il che significa che è possibile ometterlo
  • Invece di un determinato numero di spazi vuoti, è possibile lasciare che il sistema operativo si occupi di questa operazione e per fare questo, si deve richiamare la funzione Tab () come parte del fattore di outputlist. La funzione Tab () specifica il numero di colonne da includere prima del valore e può essere utile se si desidera l'allineamento dei valori che si scriveranno nel file. Questo argomento è facoltativo, il che significa che è possibile ometterlo
  • Per scrivere una stringa deve essere racchiusa tra virgolette
  • Per scrivere un numero, sia un numero intero, o decimale, è sufficiente inserire il numero normalmente
  • Per scrivere un valore booleano, si deve inserire come True o False
  • Per scrivere un valore di data o ora, si deve digitarlo tra # e # e seguire le regole di data o ore della lingua del sistema operativo installato
  • Per scrivere un valore nullo, digitare Null
Ecco un esempio di scrittura di alcuni valori:
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
Invece di scrivere un valore per riga, è possibile scrivere più di un valore con una sola dichiarazione. Per fare questo, si deve separarli con un punto e virgola o uno spazio vuoto. Ecco un esempio.
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
La scrittura di un file
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.
  • Per assegnare un valore con spazi vuoti, si deve richiamare la funzione Spc () e passare un numero che rappresenta il numero di spazi vuoti. Questo fattore è facoltativo, il che significa che è possibile ometterlo
  • Per assegnare il valore di un determinato numero di colonne, si deve richiamare la funzione Tab () e passare il numero di colonne come argomento. Questo fattore è facoltativo, il che significa che è possibile ometterlo
  • Per scrivere una stringa, si deve includerla tra virgolette
  • Per scrivere un numero, si può inserirlo normalmente
  • Per scrivere un valore booleano, si deve inserirlo TRUE o FALSE
  • Per scrivere un valore nullo, inserire NULL
  • Per scrivere un valore di data o ora, si deve inserirlo tra # e #
Ecco un esempio di scrittura di alcuni valori:
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
È anche possibile scrivere i valori sulla stessa linea, basta separarli con uno spazio vuoto, una virgola o un punto e virgola. Ecco un esempio:
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
Apertura di un file
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:
  • Binary: Il file verrà aperto e il suo valore viene letto come valore binario
  • Append: Il file verrà aperto e i nuovi dati verranno aggiunti alla fine dei dati già presenti
  • Input: Il file verrà aperto in sola lettura
  • Random: Il file sarà aperto per l'accesso casuale
Ecco un esempio di apertura di un file:
Codice:
Sub Prova ()
    Open "Prova.txt" For Input As #1
End Sub
La modalità di accesso è facoltativa e può avere uno dei seguenti valori:
  • Lettura: Dopo che il file è stato aperto, i valori presenti al suo interno verranno letti
  • Lettura e Scrittura: Se il file è stato creato o aperto, i valori possono essere letti e/o scritti
Se si decide di specificare la modalità di accesso si deve precedere il suo valore con la parola chiave di accesso


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
Allo stesso modo, è possibile leggere ogni valore su una riga separata. Uno dei migliori usi di usare la dichiarazione Input è la capacità di leggere molti valori utilizzando una singola istruzione. Per effettuare questa operazione, si devono digitare le variabili sulla stessa, separandole con virgole. Ecco un esempio:
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
Se si dispone di un file che contiene molte linee, per leggere una riga alla volta, è possibile utilizzare la parola chiave Line Input. La sua sintassi è:

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 -
Alexsandra non è collegato   Rispondi citando
Vecchio 07-11-2014, 18.45.03   #67
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
Alexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tutti
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
Come già detto, una cartella di lavoro è un oggetto di tipo Workbook che per sostenere la possibilità di creare una nuova cartella, la raccolta cartelle di lavoro è dotata di un metodo denominato Add. La sua sintassi è.

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
Quando il metodo viene richiamato in questo modo, viene creata una nuova cartella di lavoro e per fare questo, si deve tenere presente che il metodo Add () restituisce un oggetto Cartella di lavoro, pertanto, quando si crea una cartella, si ottiene anche un riferimento ad essa. Si ottiene tutto ciò assegnando la chiamata al metodo per la creazione di una cartella di lavoro ad una variabile, ecco un esempio.
Codice:
Sub Prova1 ()
    Dim cart As Workbook
    Set cart = Workbooks.Add 
End Sub
Con questo codice è possibile quindi utilizzare la variabile per modificare le proprietà della cartella di lavoro. Dopo aver lavorato su una nuova cartella di lavoro, o dopo averla creata a livello di codice, se si desidera mantenere la cartella quando l'utente chiude Excel, è necessario salvarla e l'utente ha la possibilità di utilizzare la finestra di dialogo Salva. Quando l'utente avvia il salvataggio di un file, viene visualizzata la finestra di dialogo Salva con nome, che per default mostra il contenuto della cartella Documenti. Per scoprire quale sia la cartella di default, è possibile fare clic sul pulsante Opzioni di Excel e nella finestra di dialogo Opzioni di Excel, verificare il contenuto del file predefinito nella casella di testo Percorso.

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
Quando questo codice viene eseguito, il file predefinito della finestra di dialogo Opzioni di Excel verrà cambiato. Per salvare visivamente una cartella di lavoro, è possibile fare clic sul pulsante Salva, oppure è anche possibile premere i tasti Ctrl + S, mentre se il documento è già stato salvato, l’operazione verrebbe eseguita senza nessun consenso da parte dell’utente. Per poter avere la possibilità di salvare una cartella di lavoro a livello di programmazione, la classe cartella di lavoro è dotata di un metodo denominato Save, la sua sintassi è.

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
Se si fornisce solo il nome di un file quando si richiama questo metodo, la nuova cartella di lavoro sarebbe salvata nella directory corrente o nella cartella Documenti, mentre se si desidera, un'alternativa si deve fornire il percorso completo del file.


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
Se si fornisce solo il nome del un file, Excel avrebbe cercato nella directory corrente o nella cartella Documenti, se invece Excel non è in grado di archiviare il file, come si può immaginare, si riceverà un errore, mentre una sicura alternativa è quella di fornire il percorso completo del file.


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
È anche possibile usare meno codice applicando l'indice direttamente alla cartelle di lavoro. Ecco un esempio.
Codice:
Sub Prova1 ()
     Workbooks (2) .Activate 
End Sub
Visualizza Molte cartelle di lavoro
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
Dopo aver fatto riferimento a una cartella di lavoro, se si desidera eseguire un'azione, è necessario ottenere un riferimento e per fare questo, si deve dichiarare una variabile cartella di lavoro e assegnare la chiamata ad essa. Ciò dovrebbe essere fatto nel modo seguente:
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 -
Alexsandra non è collegato   Rispondi citando
Vecchio 10-11-2014, 03.34.00   #68
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
Alexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tutti
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:
  • Byte : E’ di tipo numerico intero senza segno compreso nell’intervallo da 0 a 255
  • Integer : E’usato per rappresentare numeri interi (con segno) compresi fra -32768 a 32767
  • String : Può contenere delle sequenze di caratteri (stringhe) a lunghezza variabile oppure a lunghezza fissa
  • Long : Rappresenta numeri interi compresi fra -2,147,483,648 e 2,147,483,647,
  • Single e Double : Utilizzato per memorizzare numeri reali a singola o a doppia precisione
  • Boolean : E’ di tipo logico che può assumere il valore TRUE o FALSE (vero o falso)
  • Date : E’ utilizzato per memorizzare data e ora
  • Variant : E’ un tipo universale che può contenere dei dati di qualsiasi formato
Questi vari tipi di dati vengono memorizzati da VBA per poterli utilizzare come sotto forma di variabile che consentono di memorizzare temporaneamente dei valori durante l'esecuzione di un'applicazione. Alle variabili deve essere associato un nome, utilizzato per fare riferimento al valore della variabile, e un tipo di dati che determina la modalità di memorizzazione dei bit che rappresentano i valori nella memoria del computer.


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
È inoltre possibile utilizzare il numero in formato esadecimale fino a quando il numero è inferiore a 255 e se si dà un valore negativo o un valore superiore a 255, quando si tenta di accedervi, si riceverà un errore. Per convertire un testo in un numero piccolo, è possibile utilizzare la funzione CByte () utilizzando la seguente formula: Numero = CByte (Valore da convertire a Byte) si ricorda che quando si utilizza CByte (), si deve immettere il valore da convertire tra parentesi.

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"
Se si dispone di un valore che non è in formato testo e si desidera convertirlo in una stringa, si deve utilizzare la funzione CStr () con la seguente formula: CStr (valore da convertire in stringa), inserendo nelle parentesi di CStr (), il valore che si desidera convertire in stringa.

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
Se si desidera convertire un valore in Currency, si deve utilizzare la funzione CCur () con la seguente formula: Number = CCur (Valore da convertire), inserendo il valore da convertire tra le parentesi di CCur () .

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 #
Se si dispone di una stringa o un'espressione che si desidera convertire in un valore data, si deve utilizzare la funzione CDate () in base alla seguente formula: Risultato = CDate (Valore da convertire), inserendo nelle parentesi di CDate (), il valore che deve essere convertito.

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
Durata di una variabile
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
Variabili globali
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
Dopo aver dichiarato una variabile globale, è possibile accedervi dalle altre aree del file. Ecco un esempio:

In Modulo1

Codice:
Option Explicit
Dim Cognome As String

In Modulo2

Sub Test ()
    Dim Nome As String
    Nome = "Eva"
    Cognome = "Kant" 
End Sub
Anche se abbiamo dichiarato la nostra variabile globale all'interno del file in cui è stato utilizzato, è anche possibile dichiarare una variabile globale in un modulo separato per essere in grado di utilizzarlo in un altro modulo.

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
Ricordate che una variabile privata è accessibile da qualsiasi codice nello stesso modulo

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
Come promemoria possiamo affermare che una variabile pubblica è disponibile per codificare dentro e fuori dal suo modulo, ciò significa che è possibile creare un modulo, dichiarare una variabile pubblica, e accedere a quella variabile da un altro modulo, mentre una variabile privata è disponibile all'interno del suo modulo, ma non al di fuori dello stesso. Se si dichiara una variabile privata in un modulo e si prova ad accedervi da un altro modulo, si riceverà un errore:

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 -
Alexsandra non è collegato   Rispondi citando
Vecchio 15-11-2014, 00.23.54   #69
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
Alexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tutti
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
Questo codice imposta solo una variabile chiamata percorso, ora abbiamo bisogno di conoscere la posizione del file Prova.csv. Supponiamo di aver messo il file .CSV nella cartella Documenti, in questo caso è possibile utilizzare il comando Application.DefaultFilePath per conoscere il percorso predefinito dove vengono alloggiati i file dal sistema, a questo punto bisogna aggiungere solo il nome del file, preceduto da un backslash:
Codice:
percorso = Application.DefaultFilePath & "\Prova.csv"
Se invece il file è stato inserito in qualche altra cartella allora si può fare qualcosa di simile a questo
Codice:
percorso = "C:\Users\user\Documents\Test\Prova.csv"
Con questo listato il programma punta a una cartella denominata Test che si trova nella cartella C: \ Users\user, oppure si deve modificare il percorso per puntare alla cartella in cui è stato salvato il file Prova.csv. Ora si deve aprire il file e si inizia con la parola chiave Open, quindi si specifica il nome del file, una modalità e un numero di file in questo modo
Codice:
Open FileName For Mode As FileNumbe
La modalità di cui sopra deve essere sostituita da una delle seguenti operazioni:
  • Append: viene utilizzato per aggiungere dati ad un file esistente
  • Output: viene usato per scrivere in un file
  • Input: viene utilizzato per leggere un file
  • Binary: viene usato per leggere o scrivere dati in formato binario
  • Random: viene utilizzato per inserire caratteri in un buffer di dimensioni set
Le modalità che ci interessano sono Input e Output e l’argomento FileNumber può essere qualsiasi numero compreso tra 1 e 511 e si precede il numero con il carattere #, quindi, se si sta aprendo un file a cui è stato assegnato un indice #1, se si apre un secondo file diverso il suo FileNumber sarebbe # 2, e così via, quindi il codice diventa:
Codice:
Open percorso For Input As #1
Il file che vogliamo aprire è quello che abbiamo memorizzato nella variabile chiamata percorso, si tenga presente che è possibile digitare l'intero percorso del file in questo enunciato, racchiudendolo tra doppi apici:
Codice:
Open "C:\Users\user\Documents\Test\Prova.csv" For Input As #1
Con questa istruzione abbiamo accesso al file in sola lettura, la riga successiva è quella di impostare una variabile per i numeri di riga, nel nostro caso possiamo usare una variabile come questa.

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
Si noti la condizione del Loop: EOF (1), che significa End Of File, mentre 1 tra parentesi tonde è il numero di file specificato in precedenza. All'interno del ciclo, inseriamo una linea di codice come la seguente:
Codice:
Line Input # 1, LineaFile
Le prime tre voci prima della virgola si riferiscono alla lettura di una singola linea dal numero di file (# 1) e dopo la virgola, si indica a VBA dove si desidera posizionare questa linea, cosa che abbiamo deciso di fare tramite la variabile LineaFile. Ad ogni iterazione del Loop, verrà letta una nuova linea dal file di testo e posta nella variabile, tuttavia la linea avrà ancora tutte le virgole, quindi la prima linea sarà:

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, ",")
Se osserviamo la riga di codice sopra esposto, notiamo che tra le parentesi tonde della funzione Split, abbiamo inserito la variabile LineaFile (che contiene la linea che vogliamo dividere), subito dopo è presente una virgola, e infine abbiamo il separatore che vogliamo cercare, nel nostro caso il separatore è la virgola. Quando è terminato il Loop, tramite la funzione Split otterremmo un array chiamato RigaF che conterrà tutte le linee del file pulite dal carattere separatore. Si deve tenere presente che il file di testo ha sempre tre elementi per riga (nome, cognome, codice), così sappiamo che l'array va da 0 a 2 posizioni. Ora possiamo andare avanti e mettere ogni elemento in una cella del foglio di calcolo in questo modo:
Codice:
ActiveCell.Offset (Nriga, 0) .Value = RigaF (2) 
ActiveCell.Offset (Nriga, 1) .Value = RigaF (1) 
ActiveCell.Offset (Nriga, 2) .Value = RigaF (0)
Tra le parentesi tonde della funzione Offset abbiamo il numero di riga e il numero di colonna e stiamo usando la variabile chiamata Nriga per identificare le righe che devono ricevere i dati. Questa variabile è stata impostata a 0 in precedenza (che incrementeremo a breve), mentre invece le colonne sono sempre compensate a 0, 1 e 2, per cui un valore pari a 0, lo ricordiamo, si mantiene nella stessa colonna, un valore pari a 1 si sposta di 1 colonna, e un valore di 2 si sposta di 2 colonne dalla cella attiva.
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
Quando si apre un file, è necessario chiuderlo da qualche parte nel codice. Questo è abbastanza semplice, lo possiamo fare in questo modo:
Codice:
Close # 1
Si digita la parola Close e poi, dopo uno spazio, il numero di file che si sta cercando di chiudere, in pratica tutto il codice dovrebbe essere simile a questo:
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
Provate il codice assicurandovi che la cella attiva del foglio di calcolo sia la cella A1 (la colonna A è quella che abbiamo formattato come testo), cliccate poi su un punto qualsiasi all'interno della Sub e premete F5 per eseguirla. Se poi tornate al foglio di lavoro si dovrebbero vedere i dati che sono stati importati dal file di testo

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
Tuttavia, supponiamo che abbiamo aggiunto altre righe e colonne al foglio di calcolo e vorremmo un automatismo che calcoli quante righe e colonne contengano i nuovi dati. Il metodo migliore è quello di ottenere l’ultima riga con i dati in essa contenuti e l’ultima colonna, allora potremmo modificare i cicli in questo modo:
Codice:
For I = 1 To UltimaR
For j = 1 To UltimaC
Next j
Next i
La domanda è: come possiamo ottenere i valori delle variabili UltimaR e UltimaC? Ci sono diverse metodi per trovare l’ultima riga e l’ultima colonna con i dati, un modo popolare per ottenere l’ultima riga con i dati, ad esempio, è questo:
Codice:
UltimaR = Cells(1, “A”).End(xlDown).Row
Questo codice va all’ultima riga del foglio e poi risale fino a trovare la prima cella nella colonna A che contiene qualcosa. Una tecnica simile è usata anche per trovare l’ultima colonna con i dati, basta sostituire Row con Column. A questo punto possiamo aprire il file di testo in scrittura, in questo modo:
Codice:
Open percorso For Output As #1
Questo comando apre un file in modalità di scrittura e un file non esiste nel percorso indicato verrà creato e se il file esiste verrà sovrascritto. Attenzione, che se si desidera che i nuovi contenuti vengano aggiunti alla fine del file, allora si usa la parola chiave Append al posto di Output. Per scrivere nel file si deve inserire la seguente riga di codice:
Codice:
Write #1, contenutoF
Si deve digitare la parola chiave Write seguita dal numero del file e subito dopo si inserisce una virgola seguita dall’array contenutoF che contiene i dati che si desiderano scrivere sul file. A questo punto possiamo vedere quale codice possiamo utilizzare, innanzi tutto si crea una nuova Sub e la chiamiamo ScriviFile e aggiungiamo 4 variabili ad inizio routine:
Codice:
Dim percorso As String
Dim CellaD As String
Dim UltimaC As Long
Dim UltimaR As Long
Per ottenere l’ultima riga e colonna con i dati, aggiungiamo le seguenti due righe:
Codice:
UltimaR = Cells(1, “A”).End(xlDown).Row
UltimaC = Cells(1, “A”).End(xlToRight).Column
È quindi necessario azzerare la variabile CellD e specificare il percorso del file
Codice:
CellD = ""
percorso = Application.DefaultFilePath & “\Prova.csv”
Oppure se sappiamo dove si trova il file possiamo utilizzare il metodo già visto per la lettura del file
Codice:
percorso = “C:\Users\user\Documents\Test\Prova.txt”
Come possiamo vedere il codice punta a un file chiamato Prova.txt nella cartella Documents, si tenga presente che se non c’è tale file, VBA allora lo creerà. La riga successiva da aggiungere è quella che apre il file in scrittura:
Codice:
Open percorso For Output As #2
Si noti che il numero del file alla fine è il numero 2, se ricordate abbiamo già usato il numero 1 in precedenza, quindi ora cercheremo il numero 2 per evitare eventuali conflitti.

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
Come abbiamo detto, stiamo eseguendo un ciclo sulle celle del foglio di calcolo, il ciclo esterno si occupa delle righe e il ciclo interno si occupa delle colonne, inoltre all’interno del ciclo interno, abbiamo utilizzato una condizione:
Codice:
If j = UltimaC Then
CellD = CellD + Trim(ActiveCell(I, j).Value)
Else
CellD = CellD + Trim(ActiveCell(I, j).Value) + “,”
End If
Il motivo per cui vogliamo sapere se j è uguale alla variabile UltimaC è a causa delle virgole, in quanto vogliamo che ogni riga nel nostro file di testo abbia i dati separati in questo modo:

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)
In pratica qualunque sia la cella attiva (ActiveCell) avrà il suo valore inserito nella variabile CellD. Tuttavia, se j non è uguale a UltimaR allora viene eseguito, il codice
Codice:
CellD = CellD + Trim(ActiveCell(I, j).Value) + “, “
L’unica differenza è la virgola alla fine, al primo ciclo interno, CellD conterrà il valore 12345678, mentre al secondo ciclo vi aggiungerà 12345678, Mario, e all'ultimo ciclo aggiungerà 12345678, Mario, Rossi. Fuori dal ciclo interno, ma poco prima di Next, abbiamo queste due righe:
Codice:
Write #2, CellD
CellD = “”
La prima riga è quella che scrive in realtà la nuova linea nel file di testo, mentre la seconda riporta la variabile CellD pari a una stringa vuota. Le ultime due righe di codice chiudono il file e stampano il messaggio Fatto
Codice:
Close # 2 
MsgBox (“Fatto”)
Tutto il codice è simile al seguente:
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
Provate ad eseguire il codice e una volta individuato il nuovo file di testo, si dovrebbe trovare una cosa che assomiglia a questa:

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 -
Alexsandra non è collegato   Rispondi citando
Vecchio 19-11-2014, 23.47.14   #70
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
Alexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tutti
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
Questo listato produrrebbe:

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
Ecco un esempio:
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
E’ inoltre possibile utilizzare il valore predefinito di una espressione booleana, infatti abbiamo visto che quando si dichiara una variabile booleana, per impostazione predefinita, viene inizializzata con il valore False. Ecco un esempio:
Codice:
Sub Test()
    Dim ricco As Boolean
    MsgBox ("Sei ricco? " & ricco)
 End Sub
Questo produrrebbe:

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
Questo produrrebbe:

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
Va ricordato che alcune funzioni booleane come IsNumeric e IsDate, il loro valore di default è True, questo significa che quando vengono richiamate è possibile omettere l’espressione = True. E’ bene ricordare che quando una condizione è True o False la dichiarazione IF .. Then offre una sola alternativa: agire se la condizione è vera ed ogni volta che si desidera applicare un'espressione alternativa nel caso in cui la condizione è False, è possibile utilizzare la dichiarazione If .. Then .. Else. La formula di questa affermazione è:
Codice:
If CondizioneX Then
    Dichiarazione1
Else
    Dichiarazione2
End If
Quando viene eseguita questa sezione di codice, se CondizioneX è True (Vera), allora viene eseguita l’istruzione contenuta in Dichiarazione1, se invece CondizioneX è False (Falsa), viene eseguita l’istruzione contenuta in Dichiarazione2. Ecco un esempio:
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
Ciò produrrebbe:

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
Questa funzione opera come una condizione IF ... Then ... Else, prende tre argomenti richiesti e restituisce un risultato di tipo Variant e il valore restituito conterrà il risultato della funzione. Si deve tenere presente che la condizione da controllare viene passata come primo argomento alla funzione e se tale condizione è vera, la funzione restituisce il valore Vero e l'ultimo argomento viene ignorato, mentre se la condizione è falsa, il primo argomento viene ignorato e la funzione restituisce il valore del secondo argomento. Come già menzionato, è possibile recuperare il valore dell'argomento giusto e assegnarlo al risultato della funzione e il listato che abbiamo visto poco sopra può essere scritto come segue:
Codice:
Sub Test()
    Dim eta As Integer, FasciaE As String
    eta = 16
    FasciaE = IIf(eta <= 18, "Ragazzo", "Adulto")
    MsgBox ("Categoria : " & FasciaE)
End Sub
Ciò produrrebbe lo stesso risultato che abbiamo visto in precedenza.


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
Per fornire un'alternativa a questa operazione, il linguaggio Visual Basic fornisce una funzione chiamata Choose, la cui sintassi è:
Codice:
Public Function Choose( _
   ByVal Index As Double, _ 
   ByVal ParamArray Choice() As Variant _
) As Variant
Questa funzione richiede due argomenti richiesti, il primo è equivalente alla CondizioneX della formula If ... Then. Per la funzione Choose, questo primo argomento deve essere un numero ed è il valore rispetto al quale viene confrontato il secondo argomento. Prima di richiamare la funzione, è necessario conoscere il valore del primo argomento ed è possibile farlo dichiarando prima una variabile e inizializzarla con il valore desiderato. Ecco un esempio:
Codice:
Sub Test()
    Dim flag As Byte, tipo As String
    flag = 1
    tipo = Choose(flag, ...)
    MsgBox ("Tipo di impiego : " & tipo)
End Sub
Il secondo argomento può essere la dichiarazione della nostra formula. Ecco un esempio:

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
Ciò produrrebbe:

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
Ciò produrrebbe un errore come in figura sotto riportata

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
Ciò produrrebbe:

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
Questa funzione richiede un argomento obbligatorio e per utilizzarla in uno scenario If ... Then, si deve passare l'argomento come segue:

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
In questo esempio, abbiamo utilizzato un numero come argomento, ma è anche possibile utilizzare un altro tipo di valore, come ad esempio una enumerazione. Ecco un esempio:
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
Quando si utilizza la funzione Switch, se si richiama con un valore che non è controllato dal primo argomento, la funzione genera un errore e per applicare questa funzione ad un ciclo If ... Then ... Else, è possibile richiamarla utilizzando la seguente formula:

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 -
Alexsandra non è collegato   Rispondi citando
Vecchio 19-11-2014, 23.50.47   #71
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
Alexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tutti
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
Quando viene utilizzata questa istruzione, verrà esaminata innanzitutto Condizione1, se risulta essere Vera, il programma eseguirà Istruzioni1 e cessa l'esame delle altre condizioni, mentre se Condizione1 è falsa, verrà esaminata Condizione2 e nel caso risulti essere vera verrà eseguita Istruzioni2. In sostanza, ogni volta che una condizione è falsa, il programma continuerà l'esame delle condizioni fino a trovarne una che sia vera e una volta che è stata trovata verrà eseguita la sua istruzione e il programma terminerà l'esame condizionale quando incontra l’istruzione End If . Ecco un esempio:
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
Ciò produrrebbe:

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
Ecco un esempio:
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
Ciò produrrebbe:

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
Quando una funzione esegue il suo compito, può incontrare diverse situazioni, alcune delle quali avrebbero bisogno di essere controllate per la veridicità o la negazione, ciò significa che le istruzioni condizionali possono aiutare una procedura con la sua assegnazione. Per meglio comprendere, sappiamo che una funzione ha lo scopo di restituire un valore, a volte però deve svolgere alcuni compiti i cui risultati potrebbero portare a risultati diversi. Una funzione può restituire un solo valore (abbiamo visto che, passando argomenti per riferimento, è possibile effettuare una procedura di restituire più di un valore), ma si può fare il rendering di un risultato a seconda di un particolare comportamento. Se una funzione richiede una risposta da parte dell'utente, in quanto l'utente può fornire risposte diverse, è possibile trattare ogni risultato diverso. Si consideri la seguente funzione:
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
A prima vista, questa funzione sembra a posto. L'utente è invitato a fornire un numero. Se l'utente inserisce un numero inferiore a 18 (escluso), la funzione restituisce “Ragazzo”. Ecco un esempio del programma:

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
Questa volta, la condizione Else viene eseguita se nessun valore si può applicare alle condizioni If o ElseIf. Ecco un altro esempio:

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
Se la funzione utilizza una condizione If, entrambe le implementazioni produrrebbero lo stesso risultato.


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
In questo caso, se l'espressione è falsa, la funzione restituisce il valore True e si ferma. Ecco esempio:
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
Abbiamo visto che in un If ... Then ... ElseIf è possibile aggiungere il numero di condizioni ElseIf come si desidera, nello stesso tempo, è possibile richiamare il numero di funzioni IIF che si ritengono necessarie:
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
Ciò produrrebbe:

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
Ciò produrrebbe:

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
Ciò produrrebbe:

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
Ciò produrrebbe:

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
Ciò produrrebbe:

Fig. 15
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato   Rispondi citando
Vecchio 21-11-2014, 11.43.38   #72
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
Alexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tutti
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
La dichiarazione inizia con Select Case e termina con End Select e sul lato destro del Select Case, si deve immettere il valore, Expression, che verrà utilizzato, che può essere un valore booleano, un carattere o una stringa, un numero naturale, un numero decimale, un valore di data o ora, oppure una enumerazione.

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:
  • Se il valore di Expression1 è uguale a quella di Expression, allora statement1 viene eseguito.
  • Se il valore di Expression1 non è uguale a quella di Expression, l'interprete si sposta Expression2
  • Se il valore di Expression2 è uguale a quella di Expression, allora viene eseguita l’istruzione Statement2
  • Questo continuerà fino all'ultimo ExpressionX
Ecco un esempio:
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
Ecco un esempio di esecuzione del programma:

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
In questo caso, la dichiarazione dopo Case Else viene eseguita se nessuna delle espressioni precedenti corrisponde alla espressione principale. Ecco un esempio:
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
Ecco un esempio di esecuzione del programma:

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
Questo produrrebbe:

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
Questo produrrebbe:

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
Convalida di una serie di casi
È 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
Questo produrrebbe:

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
Ovviamente questa Select Case lavorerà in rari casi solo quando l'espressione di un Case corrisponde esattamente al valore richiesto, in realtà, per questo tipo di scenario, è possibile convalidare un intervallo di valori. Il linguaggio Visual Basic fornisce un'alternativa, infatti è possibile controllare se il valore della espressione risponde a un criterio anziché a un valore esatto. Per crearla, si utilizza l'operatore Is con la seguente formula:

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
Anche se in questo esempio abbiamo usato un numero naturale, è possibile utilizzare qualsiasi confronto logico appropriato in grado di produrre un risultato vero o un falso, inoltre è possibile combinare con le altre alternative che abbiamo visto in precedenza, come ad esempio separando le espressioni di un Case con una virgola. Con la dichiarazione Select Case, abbiamo visto come controllare valori diversi e di intervenire. Ecco un esempio:
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
Questo produrrebbe:

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
Si può notare che questa funzione richiede due argomenti, il primo argomento è equivalente a Expression della nostra Select Case, e come già detto, il primo argomento deve essere un numero che sarà il valore centrale rispetto al quale saranno confrontati gli altri valori. Invece di utilizzare sezioni Case si forniscono i corrispondenti valori di ExpressionX come un elenco di valori al posto del secondo argomento, separandoli da virgole. Ecco un esempio:
Codice:
Choose(num, "Ragazzo", "Adulto", "Anziano")
Come già menzionato, i valori del secondo argomento sono forniti come una lista e ogni membro della lista utilizza un indice. Il primo membro della lista, che è il secondo argomento di questa funzione, ha un indice pari a 1, il secondo valore dell'argomento, che è il terzo argomento della funzione, ha un indice di 2. È possibile continuare ad aggiungere i valori del secondo argomento come meglio si crede. Quando la funzione Choose è stata richiamata, restituisce un valore di tipo Variant ed è possibile recuperare tale valore, memorizzandolo in una variabile e usarlo quando se ne ha la necessità. Ecco un esempio:
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
Questo produrrebbe:

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
Quando questa procedura viene eseguita, l'utente è invitato a fornire un numero, se questo numero è positivo, verrà visualizzata una finestra di messaggio, mentre se l'utente inserisce un numero negativo, non succede nulla. In un tipico programma, dopo la convalida di una condizione, si consiglia di agire e per fare questo, è possibile creare una sezione del programma all'interno della istruzione condizionale di convalida, ma in realtà, è possibile creare un'istruzione condizionale all'interno di un'altra istruzione condizionale. Questo è indicato come nidificazione condizione. Qualsiasi condizione può essere nidificato all'interno di un’altra e possono essere incluse più condizioni all'interno di un’altra. Ecco un esempio in cui una condizione If nidificata all'interno di un altro If:
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
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
Dopo aver creato l'etichetta, è possibile elaborarla, inserendo nel codice l’istruzione GoTo seguita dall'etichetta, in modo tale che se si verifica una condizione che richiede di inviare il flusso all'etichetta corrispondente dopo la parola chiave Goto. Ecco un esempio:
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
Allo stesso modo, è possibile creare un numero di etichette necessarie e fare riferimento ad esse quando si vuole. Il nome deve essere unico nel suo campo di applicazione e ciò significa che ogni etichetta deve avere un nome univoco nella stessa procedura. Ecco un esempio con varie etichette:
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
Ecco un esempio di esecuzione del programma con risposta = 1:

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
In questo caso, l’operatore Not viene utilizzato per modificare il valore logico della variabile e quando una variabile booleana è stata "negata", il suo valore logico è cambiato. Se il valore logico fosse stato Vero , sarebbe cambiato in False e viceversa, pertanto, è possibile invertire il valore logico di una variabile booleana di "Notting" o no "Notting" esso. Consideriamo ora il seguente programma:
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
Questo produrrebbe:

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
Questo produrrebbe:

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 04.03.03
Alexsandra non è collegato   Rispondi citando
Vecchio 13-04-2015, 00.53.19   #73
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
Alexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tutti
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
Esempio codice 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
Per indentare il codice è possibile usare un Add-In che potete trovare a questo link.

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
Esempio: Verifica dei valori delle variabili all'inizio del Ciclo
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 -
Alexsandra non è collegato   Rispondi citando
Vecchio 13-04-2015, 00.56.26   #74
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
Alexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tutti
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
Oppure si può ottenere il testo dalla cella del foglio di calcolo:
Codice:
Dim MyString As String
MyString = ActiveCell.Value
Molto spesso, però, è necessario fare delle elaborazioni con il testo che si ottiene da una cella di un foglio di calcolo. Ad esempio, potrebbe essere necessario prendere un nome completo da una cella e posizionare il primo nome in un'altra cella e il cognome in un’altra. Per fare le cose in questo modo, è necessario sapere come utilizzare le funzioni stringa incorporate di Excel VBA.

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
Con questo codice abbiamo creato una variabile denominata Nome, che abbiamo dichiarato come String e per inserire un valore in questa variabile, abbiamo usato l'enunciato Range ("A2"). Value. Per convertire il testo in minuscolo, è necessario solo il comando: LCase (Testo_da_convertire)

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
Se eseguiamo questa routine possiamo vedere nel foglio la conversione del testo che appare in questo modo

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)
Fig. 4

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
Abbiamo creato due variabili, una chiamata Nome e una chiamata LNome e quest’ultima è stata dichiarata come Integer. Nella variabile Nome abbiamo archiviato il testo " Nelson Mandela ", ma abbiamo due spazi vuoti alla sinistra del nome e due spazi vuoti a destra, mentre la quarta linea è questa: LNome = Len (Nome)

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)
Eseguendo il codice viene visualizzata una finestra di messaggio che riporta il valore 14, che è il numero di caratteri che sono nel nome Nelson Mandela, mentre la seconda finestra di messaggio visualizza un valore di 19, che contiene i 14 caratteri originali, più i 5 aggiunti all'inizio del nome. Avremmo potuto aggiungere 5 spazi alla fine del nome in questo modo: Nome = Nome & Space (5). Non deve trarre in inganno l'uso di due volte della variabile Name, infatti se analizziamo la riga di codice: Nome & Space (5)

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
Come si può vedere abbiamo due variabili stringa, Otesto e Ctesto, il valore per la variabile Otesto viene ricavato dalla cella A5 sul foglio di calcolo. Abbiamo poi abbiamo questa riga di codice: CTesto = Replace (OTesto, "a", "o"), in cui abbiamo la funzione Replace a destra del segno di uguale, per cui la prima voce tra le parentesi tonde del Replace è il nome della variabile Otesto e rappresenta il testo da ricercare. In seguito viene elencato il carattere che non è corretto (la lettera " a "), infine, abbiamo bisogno del nuovo testo che vogliamo nella stringa, che è la lettera " o ". Tutti e tre gli elementi sono separati da virgole. La riga finale inserisce il testo corretto nella cella B5 del foglio di calcolo. Eseguendo il codice il foglio di calcolo dovrebbe sembrare come questo:

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
Abbiamo dichiarato due variabili, una è una variabile Stringa che contiene un indirizzo email, e l'altra è un intero chiamato posizione. La linea di codice della funzione InStr linea è questa: Posizione = InStr(Email, "@")

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
Ci sono due parametri facoltativi per la funzione InStr e sono: Start e Compare e la sintassi è la seguente: InStr(start, Text_To_Search, Find, comapre)

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)
Quando viene eseguito il codice, la finestra di messaggio visualizzerà il testo invertito della variabile Otesto.


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)
Nella prima riga si dichiara una variabile String e nella seconda si inserisce un indirizzo e-mail nella variabile Email, mentre nella terza linea si utilizza una finestra di messaggio che utilizza la funzione Left: MsgBox Left(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
Posizionare il nome completo nella variabile NomeC: NomeC = "Nelson Mandela". Ora usiamo la funzione InStr per individuare la posizione dello spazio nel nome: PosSpc = InStr(NomeC, " ")

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
Eseguendo il codice e si dovrebbe vedere questa finestra di messaggio:

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
Abbiamo creato due variabili stringa, una chiamata Email e una chiamata Pcar, abbiamo poi memorizzato un indirizzo email nella variabile Email e poi viene il codice della funzione Mid: Pcar = Mid(Email, 15, 4)

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, "-", "")
Tra le parentesi tonde di Replace abbiamo il testo che vogliamo cercare, che è la variabile denominata Pcode, dopo abbiamo una virgola, e in seguito il carattere che vogliamo sostituire, il trattino, che viene sostituito con due doppie virgolette senza spazio tra loro.

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"
Partendo dalla sinistra della variabile Pcode, prendiamo due caratteri con il codice Left(Pcode, 2) e la lettera "C" viene aggiunta con la concatenazione in questo modo: Left(Pcode, 2) & "C". Il nuovo codice di tre lettere viene memorizzato nella variabile chiamata Ncar e per ottenere i numeri, utilizziamo Mid in questo modo:
Codice:
Dim Num As String
Num = Mid(Pcode, 3)
La funzione Mid preleverà 3 caratteri dalla variabile Pcode e poiché non abbiamo specificato un numero finale, Mid prenderà il resto dei caratteri fino alla fine della stringa. L'unica cosa che resta da fare è quello di unire le due parti insieme:
Codice:
Dim NewCar As String
NewCar = Ncar & Num
MsgBox NewCar
In questa parte si utilizza solo la concatenazione per unire la variabile Ncar e Num e l'ultima riga utilizza una finestra di messaggio per visualizzare i risultati. Tutto il codice, si presenta così:
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
Quando si incontra un problema come quello sopra, la soluzione di solito è di utilizzare una delle funzioni Left, Right, o Mid (o tutti) di spezzare la stringa per poi unirli di nuovo insieme.
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato   Rispondi citando
Vecchio 13-04-2015, 00.59.36   #75
Alexsandra
Senior Member
WT Expert
 
L'avatar di Alexsandra
 
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
Alexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tuttiAlexsandra è conosciuto da tutti
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
Quando la macro ha terminato la sua esecuzione, il calcolo automatico deve essere ripristinato utilizzando il seguente comando.

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
Allo stesso modo, si possono usare altri metodi, anche se meno efficaci di quello appena proposto come i seguenti:
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
4: Dichiarare le variabili
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)
Recentemente ho trovato su internet una versione di una funzione VBA Max () che è 10 volte più veloce rispetto alla funzione di Excel, tuttavia, il codice qui sotto riportato è oltre 80 volte più veloce, pur con la limitazione di avere solo due argomenti e non supporta le matrici, ma il miglioramento in termini di velocità è notevole.
Codice:
Function Max2 (Value1, Value2) 
If Value1 > Value2 Then
Max2 = Value1
Else
Max2 = Value2
End If
End Function
Suggerisco cautela quando si usano le funzioni di Excel e si dovrebbe sempre valutare l'impatto della riscrittura della funzione. Si noti che qualsiasi comando che inizia con "Application" o "WorksheetFunction" si riferisce a una funzione di Excel


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
E’ bene ricordare che la numerazione assegna un valore numerico costante ad una variabile e VBA è in grado di elaborare i valori enumerati velocemente mantenendo il codice leggibile, inoltre si possono assegnare valori numerici predefiniti o valori specifici per poi essere assegnati in questo modo
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
Gli operatori booleani sono semplicemente degli switch (interrutori) e possono essere true o false che elaborano molto velocemente. Nell'esempio che segue bMale, bFemale sono variabili booleane. Il codice booleano è di circa 10 volte più veloce rispetto all'utilizzo di stringhe.
Codice:
If bMaschio Then
 ...  codice
ElseIf bFemmina Then
...  codice
End If
7: Non selezionare i fogli di lavoro specifici se non necessario
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)
Fate questo invece:
Codice:
variabile = Worksheets ("Foglio1"). Cells (1,1)
8: Evitare il copia e incolla
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 -
Alexsandra non è collegato   Rispondi citando
Rispondi


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti)
 
Strumenti discussione

Regole di scrittura
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is ON
Gli smilies sono ON
[IMG] è ON
Il codice HTML è OFF

Vai al forum

Discussioni simili
Discussione Autore discussione Forum Risposte Ultimo messaggio
riserca del corso rene' Software applicativo 1 04-04-2008 11.30.22
Formare Gruppo di Studio a Napoli Scognamiglio Windows 7/Vista/XP/ 2003 0 14-02-2008 21.46.49
Corso su DVD di Tedesco Downloader Chiacchiere in libertà 17 26-01-2007 09.46.21
Win XP e corso di inglese che non va più Raboso Windows 7/Vista/XP/ 2003 8 11-11-2005 11.16.04
svendo corso Cisco alxdvc Internet e Reti locali 0 27-01-2005 13.03.45

Orario GMT +2. Ora sono le: 16.28.24.


E' vietata la riproduzione, anche solo in parte, di contenuti e grafica.
Copyright © 1999-2017 Edizioni Master S.p.A. p.iva: 02105820787 • Tutti i diritti sono riservati
L'editore NON si assume nessuna responsabilità dei contenuti pubblicati sul forum in quanto redatti direttamente dagli utenti.
Questi ultimi sono responsabili dei contenuti da loro riportati nelle discussioni del forum
Powered by vBulletin - 2010 Copyright © Jelsoft Enterprises Limited.