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 13-02-2012, 17.09.29   #1
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
Corso VBA

Corso base sul Visual Basic for Application [VBA] di Excel


Introduzione a VBA


Microsoft Excel è un foglio di calcolo che permette di gestire ed elaborare grosse quantità di dati organizzandoli in tabelle o elenchi in modo da poter effettuare calcoli complessi in modo molto semplice e rapido. Una delle potenzialità di Excel è di contenere al suo interno un linguaggio di programmazione che lo rende molto versatile e potente denominato "Visual Basic for Application" in sintesi VBA, che è un linguaggio di programmazione ad oggetti molto simile al vecchio Basic o Quick Basic e abbastanza simile al moderno Visual Basic, in pratica tramite codice programmabile possiamo far compiere ad Excel operazioni che non è possibile effettuare con l'uso tradizionale.

VBA non può compilare un proprio progetto in un file binario eseguibile, dovrà sempre essere appoggiato all'applicazione del pacchetto Office che lo ospita per sviluppare ed eseguire il programma, pertanto non si tratta di un linguaggio "autonomo", bensì di un'evoluzione del sistema di macro associata ai fogli elettronici;


Nozioni Generali per Iniziare
Introduzione al VBA
Introduzione agli Oggetti
Introduzione a Sub e Function in VBA

Editor di Visual Basic
Prefazione Editor VBA
Inserire un Modulo nell’Editor VBA
Ambiente di sviluppo e generatore di macro
Editor di Visual Basic for Applications
I Menù dell’Editor di VBA
Il Debug del codice VBA

Cartella e Foglio di lavoro
Cartelle di Lavoro: Nozioni di Base
Metodi e proprietà della cartella di Lavoro
Gli Eventi nella cartella di lavoro - ThisWorkbook
Metodi e Proprietà del Foglio di lavoro o WorkSheet
Gestione degli Eventi nel foglio di lavoro o WorkSheet

Celle, Righe e Colonne
Le Colonne in un Foglio di Lavoro
Le Righe in un Foglio di Lavoro
Le Celle in un Foglio di Lavoro
Metodi e Proprietà per gestire le righe del foglio di lavoro
Range, Cells e Ciclo With
Approfondimento ed esempi sulla Proprietà Range

Procedure e Funzioni
Scrittura di nuove macro e procedure
Creare e richiamare procedure Sub e Funzioni
Programmazione ad Oggetti: Metodi e Proprietà
Passaggio di argomenti alle procedure
Lavorare con le date in VBA
La Funzione MsgBox e InputBox

Variabili e operatori
Le Variabili: Nozioni di base
Variabili e tipi di dati
Operatori Logici e matematici

Matrici e cicli decisionali
Introduzione alle Istruzioni condizionali
Le Funzioni Condizionali
Le Selezioni Condizionali
Prendere decisioni – Ciclo If e Select Case
Azioni Ripetitive : Il Ciclo For e il ciclo For Each
Azioni ripetitive : Il Ciclo Do Loop
Le Matrici - Statiche e Dinamiche
Gestione degli errori - Metodi e proprietà

Userform e Controlli
Introduzione alle Userform
I Controlli nelle Userform
Impostazioni delle proprietà dei controlli
I controlli ListBox e ComboBox
I Controlli CheckBox, OptionBox e ToggleButton
I controlli Label, TextBox e CommandButton
I controlli ScrollBar e SpinButton
I controlli Frame, Multipage e TabStrip
Il controllo Image e RafEdit
Utilizzare il controllo ListView
Gestire gli input da tastiera in un controllo TextBox

Manipolare le stringhe
Le Funzioni Left - Right - Mid - Len e Replace
Le Funzioni Split - Join - InStr e InStrRev
Le Funzioni Empty – ZLS – Null – Nothing e Missing
Le Funzioni LCase - UCase -Trim e Space

Elaborazioni con i File
Metodi di elaborazione dei file con VBA
Leggere e scrivere in un file di testo con VBA
Leggere un File Txt con TextStream
Oggetto Application – Metodi e Proprietà
Manipolare File e cartelle con FileSystemObject

Classi e Oggetti in VBA
Introduzione a Classi e Oggetti
Introduzione alle Collezioni
Oggetti e Collezioni nei moduli di classe
Classi, oggetti ed eventi personalizzati
Gestione Eventi di foglio di lavoro con Un Modulo Di Classe

Metodi vari in VBA

Esegui macro VBA su un foglio di lavoro protetto
Il Metodo Find in VBA
Il Metodo OnTime ed esempi sui colori
Inviare una e-mail utilizzando un server remoto con CDO
Efficienza e prestazioni in VBA

Tutte le lezioni del corso in un unico file pdf Download Ebook



Laboratorio di VBA: Programmi e file sorgenti





Commenti
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -

Ultima modifica di VincenzoGTA : 05-03-2012 alle ore 16.35.09
Alexsandra non è collegato   Rispondi citando
Vecchio 13-02-2012, 17.10.41   #2
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
#3

Ambiente di sviluppo e generatore di macro



Avrete certamente notato, usando quotidianamente Excel, che capita molto spesso di svolgere le stesse operazioni ripetendo lo stesso comando per compiere normalissime azioni di routine che implicano le stesse modalità di esecuzione. Invece di ripetere la stessa serie di istruzioni ogni volta che si vuole eseguire una determinata operazione è possibile, utilizzando una macro, creare un automatismo che ci permetta di eseguire una serie di comandi automaticamente all'interno dell’applicazione stessa. Le macro sono procedure, o meglio, un insieme di comandi e istruzioni, che permettono di eseguire una serie di operazioni utilizzando un singolo comando, automatizzando attività ripetitive che altrimenti richiederebbero una vasta serie di comandi manuali in sequenza.
In pratica una macro è una procedure composta da un insieme di istruzioni che permettono di eseguire un compito ripetitivo e che Microsoft ha reso disponibile nei suoi pacchetti Office anche ai non addetti ai lavori attraverso l'introduzione del Registratore di Macro


Il Registratore di macro
Un modo semplice per imparare VBA è quello di registrare le proprie macro con lo strumento Registratore di macro, e quindi leggere, eseguire e modificare il codice della macro che avete registrato in Visual Basic Editor. Una macro è un insieme di istruzioni fornite sotto forma di codici per rendere il computer in grado di eseguire un'azione e questo particolare strumento è presente in tutte le applicazioni di Office e permette di registrare una serie di operazioni in una macro per poi essere eseguite quando se ne presenta la necessità. Bisogna tenere presente che una volta attivato il registratore di macro vengono registrate tutte le azioni svolte dall'utente e convertite in codice Visual Basic, pertanto prima di compiere questa azione si devono fissare le condizioni nelle quali successivamente queste macro verranno eseguite, in sostanza, si deve stabilire nel proprio ambiente di lavoro le stesse condizioni che esisteranno quando la macro verrà eseguita. Questa operazione viene definita col termine di fissare le condizioni iniziali, per meglio comprendere si può supporre, per esempio, di voler creare una macro che applica un determinato tipo e dimensione di carattere a delle celle selezionate di un foglio Excel, le condizioni iniziali, che abbiamo accennato prima, sono che questa macro abbia almeno un foglio di calcolo aperto e una cella selezionata.

Se avviamo il registratore di macro, dopo visualizziamo un foglio di calcolo e selezioniamo delle celle, tutte queste operazioni entrano a far parte della macro stessa in quanto, come abbiamo già detto, il registratore di macro registra tutte le azioni che si eseguono, anche quelle che esulano dal compito che si vuole assegnare, diventando così parte integrante della macro. In pratica per definire le condizioni iniziali si intende la "preparazione dell’ambiente di lavoro" in modo che il codice della macro contenga esclusivamente le operazioni da svolgere. Per poter mandare in esecuzione una macro dobbiamo prima verificare il grado di protezione che abbiamo impostato in Excel, lo possiamo vedere attraverso questo percorso Strumenti - Macro - Protezione e ci comparirà una maschera come quella sotto riportata

Fig. 1

Impostando il livello di protezione su medio, come vedete in Figura 1, verrà mostrato un messaggio di avviso ogni volta che andrete ad aprire file che conterranno macro, e permetterà di scegliere se eseguirle o meno. Il messaggio che vi apparirà è il seguente

Fig. 2

Nota: Per versioni di Excel superiori alla 2003 il livello di sicurezza è settato per default con le macro disabilitate, per poter salvare il file con il progetto VBA si deve seguire questo percorso dal menu File - Salva con nome e selezionare nella casella a discesa la voce Cartella di lavoro con attivazione macro di Excel

Fig. 3

Ad ogni modo si consiglia di controllare il Centro di protezione per verificare il grado di sicurezza impostato a cui si può accedere dalla barra multifunzione seguendo il percorso dal menu Sviluppo - Sicurezza macro

Fig. 4

Successivamente viene visualizzata la finestra del centro di protezione come quella sotto riportata

Fig. 5

Si consiglia di selezionare l’opzione “Disattiva tutte le macro con notifica” in questo modo quando viene aperto un file contenente codice VBA Excel rimanda un avviso che il file che si sta per aprire contiene un progetto VBA che identifica come potenzialmente pericoloso. Scegliendo questa opzione quando poi andiamo ad aprire un file che contiene macro ci viene portato a video sotto la barra dei menù un avviso in cui possiamo scegliere se attivarle oppure no

Fig. 6

E’ doveroso ricordare che le macro possono contenere codice dannoso o anche un'applicazione virale, pertanto fate attenzione nell'aprire file che riporteranno il messaggio sopra esposto, aprite file contenenti macro solo se siete certi della fonte.
Fine Nota

Fatta questa premessa iniziamo a costruire la nostra prima macro utilizzando il registratore di Macro che si trova nel menu Strumenti - Macro - Registra nuova macro

Fig. 7

Nota: Per versioni di Excel superiori alla 2003 il percorso che dobbiamo seguire per registrare una nuova macro è: Visualizza - Macro - Registra Macro

Fig. 8
Fine Nota

Eseguita questa operazione ci comparirà una finestra come quella sotto riportata

Fig. 9

Vediamo i vari campi che compaiono in questa finestra

Nome macro: La prima opzione della finestra di dialogo è il Nome Macro che per default viene assegnato un nome che consiste nella parola Macro seguita da un numero in funzione del numero di macro già registrate in quella sessione di lavoro. Si consiglia però di assegnare un nome più significativo e personalizzato per identificare il compito assegnato alla macro. Per esempio se si registra una macro che cambia il tipo e la dimensione del carattere si può immettere il nome Cambiacaratt nel campo di testo del nome della macro

Tasto di scelta rapida: si può usare facoltativamente la casella di immissione rapida da tastiera per definire una combinazione di tasti che quando verrà premuta porterà all'esecuzione della macro, immettendo quindi la lettera che si vuole usare come "tasto rapido". Si consiglia di usare questa opzione solo nel caso in cui si ritenga che in seguito la macro verrà usata molto spesso. Ricordo inoltre che tutte le combinazioni di tasti rapidi o "scorciatoie" sono combinazioni tra il tasto Ctrl (Control) e il tasto che viene assegnato, per esempio, se inseriamo Z nell'apposito campo, per eseguire la macro basta usare la combinazione di tasti CTRL+Z

Memorizza macro in: In questo campo di testo è possibile scegliere dove salvare la macro una volta registrata. Le scelte previste sono:
  • Cartella macro personale
  • Nuova cartella di lavoro
  • Questa cartella di lavoro

Se si sceglie Cartella macro personale Excel salva la macro in una speciale cartella detta Personal.xls che viene caricata automaticamente quando si avvia Excel. Se invece si sceglie "Questa cartella di lavoro", la macro verrà salvata nella cartella corrente (scelta consigliata)

Descrizione: Le informazioni inserite in questo campo non vengono usate dalla macro ma servono solo per aggiungere alcune note o commenti su ciò che fa la macro, per default il VBA immette una descrizione costituita dalla data di registrazione della macro e dall'autore

Per fornire un esempio specifico, si supponga che tutti i giorni si debba aprire un file che si chiama "Lezione1" e si deve scrivere nella cella A1 del Foglio1 Inizio ore 08,00 e nella cella A1 del Foglio2 Fine ore 12,00 potremmo automatizzare questa procedura usando una macro. Premiamo sul tasto OK della figura sopra esposta (Fig. 9) e procediamo alla creazione della macro. Innanzi tutto attiviamo il Foglio1 e portiamo il cursore nella cella A1 e scriviamo la frase Inizio ore 08,00 e poi premiamo il tasto Invio, portiamoci poi nel Foglio2 e nella cella A1 e scriviamo la frase Fine ore 12,00 e premiamo ancora Invio

Ritorniamo poi al Foglio1 e possiamo anche interrompere la registrazione della nostra macro seguendo questo percorso: Strumenti - Macro - Interrompi registrazione

Fig. 10

A questo punto la nostra macro è stata creata, la procedura di fine registrazione può essere eseguita nel modo sopra descritto oppure al momento della registrazione può comparire a video anche un box come il seguente

Fig. 11

La finestra di figura 11 rimarrà sullo schermo durante la registrazione, è possibile spostarlo come volete, e per fermare la registrazione basta premere sul pulsante quadrato che vedete in figura.

Nota: Per versioni di Excel superiori alla 2003 per interrompere la registrazione della macro si deve seguire il seguente percorso Visualizza - Macro - Interrompi Registrazione e la finestra riportata in figura 11 si chiude

Fig. 12
Fine Nota

A questo punto possiamo verificare se la macro registrata funziona, cancelliamo quello che abbiamo scritto nei due fogli e proviamo a mandarla in esecuzione, seguendo il percorso dal menu Strumenti - Macro - Macro

Fig. 13

Nota: Per versioni di Excel superiori alla 2003 per mandare una macro in esecuzione il percorso da seguire è: Visualizza - Macro - Visualizza Macro

Fig. 14
Fine Nota

In seguito si apre una maschera come la seguente

Fig. 15

In questo box vengono elencate tutte le macro registrate o scritte direttamente all'interno dell'editor, basta solo selezionare col mouse la macro interessata e premere sul pulsante Esegui per mandarla in esecuzione, oppure utilizzando il tasto di scelta rapida associato alla macro (CTRL+Z) o semplicemente premendo il tasto F5. Si può eseguire una macro in modalità interruzione, (o Step by Step) selezionando la macro e cliccando sul pulsante “Esegui Istruzione” che aprirà la finestra dell’Editor con il modulo che contiene la macro selezionato e già attivo e col cursore posizionato sulla prima riga di codice selezionata in giallo. Le istruzioni verranno eseguite premendo il tasto F8, questa è un’opzione per poter verificare il funzionamento della macro passo-passo. Premendo il tasto “Elimina” la macro selezionata verrà eliminata e cliccando sul tasto “Opzioni” si può cambiare l’assegnazione del tasto di scelta rapido e la descrizione della macro.

Cliccando invece su “Modifica” si visualizza il codice della macro registrata, e si accede all’Editor di VBE con la finestra dell’Editor già aperta e il codice della macro che è stato prodotto dall’azione compiuta. Nel nostro esempio troveremo un codice come il seguente:
Codice:
Sub Macro1()
'
' Macro1 Macro
' prova registratore di macro
'
'
    Range("A1").Select
    ActiveCell.FormulaR1C1 = "Inizio ore 8,00"
    Range("A2").Select
    Sheets("Foglio2").Select
    ActiveCell.FormulaR1C1 = "Fine ore 12,00"
    Range("A2").Select
    Sheets("Foglio1").Select
End Sub
Analizzando il codice vediamo che la prima riga contiene l’intestazione della procedura, cioè la parola chiave Sub seguita dal nome che abbiamo assegnato alla macro e da due parentesi, che indica l’inizio della sub routine e delle istruzioni che verranno eseguite quando manderemo in esecuzione la macro. Nell'ultima riga è presente la parola chiave End Sub che indica la fine della procedura e tra le due istruzioni vengono collocate le istruzioni da seguire

Le prime 5 righe sono precedute da un apice e sono dei commenti che vengono ignorate dal VBE, praticamente sono le frasi che abbiamo inserito in fig. 15 all’inizio della registrazione, mentre alla riga 6 viene selezionata la cella A1 tramite l’istruzione ‘Select’ e nella riga successiva viene inserita la scritta “Inizio ore 8,00” mentre alla riga successiva viene selezionata la cella A2 che corrisponde alla pressione del tasto Invio che rimanda a capo e seleziona la cella A2 nel foglio di lavoro.

Nella riga 9 viene selezionato il foglio 2 e nella riga successiva viene inserita la scritta “Fine ore 12,00” nella cella A1, si passa poi alla cella A2 quando viene premuto il tasto invio nel foglio di lavoro che rimanda a capo e infine si ritorna al foglio 1 terminando la registrazione.

Se si desidera che una macro selezioni una cella specifica, esegua un’azione e poi selezioni un’altra cella mediante un riferimento relativo alla cella attiva, è possibile utilizzare dei riferimenti di cella definiti relativi e assoluti durante la registrazione della macro. Per registrare una macro utilizzando riferimenti relativi, si deve attivare la funzione dal percorso Visualizza – Macro – Usa riferimenti relativi della barra multifunzione

Fig. 16


Definizione di “riferimento assoluto”
Per “riferimento assoluto” si intende l’indirizzo esatto di una cella, indipendentemente dalla posizione della cella contenente la formula. Un riferimento assoluto ha la forma $A$1, in pratica viene inserito il simbolo $ prima del riferimento, notare che possono esistere riferimenti di cella misti, che presentano la seguente forma A$1, in questo caso il riferimento assoluto è riferito alla riga, mentre un riferimento assoluto per la colonna ha la forma $A1. Diversamente dai riferimenti relativi, i riferimenti assoluti non si adattano automaticamente quando si copiano delle formule su righe e colonne.
Codice:
Sub copia()
' copia nella cella A1 il contenuto di A3
' indirizzamenti assoluti
 Range("A1").Value = Range("A3").Value
End Sub

Definizione di “riferimento relativo”
Per “riferimento relativo”si intende un riferimento di cella, utilizzato in una formula, che cambia quando la formula viene copiata in un’altra cella o intervallo. Dopo che la formula viene copiata e incollata, il riferimento relativo nella nuova formula cambia per fare riferimento a una cella differente distante dalla formula lo stesso numero di righe e colonne che distanziano il riferimento relativo originale dalla formula originale.
Se ad esempio la cella A3 contiene la formula =A1+A2 e si copia la cella A3 nella cella B3, la formula nella cella B3 diventa =B1+B2.

Mentre invece la formula "=R[-1]C*2" è un esempio di riferimento relativo e si riferisce alla riga precedente [-1] a quella attiva e la stessa colonna.


Limitazioni del Registratore di macro
Si può osservare che la procedura di registrazione di una macro, anche se è un modo semplice e uno strumento utile per imparare e creare codici VBA, può essere utilizzato solo per i codici semplici e di base e non per la creazione di codici avanzati e procedure complesse a causa di alcune limitazioni. Durante la registrazione di una macro è possibile creare solo sotto-procedure e non le funzioni che restituiscono un valore, non è possibile allocare in memoria le informazioni durante la registrazione e non possono essere utilizzate le variabili, oppure utilizzare istruzioni condizionali quali If-Then, o utilizzare cicli Loop, o chiamare altre procedure o funzioni. Un codice di una macro registrata è di solito inflessibile e non è il più efficace, anzi necessita sempre di una pulizia nelle linee di codice dalle informazioni inutili aggregate alla macro registrata.
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato   Rispondi citando
Vecchio 13-02-2012, 17.11.41   #3
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
Gestione degli errori - Metodi e proprietà



La gestione degli errori si riferisce ad una particolare tecnica di programmazione che consiste nell’anticipare e prevedere le condizioni di errore che possono sorgere quando il programma viene eseguito. In generale gli errori possono essere di tre tipi:
  • Errori di sintassi: Come errori di battitura o variabili non dichiarate che impediscono il corretto funzionamento
  • Errori run-time: Che si verificano quando VBA non può eseguire correttamente una dichiarazione del programma.
  • Errori Logici: Come un utente immette un valore negativo in cui solo un numero positivo è accettabile

Errori di sintassi
Viene detta sintassi lo specifico ordine di parole che costituisco un enunciato VBA valido e alcuni dei più comuni messaggi di errore che possono verificarsi mentre si scrive o si edita una procedura sono relativi a errori di sintassi. I messaggi di errore di sintassi segnalano un problema in un enunciato quali, virgole, virgolette argomenti mancanti o simili. Ogni volta che si scrive una nuova riga di codice o se ne modifica una, il VBA esamina la riga non appena il cursore si sposta da essa. Questa operazione che viene detta Parsing è il processo di scomposizione di un enunciato nelle varie parti al fine di determinare quali sono le parole chiave, le variabili o i dati. Dopo che il VBA ha esaminato senza rilevare errori una riga di codice, procede alla sua compilazione (in VBA la compilazione è la conversione del codice sorgente in una forma direttamente eseguibile dal VBA senza dover ripetere l’operazione di Parsing)

Si deve tenere presente che la finestra del codice nell'Editor di VB presenta le parole scritte in vari colori, questa "applicazione" del colore viene eseguita dopo aver esaminato una riga di codice e non aver rilevato errori, al contrario, se viene rilevato un errore in fase di esame o compilazione della riga il VBA colora di rosso l’intera riga e visualizza una finestra di dialogo con un messaggio di errore


Errori Run-time
E’ possibile scrivere un enunciato VBA senza alcun errore di sintassi, ma che tuttavia non porta a un’esecuzione corretta, gli errori che si manifestano solo in fase di esecuzione della procedura vengono detti errori runtime. Ne esistono di vari tipi e di solito sono causati dalla mancanza di argomenti o dall'uso di argomenti di tipo errato, dalla mancanza di certe parole chiave o dal tentativo di accedere a dischi o directory non esistenti o da errori logici.


Errori logici
Questo tipo di errore è il più difficile da tracciare se la sua sintassi è corretta e funziona senza rimandare errori di esecuzione, si può definire come un errore da nessuna indicazione all’utente che si è verificato un errore dovuto al fatto che un errore logico è il processo di logica e non il codice stesso a generare l’errore. L’esecuzione di un calcolo in un foglio di lavoro utilizzando una funzione restituirà una risposta, ma è la risposta corretta? Per meglio comprendere simuliamo un errore scrivendo il codice sotto riportato in un modulo e mandandiamolo in esecuzione
Codice:
Sub prova()
Sheets("Foglio11").Range("F5").Select
End Sub
Il cui significato è: vai nel Foglio 11 di questa cartella e seleziona (Select) la cella F5 Range("F5"). Tornando ad Excel (basta cliccare sulla prima icona col simbolo di Excel in alto a sinistra) e mandando in esecuzione la macro (premere ALT+F8, selezionare il nome della macro e poi Esegui) e comparirà un avviso come quello sotto riportato

Fig 1

Come si può intuire dal testo si tratta di un errore generato dal codice, premendo sul pulsante Debug verrà automaticamente aperto l'editor di VBA e verrà riportata la routine (o Sub) che lo ha causato

Fig. 2

Nella figura sopra riportata si può notare che la riga di codice che ha causato l'errore è già evidenziata in giallo e questo facilita notevolmente le cose, l’errore è già individuato e si può intervenire e correggere il codice, tuttavia l'errore ha bloccato l'esecuzione della macro e per poter continuare ad operare si deve ripristinare l'editor (cioè sbloccarlo) e in seguito rimediare all'errore. Per eseguire questa operazione basta premere sul pulsante blu in alto nella barra degli strumenti contrassegnato dalla freccia rossa, il quale interrompe il Debug del codice e ripristina l'uso dell'editor.

Spieghiamo ora la natura dell'errore: nella nostra cartella di lavoro, l'errore è stato causato per il semplice fatto che non esiste all'interno della stessa un foglio denominato Foglio11, per cui VBA ha evidenziato questa situazione con un errore di run-time interrompendo l'esecuzione della macro, in pratica non ha trovato il percorso che gli è stato indicato. Esaminiamo ora il seguente codice :
Codice:
Sub prova()
MsgBox “Ciao Mondo”, “Messaggio di saluto”
End Sub
Mandando in esecuzione la routine viene rimandato lo stesso avviso del codice precedente

Fig. 3

In questo caso non ci sono errori di sintassi nell'enunciato MsgBox, i testi sono correttamente posti tra virgolette, ed è presente la virgola di separazione tra gli argomenti (Ndr. Tutti gli argomenti di MsgBox, salvo il primo, sono opzionali pertanto VBA accetta la presenza di due soli argomenti per MsgBox come sintassi corretta), ma quando VBA cerca di eseguire l’enunciato visualizza una finestra di dialogo di errore come sopra esposta.

Questa finestra di dialogo informa che l’errore si è verificato in fase di esecuzione della procedura e contiene un messaggio che descrive l’errore stesso, in questo caso si tratta di un argomento di tipo errato (non corrispondente). In effetti esaminando la riga, si vede che manca lo spazio che funge da segnaposto per il secondo argomento, Buttons, facoltativo. Quando VBA sottopone al Parsing l’enunciato, compila il testo fra virgolette “Messaggio di saluto” come secondo argomento di MsgBox invece di terzo argomento, a causa dell’omissione del segnaposto fra le due virgole. Dato che l’argomento buttons deve essere un numero e non un testo, il VBA segnala che il tipo di dati passato alla procedura MsgBox non è del tipo giusto per quell'argomento.

E’ possibile intercettare un errore nel progetto VBA con l'istruzione On Error per deviare il flusso del programma verso una routine che gestisca l’errore trasmettendo le istruzioni necessarie per risolverlo. Per poter controllare un errore si inserisce all'inizio della routine l’istruzione On Error GoTo [etichetta] e quando si verifica un errore, questa parola chiave interrompe l’esecuzione del codice del programma per "saltare" alla posizione contrassegnata da [etichetta] che deve trovarsi nella stessa procedura che contiene l’istruzione On Error.

Per esempio se la routine Command1_Click ha come prima istruzione un On error goto err (dove err è il nome dell’etichetta) in caso di errore il flusso del programma va direttamente all'istruzione presente nell'etichetta err, dove si deve inserire il codice o la procedura che tratteranno opportunamente l’errore. Se invece tutto il flusso del programma procede correttamente, l’istruzione On Error viene ignorata e si arriva alla fine della routine.

Ci sono vari modi per gestire un errore utilizzando le seguenti istruzioni:
  • On Error GoTo 0 : Indica al programma di ignorare l’istruzione in caso di errore e il programma continuerà
  • On Error Resume : Indica che in caso d’errore si ritenta di eseguire l’istruzione che lo ha generato
  • On Error Resume Next : Indica al programma che in caso d’errore verrà eseguita l’istruzione successiva a quella che ha generato l’errore
E’ abbastanza chiaro che solo utilizzando l’istruzione On Error GoTo [etichetta] si può trattare l’errore perché negli altri 3 enunciati la situazione si risolve a prescindere dal tipo di errore, in pratica si salta l’errore ma non lo si risolve. Ad ogni modo è consigliabile porre gli enunciati di gestione degli errori alla fine di ogni procedura inserendo delle funzioni tipo Exit Sub oppure Exit Function. Vediamo un esempio di codice in un routine con gestione degli errori.
Codice:
Sub Command1_Click()
On Error GoTo err
  MsgBox “Ciao Mondo”, “Messaggio di saluto”
Exit_Command1:
Exit Sub

err:
MsgBox Err.Description
Resume Exit_Command1
End Sub
Nel codice di esempio sopra esposto On Error attiva la gestione degli errori, se si verifica un errore la procedura salta all'etichetta di riga err che indica l'inizio della gestione degli errori. La prima riga riporta una finestra di dialogo che visualizza il codice di errore, poi passa all'istruzione Resume che ci porta alla routine Exit_Command1 che con l'istruzione Exit Sub ci fa uscire dalla procedura. Se eseguiamo il codice sopra riportato ci riporta un avviso del genere.

Fig. 4

La forma On Error Goto 0, è la modalità predefinita in VBA e indica che quando si verifica un errore di runtime VBA dovrebbe visualizzare la sua finestra di messaggio di errore in fase di esecuzione standard, consentendo di immettere il codice in modalità di Debug o di terminare il programma VBA. In pratica avere On Error Goto 0 è come non avere un gestore degli errori attivato, in quanto qualsiasi errore causerà VBA verrà visualizzata la casella di messaggio di errore standard.

La forma, On Error Resume Next, è la forma più comunemente usata e abusata, con questa espressione si insegna a VBA di ignorare essenzialmente l'errore e riprendere l'esecuzione sulla riga successiva di codice. E 'molto importante ricordare che On Error Resume Next non risolve in nessun modo l'errore, ma indica semplicemente a VBA di continuare come se non ci fosse stato nessun errore. Tuttavia, l'errore può avere effetti collaterali, come variabili o oggetti impostati su Nothing non inizializzate ed è una responsabilità del codice di verificare una condizione di errore e prendere i provvedimenti opportuni. A tale scopo, vedendo il codice sotto riportato si deve testare il valore di Err.Number e se non è zero si deve eseguire la correzione appropriata. Per esempio:
Codice:
 On Error Resume Next 
    N = 1/0 
    If Err.Number <> 0 Then 
        N = 1 
    End If
Questo codice tenta di assegnare il valore 1/0 alla variabile N e questo è un’operazione non ammessa, e VBA genererà un errore 11 (divisione per zero) e dato che abbiamo l’espressione On Error Resume Next, il codice continua, ma in seguito viene verificato il valore di Err.Number e viene assegnato un altro valore alla variabile N

La forma On Error Goto [etichetta] indica a VBA di trasferire l'esecuzione alla riga che segue l'etichetta di riga specificata e ogni volta che si verifica un errore, l'esecuzione del codice va subito alla linea che segue l'etichetta di riga e non viene eseguita nessuna istruzione presente nel tra l'errore e l'etichetta, incluse le affermazioni di controllo del ciclo.
Codice:
On Error Goto Err11: 
N = 1/0
  'altro codice 
Exit Sub 
Err11: 
 'codice di gestione degli errori 
Resume Next 
End Sub
Il gestore degli errori abilitato e attivo
Un gestore di errori è detto attivato quando un’istruzione On Error viene eseguita e indica il codice che viene eseguito quando si verifica un errore e l'esecuzione viene trasferita in un'altra posizione tramite la dichiarazione On Error Goto [etichetta]. Possiamo definire un blocco di gestione degli errori, chiamato anche gestore di errori, una sezione del codice che prende il controllo del programma attraverso una dichiarazione On Error Goto [etichetta]. Questo codice deve essere progettato sia per risolvere il problema e riprendere l'esecuzione nel blocco di codice principale o di interrompere l'esecuzione della procedura, non è possibile utilizzare On Error Goto [label] semplicemente per “saltare” tra le linee di codice. Ad esempio, il seguente codice non funzionerà correttamente:
Codice:
On Error GoTo Err1: 
Debug.Print 1/0 
 'altro codice 
Err1: 
On Error GoTo Err2: 
Debug.Print 1/0 
 'altro codice 
Err2:
Quando si verifica il primo errore, il flusso del programma viene trasferito alla linea Err1 ma l’errore è ancora attivo quando si verifica il secondo errore, e quindi quest’ultimo non viene intercettato dalla istruzione On Error.


L'istruzione Resume
La dichiarazione Resume indica al VBA un punto specifico del codice dove riprendere l’esecuzione, inoltre è possibile utilizzare Resume solo in un blocco di gestione degli errori, qualsiasi altro uso causerà un errore. Si deve considerare che Resume è l'unico modo, a parte uscire dalla procedura, per uscire da un blocco di gestione degli errori. Si deve ricordare di non utilizzare la dichiarazione Goto per dirigere l'esecuzione del codice da un blocco di errore, agire in questo modo si causeranno strani problemi ai gestori di errori. La dichiarazione Resume può assumere tre forme sintattiche
  • Resume
  • Resume Next
  • Resume [Etichetta]
Usato da solo, Resume provoca l'esecuzione di riprendere alla riga di codice che ha causato l'errore, in questo caso è necessario assicurarsi che il blocco di gestione degli errori risolva il problema che ha causato l'errore iniziale, in caso contrario, il codice entrerà in un ciclo infinito, saltando tra la riga di codice che ha causato l'errore e il blocco di gestione degli errori. Il codice seguente tenta di attivare un foglio di lavoro che non esiste, questo provoca un errore, e il codice salta al blocco di gestione degli errori che crea il foglio, correggere il problema, e riprende l'esecuzione alla riga di codice che ha causato l'errore.
Codice:
On Error GoTo Err1:
    Worksheets("Foglio11").Activate 
    Exit Sub

    Err1:
    If Err.Number = 9 Then
        'il foglio non esiste, quindi lo crea
        Worksheets.Add.Name = "Foglio11"
       'torna alla riga di codice che ha causato il problema
        Resume
    End If
La seconda forma di Resume è Resume Next, che riprende l'esecuzione del codice nella riga immediatamente successiva alla riga che ha causato l'errore. Il seguente codice genera un errore (11 - divisione per zero) quando si tenta di impostare il valore di N. Il blocco di gestione degli errori assegna il valore 1 alla variabile N, e poi riprende l'esecuzione del codice con l'istruzione dopo l'istruzione che ha causato l'errore.
Codice:
On Error GoTo Err1:
    N = 1 / 0
    Debug.Print N
    Exit Sub

    Err1:
    N = 1
    'torna alla riga successive che ha causato l’errore
    Resume Next
La terza forma di Resume è Resume [etichetta] che porta l'esecuzione del codice a riprendere in un'etichetta di riga, questo permette di saltare una sezione di codice se si verifica un errore. Per esempio:
Codice:
On Error GoTo Err1:
    N = 1 / 0
       'codice che viene saltato se si verifica un errore 

    Label1:
    ‘codice da eseguire 
    Exit Sub

    Err1:
    ‘ritorna alla linea Label1
    Resume Label1:
Ogni procedura non deve necessariamente avere un codice di gestione degli errori quando si verifica un errore, VBA utilizza l'ultima istruzione On Error per dirigere l'esecuzione del codice, tuttavia, se la procedura in cui si verifica l'errore non ha un gestore degli errori, VBA guarda indietro attraverso le chiamate di procedura che portano al codice errato. Ad esempio, se la procedura A chiama B e B chiama C, e A è l'unica procedura con un gestore degli errori, se si verifica un errore nella procedura C, l'esecuzione di codice viene immediatamente trasferito al gestore di errore nella procedura A, saltando il codice rimanente in B .
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato   Rispondi citando
Vecchio 13-02-2012, 17.17.10   #4
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 Variabili: Nozioni di base



In programmazione, una variabile è un valore che viene affidato al computer per memorizzarlo temporaneamente nella sua memoria mentre il programma è in esecuzione. Si deve tener presente che la memoria del computer è suddivisa in piccole aree di stoccaggio utilizzate per contenere i valori delle applicazioni e quando si utilizza un valore nel codice, il computer lo memorizza in una di queste aree per poi rilasciarlo quando viene richiamato.

Immaginiamo che una variabile sia come una casella in cui si può inserire un dato di qualsiasi tipo e salvarlo per impiegarlo successivamente. Il nome della variabile è l'etichetta che identifica la casella e il contenuto della casella è il valore della variabile, la particolarità di una variabile è di poter cambiare il suo valore durante l'esecuzione della macro, mentre il nome rimane inalterato. Possiamo quindi sintetizzare che una variabile è il nome assegnato ad una specifica locazione di memoria del computer, e possiamo usare il nome della variabile per riferirci a qualsiasi dato contenuto in quella determinata locazione di memoria.

Il nome di una variabile deve essere scelto seguendo poche regole
  • Deve cominciare con una lettera dell'alfabeto
  • Dopo la prima lettera può contenere qualsiasi combinazione di numeri, lettere
  • Il nome di una variabile non può contenere spazi, punti o caratteri speciali quali =, +, -, / e simili.
  • Il nome della variabile non deve corrispondere a parole chiave di VBA
  • Il nome di una variabile deve essere unico, cioè non può essere duplicato all'interno di un modulo

Per creare una variabile, è abbastanza semplice, da quanto abbiamo esposto finora basta solo dargli un nome ed assegnarli un valore, vediamone un esempio.

alex = 10

Questo enunciato memorizza il valore 10 nella locazione di memoria denominata alex, se si tratta del primo enunciato VBA crea la variabile, riserva una locazione di memoria per contenere il dato della variabile e poi memorizza il valore 10 in questa nuova locazione di memoria specificato dal nome della variabile. Molto semplicemente basti ricordare che tutto ciò che si mette sul lato destro di un segno di uguale è quello che si sta tentando di memorizzare e tutto quello che si ha a sinistra del segno di uguale è il luogo in cui si sta cercando di conservarlo.
Se la variabile alex esiste già VBA memorizza il nuovo valore nella locazione di memoria a cui fa riferimento la variabile alex, in pratica sovrascrive il valore

Questa procedura è definita una "dichiarazione implicita", oppure "dichiarazione al volo", risulta molto comoda ma può presentare degli inconvenienti, infatti usando il metodo implicito la variabile creata da VBA è di tipo Variant (tutti i tipi di dati), inoltre se in seguito digitiamo il nome sbagliato (es. Alex), a seconda del punto in cui il nome sbagliato compare nel codice il VBA può generare un errore di runtime, oppure possiamo anche usare la sintassi corretta, ma così andremmo a distruggere il valore memorizzato precedentemente.

Allora come possiamo ovviare a questi inconvenienti? Dichiarando le variabili.

Dichiarazione di una variabile
Durante la scrittura del codice, è possibile utilizzare qualsiasi variabile semplicemente specificandone il nome, ed è possibile utilizzare qualsiasi nome per una variabile, ma per eliminare la possibilità di fare confusione, si deve innanzitutto far sapere al VBA che si prevede di utilizzare una variabile, al fine di prenotare l'area di stoccaggio. La dichiarazione delle variabili è definita “Dichiarazione esplicita" e presenta i seguenti vantaggi
  • Rende più veloce l'esecuzione del codice
  • Aiuta ad evitare errori di digitazione
  • Il codice risulta più facile da leggere
  • Normalizza l'uso delle maiuscole nel nome delle variabili, per esempio se dichiariamo la variabile come Alex e in seguito digitiamo alex VBA trasforma automaticamente alex in Alex.

La dichiarazione di una variabile comunica semplicemente al VBA il nome della stessa ma è comunque possibile utilizzare un mix di variabili dichiarate e non dichiarate. Se si dichiara una variabile e poi si inizia ad utilizzare un'altra variabile con un nome simile, per Visual Basic si stanno utilizzando due variabili e questo può creare confusione. La soluzione a questo problema è di dire a Visual Basic che una variabile non può essere utilizzata se non è stata dichiarata e per ottenere questo, basta inserire la parola chiave Option Explicit all'inizio del listato. Questa operazione può anche essere fatta automaticamente per ogni file controllando che sia inserita la spunta alla voce Richiedi dichiarazione di variabili nella finestra di dialogo Opzioni dell’editor di VB

Per dichiarare esplicitamente una variabile si usa la parola chiave Dim seguita da un nome. Ecco un esempio:

Dim nome_variabile che nel nostro esempio diventa Dim alex

E’ indubbio che dichiarando le variabili ne ricaviamo notevoli benefici, ma l'errore umano nella digitazione del codice è sempre in agguato, per tutelarsi ulteriormente possiamo inserire un'altra parola chiave Option Explicit, se aggiungiamo questa parola chiave nell'area delle dichiarazioni di un modulo, cioè all'inizio del modulo prima di qualsiasi altra dichiarazione o listato, il VBA ci richiede di dichiarare tutte le variabili tramite l'enunciato Dim prima di usarle, in pratica l'enunciato Option Explicit proibisce di dichiarare implicitamente variabili in ogni punto del modulo, possiamo dire che con l'istruzione Option Explicit abbiamo aggiunto un altro pezzettino al nostro listato per garantirne una perfetta esecuzione.

Una dichiarazione implicita contiene dati di tipo Variant, però il nostro obbiettivo è quello di abbinare le potenzialità di VBA per utilizzare o manipolare vari tipi di dati presenti nel nostro foglio di Excel, se per esempio volessimo eseguire una somma tra i dati contenuti in due variabili avremmo sicuramente una incompatibilità nei dati e quasi certamente ci verrà rimandato un errore. Per ovviare a questo ultimo inconveniente usiamo un'altra parola chiave nella dichiarazione della variabile e aggiungiamo anche il tipo di dati che andrà a contenere. La parola chiave è As e l'enunciato si presenta in questo modo:

Dim nome_variabile As tipo che nel nostro esempio diventa così Dim alex As Integer

Così facendo abbiamo creato una variabile di nome alex e abbiamo dichiarato che è di tipo numerico.
In una normale applicazione, non è raro dover utilizzare molte variabili e si dovrebbe prendere l'abitudine di dichiarare sempre una variabile prima di utilizzarla. Per dichiarare una nuova variabile dopo averne dichiarato una prima, si può semplicemente andare alla riga successiva e utilizzare la parola chiave Dim per dichiarare quella nuova. Ecco un esempio:

Dim pippo
Dim pluto

Allo stesso modo, è possibile dichiarare quante variabili vogliamo, inoltre è possibile dichiarare più variabili sulla stessa riga e per effettuare questa operazione, si utilizza sempre la parola chiave Dim separando i nomi delle variabili con una virgola. Ecco un esempio

Dim pippo, pluto, minni, alex

Vediamo un esempio di codice sul loro utilizzo

Codice:
Sub var1()
Dim alex As String
alex = "Ciao a tutti"
MsgBox alex
End Sub
e otteniamo un messaggio del genere

Fig. 1

In questo modo abbiamo dichiarato la variabile all'interno della routine o sub var1 e può essere usata solo in quella routine, infatti se usiamo questo codice

Codice:
Sub var1()
Dim alex As String
alex = "Ciao a tutti"
stampa_box
End Sub

Private Sub stampa_box()
MsgBox alex
End Sub
otteniamo un messaggio del genere

Fig. 2

Non ci viene rimandato un errore, in quanto il comando MsgBox viene eseguito, ma non vediamo nessuna scritta, cioè la variabile alex non viene riconosciuta e non appare nel nostro box. Abbiamo parlato poco sopra di dichiarazione delle variabili nell'area di dichiarazione del modulo, assieme alla parola chiave Option Explicit, abbiamo anche già visto i benefici di questa particolare procedura, ma se in quell'area aggiungessimo anche la dichiarazione della variabile cosa succederebbe? Semplicemente che la variabile sarebbe condivisa e utilizzabile da tutte le routine di quel modulo. Vediamo un esempio modificando il codice del listato sopra esposto

Codice:
Option Explicit
Dim alex As String
Sub var1()
alex = "Ciao a tutti"
stampa_box
End Sub

Private Sub stampa_box()
MsgBox alex
End Sub
Il listato va inserito nell’editor all’inizio del modulo come mostrato in figura 3

Fig. 3

Se eseguiamo questa macro verrà mostrato il contenuto della variabile in una finestra

Fig. 4

Avrete notato che nella routine principale è stato inserito il nome di un’altra routine cioè stampa_box, in questa forma la macro riconosce che quella è una chiamata ad un'altra macro e la esegue, inoltre la routine stampa_box è preceduta dalla funzione Private, che viene usata quando vogliamo utilizzare una routine di quel modulo e solo in quello, al tempo stesso questa ruotine non ci compare nella finestra di assegnazione delle macro.

Abbiamo visto l’utilità nell’inserire la parola chiave Option Explicit nel listato, è possibile evitare di inserire in ogni modulo tale riga di codice agendo nelle opzioni dell’editor per garantire che Option Explicit sia sempre inserito nella parte superiore del modulo operando in questo modo: dal menu Strumenti - Opzioni e nella finestra che ci viene mostrata mettere il flag alla voce Dichiarazione di variabili obbligatoria. Come mostrato in figura 5

Fig. 5

Messa la spunta cliccare sul tasto Ok per confermare. È ora necessario utilizzare sempre la parola chiave Dim per dichiarare una variabile, in caso contrario verrà rimandato un errore di “Variabile non definita”. Abbiamo anche visto l'uso della funzione Private, quando facciamo programmi con listati lunghi e usiamo diversi moduli, ne facilita l'interpretazione del codice e il debug in caso di errore.

Abbiamo visto che tutte le variabili dichiarate all’interno di una procedura sono disponibili solo all’interno della procedura in cui le dichiarate, mentre quelle che dichiarate a livello di modulo (come in Fig. 3) sono disponibili a tutte le procedure all’interno del modulo in cui sono state dichiarate, ma non sono disponibili a procedure in un modulo diverso. In VBA gli elementi che sono disponibili a tutti i moduli vengono definiti a validità pubblica e sono chiamati variabili globali, perché sono disponibili globalmente cioè in tutto il vostro programma tramite la parole chiave Public usando la seguente sintassi

Public NomeVariabile [As NomeTipo]

Dove NomeVariabile rappresenta un nome valido qualsiasi per identificare la variabile e NomeTipo un qualsiasi nome di tipo di dato valido per fare un esempio vediamo il listato di prima modificandone la dicitura con la parola chiave Public come mostrato in figura 6

Fig. 6

Utilizzare Public per dichiarare una variabile a livello globale può essere utile quando si ramifica il programma in diversi moduli ma è da usare con molta attenzione specialmente nell’assegnazione del nome alla variabile per evitare di creare confusione se esistono due variabili con lo stesso nome in moduli diversi, pertanto cercate di essere espliciti nell’uso della variabile nella forma Public

Tuttavia, si deve tener presente che ci troviamo in ambiente Excel, un foglio di calcolo, con celle che contengono valori, per cui dobbiamo chiederci anche cosa si vuole fare di questa variabile e del valore in esso contenuto. Dopo tutto, che senso avrebbe memorizzare un valore, se non lo si vuole usare? Quello che possiamo fare è di trasferire il nostro valore memorizzato nella variabile in una cella del foglio di calcolo.
Precedentemente abbiamo visto la proprietà di Range che tramite la proprietà Value può ottenere o impostare il valore di una cella, o un gruppo di cellule.
Per impostare un valore, la proprietà Range va messa prima di un segno di uguale, in questo modo:

Sheets(“Foglio1”) .Range ( "A1"). Value =

In questo modo vogliamo puntare al Range A1 del foglio con nome “Foglio1” e dopo il punto, dobbiamo quindi inserire il valore da assegnare alla cella A1 tramite la proprietà Value e dopo il segno di uguale, è possibile digitarne il valore in questo modo:

Sheets(“Foglio1”) .Range ( "A1"). Value = 10

Ora, il valore per la cella A1 sul foglio di lavoro “Foglio1” è impostato su 10
Per assegnare un valore è possibile digitare il nome di una variabile invece di digitare un numero. Se nel listato del codice abbiamo precedentemente assegnato il valore 10 alla variabile “var1” possiamo esprimere il listato in questo modo:

Sheets(“Foglio1”) .Range ( "A1"). Value = var1

VBA vede la variabile denominata var1 quindi recupera qualsiasi valore memorizzato all'interno di esso e tale valore viene quindi memorizzato all'interno di ciò che è a sinistra del segno uguale.
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato   Rispondi citando
Vecchio 13-02-2012, 17.19.19   #5
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
Prendere decisioni – Ciclo If e Select Case



Finora abbiamo visto delle procedure che sono in grado di portare a termine i compiti assegnati, ma però non sono in grado di prendere delle decisioni che permettano di eseguire diverse azioni in circostanze differenti, operazione che risultano necessarie in molte situazioni. A volte è necessario che sia la procedura stessa ad offrire la possibilità di poter scegliere quale azione intraprendere al verificarsi di un determinato evento, per esempio possiamo scrivere una procedura che controlli una colonna in un foglio di lavoro per verificare se tutti i numeri sono compresi tra 1 e 10, inoltre la procedura potrebbe poi esaminare ogni elemento della colonna separatamente ed eseguire azioni particolari se incontra un elemento non compreso nell'intervallo specificato.


Il Ciclo IF
Poichè le istruzioni per l'esecuzione di scelte modificano il flusso di esecuzione del programma, vengono spesso chiamate istruzioni di controllo di flusso o di controllo di programma, ma sono più note tecnicamente agli addetti ai lavori come istruzioni condizionali e incondizionali. Un'istruzione condizionale è una struttura per l'esecuzione di scelte, che sceglie un blocco di istruzioni del codice del programma basandosi su una condizione o su un gruppo di condizioni predefinite, mentre un'istruzione incondizionale è un'istruzione che modifica semplicemente il flusso di esecuzione della procedura senza dipendere da nessuna condizione specifica. Vediamo in dettaglio questo concetto. Per eseguire un'istruzione condizionale usiamo la funzione If ed è rappresentata in due modi

If Condizione Then
Istruzioni
End If


Oppure a riga singola

If Condizione Then Istruzioni

Quando VBA incontra un'istruzione condizionale come If ....Then, prima valuta l'espressione logica che descrive le condizioni, in base alle quali deve essere eseguita una particolare azione, se l'espressione è True (cioè vera) le condizioni predefinite sono state soddisfatte e vengono eseguite le istruzioni indicate, mentre End If indica la fine del ciclo decisionale. Vediamo questa procedura con degli esempi
Codice:
Sub prova()
 Dim var1 As Integer
 var1 = "1"
 If var1 = "1" Then MsgBox ("Bravi")
End Sub
In pratica la funzione fa questa valutazione: se la variabile var1 è uguale a "1", [Valutazione delle condizioni], e la valutazione è True (cioè è vera), allora fai apparire un messaggio con la scritta Bravi, (Esegui l'istruzione), possiamo anche specificare più di un'azione da intraprendere in base alle condizioni usando il seguente enunciato

If Condizione Then
Istruzioni
Else
Istruzioni per Else
End If


In pratica da quanto sopra esposto aggiungiamo altre istruzioni nel caso che la condizione non venga soddisfatta, lo possiamo capire meglio con questo esempio
Codice:
Sub prova1()
Dim var1 As Integer
var1 = "2"
If var1 = "1" Then 
 MsgBox ("Bravi")
Else
 MsgBox ("Condizione non soddisfatta")
End If
End Sub
Oppure usando l'enunciato a riga singola
Codice:
Sub prova()
Dim var1 As Integer
var1 = "2"
If var1 = "1" Then MsgBox ("Bravi") Else MsgBox ("Condizione non soddisfatta")
End Sub
Finora abbiamo visto delle istruzioni condizionali capaci di scegliere un singolo blocco di istruzioni alternativo per l'esecuzione della procedura, in molti casi però abbiamo bisogno di fare delle scelte più complesse scegliendo fra tre o quattro o più blocchi di istruzioni da eseguire, possiamo in questo caso inserire delle istruzioni If ... Then o If ... Then .. Else all'interno di altre istruzioni If ... Then o If ... Then .. Else, questa operazione si chiama "Nidificare" le istruzioni (nidificare significa mettere un tipo di struttura di controllo del flusso all'interno di un'altra), per usare questa sintassi è meglio usare il formato a blocchi, per una maggiore chiarezza e semplicità di lettura, l'enunciato è espresso in questa forma

If Condizione Then
Istruzioni
Else
If Condizione1 Then
Istruzioni1
Else
Istruzioni 2
End If
End If


Vediamo con un esempio come nidificare più istruzioni ed usiamo anche la funzione InputBox che abbiamo visto all'inizio
Codice:
Sub nidifica()
Dim var1
var1 = InputBox(prompt:="Inserisci a quanti gradi metti il termostato del riscaldamento: ", Title:="Misura la temperatura di casa")
If Pianeta > 20 Then
 MsgBox "Troppo caldo, vedrai che bolletta"
Else
  If var1 > 18 Then
  MsgBox "Temperatura giusta"
  Else
  MsgBox "Temperatura troppo bassa, ti prendi un raffreddore"
  End If
End If
End Sub
Eseguendo questa macro e inserendo il valore 30 otteniamo questo:

Fig. 1 Fig. 2

Se invece inseriamo il valore 19 otteniamo questi messaggi

Fig. 3 Fig. 4

Inserendo invece il valore 17 ci viene mostrato questo avviso

Fig. 5 Fig. 6

Vediamo nel dettaglio casa abbiamo fatto, per comprendere meglio la nidificazione usiamo anche i colori, all'inizio abbiamo dichiarato la variabile var1 ed abbiamo omesso di specificare il tipo di dati (ricordate che nella lezione 3 abbiamo detto che non dichiarando il tipo di dati la variabile assumeva per default il tipo Variant, in questo esempio è di scarsa importanza il tipo di dati), poi tramite la funzione InputBox abbiamo richiesto un dato dall'utente e di seguito abbiamo elencato le condizioni.

La prima If var1 > 20 Then confronta il valore della variabile var1 e avendole assegnato il valore 30 tramite InputBox viene soddisfatta la prima condizione che abbiamo posto, cioè, se var1 è maggiore di 20, porta a video il messaggio Troppo caldo, vedrai che bolletta a questo punto che la condizione è stata verificata e soddisfatta l'esecuzione continua dopo la parola chiave End If, in questo caso segue la procedura di colore blu e ci riporta a fine codice.

Se nell'InputBox inseriamo un valore diverso (ad esempio 20) la prima condizione If var1 > 20 Then non viene soddisfatta ed allora passiamo alle istruzioni Else dove, in questo blocco di istruzioni, abbiamo posto 2 condizioni, la prima che viene verificata è If var1 > 18 Then (Se var1 è maggiore di 18), porta a video il messaggio Temperatura giusta, nel nostro caso avendo inserito il valore 20 viene soddisfatta questa condizione in quanto è maggiore di 18. Nello stesso blocco Else abbiamo anche posto un'altra condizione senza nessun valore, che significa, semplicemente che se il valore che introduciamo con InputBox non soddisfa la condizione If var1 > 18 Then allora il flusso del programma esegue le istruzioni di questa istruzione, infatti se inseriamo il valore 15 ci viene riportato a video il messaggio "Temperatura troppo bassa, ti prendi un raffreddore".

Ma perchè queste scelte avvengono così? perchè le istruzioni Else sono contenute completamente all'interno dell'istruzione più esterna, e quando viene verificato il valore della variabile Var1 viene mandato in esecuzione il blocco di codice quando il valore della variabile è True (vera) ne consegue che inserendo il valore 30 Var1 diventa True alla prima condizione ed esegue il flusso di codice di colore blu, invece se assegniamo a Var1 il valore 20 diventa True alla prima istruzione delle condizioni nidificate nel blocco Else, ogni altro valore assegnato [da 1 a 18] alla variabile Var1 viene eseguita l'ultima istruzione del blocco Else.

Possiamo semplificare il listato della nidificazione usando un'abbreviazione che si presenta con If ... Then .. ElseIf e la possiamo rappresentare con il seguente enunciato

If Condizione Then
Istruzioni
ElseIf Condizione1 Then
Istruzioni1
Else
Istruzioni 2
End If


Consideriamo questo enunciato come un'abbreviazione, il concetto sopra esposto non varia, la nostra macro diventa così
Codice:
Sub nidifica_abbreviato()
Dim var1
var1 = InputBox(prompt:="Inserisci a quanti gradi metti il termostato del riscaldamento: ", Title:="Misura la temperatura di casa")
If var1 > 20 Then
 MsgBox "Troppo caldo, vedrai che bolletta"
ElseIf var1 > 18 Then
 MsgBox "Temperatura giusta"
Else
 MsgBox "Temperatura troppo bassa, ti prendi un raffreddore"
End If
End Sub
Funzione Select Case
Le procedure che abbiamo visto finora sono moto utili con un numero ristretto di scelte da effettuare, ma presentano un problema quando ci sono molte condizioni da verificare, tale problema è di natura interpretativa in quanto diventa difficile leggere ed interpretare il listato del codice. VBA ci offre però un'istruzione condizionale da usare quando dobbiamo scegliere tra un gran numero di possibili scelte.

L'istruzione Select Case funziona allo stesso modo di più istruzioni IF indipendenti ma è più facile da eseguire ed interpretare, usando la parola chiave Select Case con più istruzioni Case, dove ogni istruzione Case verifica la presenza di una condizione e se saranno soddisfatte le condizioni, verrà eseguito il codice di un solo blocco Case, inoltre un blocco Case può contenere nessuna, una o più istruzioni, pertanto da questa breve introduzione possiamo affermare che in presenza di varie scelte da effettuare risulta un metodo molto utile e versatile oltre che facilmente leggibile. L'istruzione Select Case ha questa sintassi

Select Case espressione
Case elencoespressione1
Istruzioni1
Case elencoespressione2
Istruzioni2
etc...
Case elencoespressione n
[Case Else
IstruzioniElse]
End Select


Come già citato il concetto e l'utilizzo è uguale a più istruzioni IF, Select Case in più offre la possibilità di poter operare varie scelte e anche di utilizzare un operatore per specificare un intervallo di valori nell'elenco espressioni, tale operatore è To ed è espresso in questa forma: espressione1 To espressione2, per esempio possiamo specificare un intervallo di numeri da 1 a 10 in un elenco Case usando la seguente dicitura

Case 1 To 10

è inoltre possibile usare degli operatori di confronto per selezionare dei blocchi di istruzioni a seconda se espressione è maggiore, minore o uguale di espressione, la sintassi è la seguente:

Is operatore_di_confronto espressione, che semplificato prende questa forma: Case Is < 10

Vediamo ora con un esempio pratico di semplificare ulteriormente quanto esposto e trasformiamo la routine utilizzata con l'operatore IF con Select Case
Codice:
Sub Selec_cast()
Dim var1
var1 = InputBox(prompt:="Inserisci a quanti gradi metti il termostato del riscaldamento: ", Title:="Misura la temperatura di casa")
Select Case var1
  Case Is > 25 
    MsgBox "Troppo caldo, vedrai che bolletta"
  Case 21 To 23
    MsgBox "Bello caldo, si stà bene"
  Case 17 To 20
    MsgBox "Temperatura giusta"
  Case > 15
    MsgBox "Raffredore assicurato"
  Case Else
    MsgBox "Troppo freddo si ghiaccia"
End Select
End Sub
Diamo una breve spiegazione a conclusione di questa lezione, sul listato appena esposto, avrete notato che è molto intuitivo, ma vediamo assieme come vengono interpretate le varie condizioni.

Abbiamo dichiarato una variabile [var1] ed abbiamo assegnato alla stessa un valore fornito dall'utente tramite la funzione InputBox, all'inizio del ciclo Select Case notiamo che è presente una sola variabile [var1], come abbiamo citato nella lezione sulle variabili il risultato di un'espressione contenente una singola variabile è il valore memorizzato nella variabile stessa, di conseguenza VBA confronta il valore memorizzato nella variabile Var1 con le condizioni specificate in ogni blocco Case dell'istruzione Select Case.

Innanzi tutto VBA controlla il valore della variabile var1 partendo dalla prima clausola Case, se assegniamo alla variabile il valore 28 viene subito soddisfatta la prima condizione Case Is > 25 è maggiore di 25? in questo caso si, la condizione diventa True e vengono eseguite le istruzioni di quel blocco Case, allo stesso modo se la variabile assume il valore 22, la prima condizione non viene soddisfatta [non è maggiore di 25] e VBA passa alla seconda [il valore è compreso tra 21 e 23?], Si, pertanto la condizione diventa True al secondo blocco Case ed esegue le relative istruzioni.
In buona sostanza possiamo mettere diverse condizioni, sia singole che intervalli, nell'enunciato Else vengono invece inserite le istruzioni nel caso nessuna delle condizioni elencate venga soddisfatta, in questo caso vengono eseguite le istruzioni presenti nel blocco Else


Utilizzare la parola chiave To
Si può utilizzare la parola chiave To nell’espressione da valutare per specificare l'intervallo superiore e inferiore dei valori corrispondenti, come illustrato di seguito. Il valore a fianco della parola chiave To deve essere minore o uguale al valore a destra della parole chiave To.
Codice:
Sub Test1 () 
Dim voti As Integer
voti = InputBox ("Inserisci Voto")
Select Case voti
Caso 70 To 100
MsgBox "Buono"
Caso 40 To 69
MsgBox "Medio"
Caso 0 To 39
MsgBox "Bocciato"
Case Else
MsgBox "Fuori Valutazione"
End Select
End Sub
Utilizzare la parola chiave Is
Per includere un operatore di confronto (=, <>, <,>, <= o> =) nell’espressione da valutare si utilizza la parola chiave Is, che viene inserita automaticamente prima di un operatore di confronto, se non espressamente incluso.
Codice:
Sub Test2 () 
'se temperatura è uguale a 39,5, verrà restituito il messaggio "Moderatamente caldo"
Dim temp As Single
temp = 39.5
Select Case temp
Caso Is > = 40
MsgBox "Troppo Caldo"
Caso Is > = 25
MsgBox "Moderatamente caldo"
Caso Is > = 0
MsgBox "Troppo Freddo"
Caso Is <0
MsgBox "Molto Freddo"
End Select
End Sub
Utilizzare una virgola per separare più espressioni
Si possono specificati più espressioni o intervalli in ogni istruzione Case, separando ogni espressione con una virgola, che ha l'effetto dell’operatore OR. Più espressioni o intervalli possono essere specificati per stringhe di caratteri.
Codice:
Sub Test3 () 
Dim var As Variant
var = "Ciao"
Select Case var
Case a, e, i, o, u
MsgBox "Vocali"
Cas2 2, 4, 6, 8
MsgBox "Numeri"
Caso 1, 3, 5, 7, 9, "Ciao"
MsgBox "Numeri o Ciao"
Case Else
MsgBox "Non Valutabile"
End Select
End Sub
Esempio: Confronto tra stringhe "mele" A "uve" determina un valore compreso tra "mele" e "uve" in ordine alfabetico, e utilizza il metodo di confronto di testo predefinito in Binary (che è case-sensitive), perché Istruzione Option Compare è non specificata
Codice:
Sub Test4 () 
'Option Compare non è specificato e quindi il confronto testo sarà case-sensitive 
Dim var As Variant, risultato As String
var = InputBox ("Inserisci dati")
Select Case var
Case 1 To 10, 11 To 20: risultato = "Il numero è compreso tra 1 e 20"
Case "mele" To "uva", "mango", 98, 99: risultato = "Testo tra mele e uva, o mango, oppure tra i numeri 98 o 99"
Case Else: risultato = "Non Valutabile"
End Select
MsgBox risultato
End Sub
Impostazione Option Compare
È possibile confrontare i dati stringa utilizzando metodi di confronto tra stringhe in binario, testo o database. (quest’ultimo viene utilizzato solo con Microsoft Access). Option Compare Binary rende confronti di stringhe sulla base di un ordinamento binario (in Microsoft Windows, la pagina di codice determina il tipo di ordinamento - in cui ANSI 1252 è utilizzato per l'inglese e molte lingue europee), inoltre Option Compare Text rende i confronti di stringhe che non si basano su un ordinamento testuale case-sensitive

L'istruzione Option Compare (cioè Option Compare Binary o Option Compare Text ) può essere utilizzato per impostare il metodo di confronto e deve essere utilizzato a livello di modulo, prima di qualsiasi procedura. Se l'istruzione Option Compare non è specificata, il metodo di confronto testo predefinito è Binary.
Codice:
Option Compare Binary 
Sub Compare1 () 
Dim str As String
str = InputBox("Inserisci il testo ")
Select Case str
Case "Mele" To "Uva"
MsgBox " Il testo è tra mele e uva "
Case Else
MsgBox "Non Valutabile"
End Select
End Sub
 
Option Compare Text 
Sub Compare2 () 
Dim str As String
str = InputBox ("Inserisci il testo")

Select Case str 
Case "mele" To "uve"
MsgBox "Il testo è tra mele e uva"
Case Else
MsgBox "Non Valutabile"
End Select
End Sub
Select Case Annidati
Il blocco di istruzioni Select Case può essere nidificato all'interno di ogni altro ciclo, come If ... Then ... Else e Loop, senza alcun limite. Quando Select Case è nidificato dentro l'altro, deve essere un blocco completo e terminare con la propria End Select , all'interno di una specifica Case o Case Else
Codice:
Sub select1 () 
Dim rng As Range, int1 As Integer
Set rng = ActiveSheet.Range ("A1")
Select Case IsEmpty (rng)
Case True
MsgBox rng.Address & "è vuota"
Case Else
Select Case IsNumeric (rng)
Case True
MsgBox rng.Address e "ha un valore numerico"
Select Case rng.HasFormula
Case True
MsgBox rng.Address & "ha anche una formula"
End Select
Case Else
Int1 = Len (rng) 
MsgBox rng.Address & "ha una lunghezza di testo di" & int1
End Select
End Select
End Sub
Esempio: Manipolazione del testo con le istruzioni condizionali nidificati
Codice:
Funzione StringManipulation (str As String) As String 
'Questo codice personalizza una stringa di testo come segue: 
1. rimuove i numeri da una stringa di testo; 
'2. rimuove gli spazi iniziali e finali  
'3. aggiunge uno spazio (se non presente) dopo ogni esclamazione, virgola, punto e il punto interrogativo; 
'4. capitalizza la prima lettera della stringa e la prima lettera di una parola dopo ogni esclamazione, punto e basta e il punto interrogativo;
Dim iTxtLen As Integer, iStrLen As Integer, n As Integer, i As Integer, ansiCode As Integer
'Toglie i numeri 
'Chr (48) chr (57) rappresentano numeri da 0-9 in codici di caratteri ANSI / ASCII
For i = 48 To 57
'Rimuovere tutti i numeri dalla stringa di testo usando la funzione Replace
str = Replace (str, Chr (i), "" )
Next i
'Toglie gli spazi  con la funzione TRIM
str = Application.Trim (str)
 'Aggiunge uno spazio (se non presente) dopo ogni ! ; ? . 
iTxtLen = Len (str)
For n = iTxtLen To 1 Step -1
'Chr spazio (32) ritorna; Chr (33) restituisce esclamativo; Chr (44) restituisce virgola; Chr (46) restituisce piena di arresto; Chr (63) restituisce il punto interrogativo;
If Mid (str, n, 1) = Chr (33) Or Mid (str, n, 1) = Chr (44) Or Mid (str, n, 1) = Chr (46) Or Mid (str, n, 1 ) = Chr (63) Then
'Controllare se lo spazio non è presente
If Mid (str, n + 1, 1) <> Chr (32) Then
'Utilizzando Mid e funzioni Destra per aggiungere spazio - notare che viene usato lunghezza della stringa corrente
str = Mid (str, 1, n) & Chr (32) & Right (str, iTxtLen - n)
'Update lunghezza della stringa - incrementa di 1 dopo l'aggiunta di uno spazio (carattere)
iTxtLen = iTxtLen + 1
End If
End If
Next n
'Cancella gli spazi (se presenti) prima di ogni esclamativo etc….  
'Reset della lunghezza della stringa
iTxtLen = Len (str)
For n = iTxtLen To 1 Step -1
'Chr spazio (32) ritorna; Chr (33) restituisce esclamativo; Chr (44) restituisce virgola; Chr (46) restituisce piena di arresto; Chr (63) restituisce il punto interrogativo
If Mid (str, n, 1) = Chr (33) Or Mid (str, n, 1) = Chr (44) Or Mid (str, n, 1) = Chr (46) Or Mid (str, n, 1 ) = Chr (63) Then
'Controllare se lo spazio è presente
If Mid (str, n - 1, 1) = Chr (32) Then
'Utilizzando il foglio di lavoro funzione Sostituisci per eliminare uno spazio
str = Application.Replace (str, n - 1, 1, "" )
'Omettere ricontrollare nuovamente lo stesso carattere - la posizione di n spostamenti (diminuisce di 1) dovuto alla cancellazione di un carattere di spazio
n = n - 1
End If
End If
Next n
'Capitalizzare la prima lettera della stringa e la prima lettera di una parola dopo ogni esclamazione, punto e basta e il punto interrogativo, mentre tutte le altre lettere sono minuscole
iStrLen = Len (str)
For i = 1 To iStrLen
'Determinare il codice ANSI di ogni carattere della stringa
ansiCode = Asc (Mid (str, i, 1))
Select Case ansiCode
'97 A 122 sono i codici ANSI equiparano a lettere piccole cap "a" alla "z"
Case 97 To 122
If i> 2 Then
'Capitalizza una lettera la cui posizione è 2 caratteri dopo (1 carattere dopo, sarà il carattere di spazio aggiunto in precedenza) un punto esclamativo, punto e basta e il punto interrogativo
If Mid (str, i - 2, 1) = Chr (33) Or Mid (str, i - 2, 1) = Chr (46) Or Mid (str, i - 2, 1) = Chr (63) Then
Mid (str, i, 1) = UCase (Mid (str, i, 1))
End If
'Capitalizzare la prima lettera della stringa
ElseIf i = 1 Then
Mid (str, i, 1) = UCase (Mid (str, i, 1))
End If
'Se la maiuscola, passare al carattere successivo (es. next i)
Case Else
GoTo salta
End Select
salta:
Next i
'Stringa manipolata
StringManipulation = str
End Function
 
Sub Str_Man () 
'specificare la stringa di testo per manipolare e ottenere stringa manipolato
Dim strText As String
'Specificare la stringa di testo, che deve essere manipolato
strText = ActiveSheet.Range ( "A1" ). Valore
'La stringa di testo manipolato viene inserito nella gamma A5 del foglio attivo, in esecuzione della procedura
ActiveSheet.Range ("A5"). Value = StringManipulation (strText)
End Sub
L’istruzione GoTo
Si utilizzare l'istruzione GoTo per passare a una linea all'interno della procedura e questa istruzione si compone di 2 parti:
  • La dichiarazione GoTo che è la parola chiave GoTo seguita da una etichetta che è l'identificatore
  • L'etichetta che è costituita dal nome della stessa seguita da due punti, e poi ha una riga di codice.
Se viene soddisfatta una condizione, con l’istruzione goto viene trasferito il controllo ad una linea separata del codice all'interno della procedura, identificato dall’etichetta. L’ istruzione Goto è di solito evitabile se c'è una soluzione alternativa, molte volte è possibile utilizzare If ... Then ... Else o Select Case, in quanto GoTo rende il codice poco leggibile e un po’ confuso. Si consiglia di utilizzarlo per la gestione degli errori, vale a dire. "On Error GoTo".
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato   Rispondi citando
Vecchio 13-02-2012, 17.22.02   #6
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
Azioni ripetitive : Il Ciclo Do Loop




Abbiamo parlato di due tipi di cicli, quelli ad interazione fissa e quelli ad interazione indefinita, il ciclo Do ..Loop appartiene ai cicli ad interazione indefinita, VBA ci fornisce questa istruzione estremamente potente per costruire strutture cicliche indefinite nelle nostre funzioni o procedure. Essenzialmente è costituito da una singola istruzione: Do. Questa istruzione ha molte opzioni ed è talmente flessibile che ci fornisce quattro diverse possibilità per costruire dei cicli raggruppati in due diverse categorie di base, che sono i cicli controllati da un contatore e i cicli controllati da eventi, quale è la differenza?

In un ciclo controllato da un contatore, le istruzioni del corpo del ciclo vengono eseguite finchè il valore è inferiore o superiore al limite specificato, in sostanza non varia molto dal ciclo For ..Next, eccetto che il programmatore è direttamente responsabile per l'inizializzazione della variabile contatore e per l'incrementazione o decrementazione del contatore. Potremmo usare il ciclo Do se il passo del contatore non è regolare, o se non c'è modo di determinare il limite finale se non dopo che il ciclo ha iniziato la sua esecuzione. Per esempio se vogliamo spostarci attraverso 15 righe di un foglio, alcune volte avanzando di una sola riga e altre volte avanzando di due righe, poichè il numero di righe da avanzare (cioè il passo del contatore) cambia, non possiamo usare il ciclo For ..Next ma dobbiamo usare il ciclo Do

Per i cicli controllati da eventi, le istruzioni vengono eseguite quando la determinante del ciclo diventa vera o falsa sulla base di alcuni eventi che si verificano all'interno del corpo del ciclo. Per esempio potremmo scrivere un ciclo che viene eseguito indefinitamente fino a quando l'utente non inserisce un particolare valore in una finestra di dialogo input, e l'inserimento di questo particolare valore è l'evento che termina il ciclo, oppure possiamo eseguire delle operazioni sulle celle di un foglio fino a quando non si raggiunge la cella vuota di una colonna, anche in questo caso il raggiungimento della cella vuota è l'evento che termina il ciclo. Per ora abbiamo chiarito le due categorie di cicli, abbiamo capito che esistono cicli controllati da un contatore e cicli controllati da eventi, vediamo ora la sintassi

Do
istruzioni
Loop Until condizione

e qualche esempio.
Codice:
Sub ciclo1()
Dim a As Integer
Do
 a = a + 1
 MsgBox (a)
Loop Until a = 10
End Sub
Questo è un ciclo controllato da un contatore, noterete che c'è poca differenza dal ciclo For ..Next , infatti otteniamo lo stesso effetto, cioè portiamo a video un messaggio col valore della variabile finchè non arriva a 10, ma abbiamo visto poco sopra che abbiamo quattro diverse possibilità di costruire cicli divisi in due categorie, ora le categorie le abbiamo viste ( cicli controllati da un contatore e i cicli controllati da eventi) vediamo ora i quattro modi di costruire un ciclo, il listato sopra esposto è un metodo, vediamo ora gli altri e dopo li commentiamo assieme
Codice:
Sub ciclo2()
Dim a As Integer
Do Until a = 10
 a = a + 1
 MsgBox (a)
Loop
End Sub

Sub ciclo3()
Dim a As Integer
Do
a = a + 1
MsgBox (a)
Loop While a <> 10
End Sub

Sub ciclo4()
Dim a As Integer
Do While a <> 10
a = a + 1
MsgBox (a)
Loop
End Sub
Come potete vedere la differenza sta nell'enunciato di dichiarazione del ciclo, il risultato non cambia ma le parole chiave e la loro collocazione si, vediamo come viene interpretato l'enunciato : Do Until a = 10 [Ripeti finchè a = 10], oppure Do While a <> 10 [Ripeti finchè a è diverso da 10], in questi 2 casi la differenza fondamentale è che viene verificata la condizione determinante prima che venga eseguito il ciclo, infatti se a fosse = a 20 il ciclo non verrebbe eseguito, gli altri 2 metodi Do ......Loop While a <> 10 e Do ...... Loop Until a = 10 vengono interpretati come spiegato sopra, ma la determinate del ciclo viene verificata alla fine del ciclo.

In pratica la forma Do ... Loop While e Do ... Loop Until prima vengono eseguite le istruzioni presenti nel ciclo e poi quando raggiunge la parola chiave Loop viene verificata la condizione (vedi sintassi) se condizione è False (nel caso si usi Until VBA ritorna all'inizio del ciclo ed esegue nuovamente le istruzioni del ciclo, se invece usiamo la forma While la condizione da verificare deve essere True, mentre nelle altre 2 forme espresse Do Until ...Loop e Do While ...Loop la condizione invece viene verificata subito. Vediamo un esempio che semplifica e chiarifica quanto esposto.
Supponiamo di far comparire a video un Inputbox per chiedere informazioni all'utente, e poi verificare se i dati immessi siano validi, in questo caso inseriamo nel nostro ciclo dobbiamo eseguire le istruzioni (far comparire il messaggio di Input) e all'inserimento dei dati da parte dell'utente verifichiamo la condizione, il listato si presenta così
Codice:
Sub esempio1()
Dim pass As String
Do
pass = InputBox(prompt:="Inserisci password di accesso per Proseguire: ", Title:="Controllo accessi")
Loop Until pass = "Alex"
MsgBox "Password esatta: Accesso consentito", vbInformation + vbYes, "Verifica Password"
End Sub
Se proviamo questo codice vedremmo che il ciclo continua a ripetere le istruzioni finchè non viene digitata la password esatta, però se vogliamo uscire perchè non ricordiamo la password?, anche premendo sul tasto "Annulla" dell'Inputbox le istruzioni continuano ad essere ripetute lo stesso, allora è sempre meglio porre una condizione per evitare di proseguire, ma al tempo stesso controllare che l'esecuzione del ciclo avvenga correttamente, in pratica mettiamo l'utente in grado di uscire da un ciclo senza però che eviti di inserire la password richiesta. Per ovviare a questo modifichiamo il listato in questo modo.
Codice:
Sub esempio2()
Dim pass As String
Do
pass = InputBox(prompt:="Inserisci password di accesso per Proseguire: ", Title:="Controllo accessi")
If pass <> "Alex" Then Exit Sub
Loop Until pass = "Alex"
MsgBox "Password esatta : Accesso consentito", vbInformation + vbYes, "Verifica Password"
End Sub
Inserendo la riga con il ciclo IF abbiamo posto una condizione, cioè "Se pass è diverso da "Alex" esci dalla sub", attenzione, che esci dalla sub non vuol dire proseguire, ma semplicemente abbandoniamo questa routine che in ogni caso per poter proseguire dobbiamo inserire la password giusta, questa semplice metodica viene chiamata Uscita forzata dal ciclo".
Anche con l'altro metodo cioè Do Until ...Loop e Do While ...Loop il risultato non cambia, pertanto non c'è una regola ben precisa su quale forma sia meglio usare, possiamo dire che a disposizione VBA ci mette queste forme, sta a noi usare quella che ci pare più logica o intuitiva per esprimere quello che vogliamo esegua il nostro codice. Se vi ricordate nella lezione precedente avevamo parlato della nidificazione del ciclo IF, anche nei cicli For ... Next e Do ...Loop è possibile eseguirla, visto che l'argomento lo abbiamo già toccato in questo contesto facciamo subito un esempio e dopo lo commenteremo assieme
Codice:
Sub scrivi_col_for()
For riga = 12 To 35
 For colonna = 7 To 18
 Cells(riga, colonna).Value = riga
 Next colonna
Next riga
End Sub
Cosa abbiamo fatto? se provate ad eseguire la macro vedrete che nell'area di lavoro abbiamo riempito tutte le celle con il numero della riga corrispondente. Vediamo il codice For riga = 12 To 35 il contatore del ciclo è rappresentato dalla variabile riga e gli diciamo [Per riga che và da 12 a 35] e subito dopo invece di far eseguire le istruzioni gli mettiamo un'altro enunciato For colonna = 7 To 18 in questo caso il contatore del ciclo è rappresentato dalla variabile colonna e lo interpretiamo così [Per colonna che và da 7 a 18] , a questo punto abbiamo posto due condizioni una sotto l'altra e subito dopo abbiamo posto le istruzioni Cells(riga, colonna).Value = riga in questo enunciato la parola chiave Cells (che vedremmo nella prossima lezione) sta ad indicare una determinata cella del nostro foglio localizzata dai valori delle variabili riga e colonna, l'altra parola chiave Value indica il valore da inserire nelle coordinate rappresentate, tale valore lo abbiamo identificato con riga.

Seguendo l'esecuzione del ciclo, prima viene eseguito il ciclo interno, e cominciamo dalla cella che si trova all'intersezione tra la colonna n° 7 e la riga n° 12 che sul nostro foglio è rappresentata da G12, al cui interno scriviamo il valore di riga (per cui 12), poi incontriamo la parola chiave Next colonna, a questo punto però non abbiamo ancora raggiunto la determinante del ciclo (rappresentato dal valore [18]) e VBA incrementa il contatore di 1 e ripete le istruzioni, così facendo andiamo a scorrere tutte le colonne e scriviamo al loro interno il valore della variabile riga.

Una volta raggiunta la determinante del ciclo usciamo dal ciclo interno ma troviamo la parola chiave Next riga, per cui il contatore del ciclo esterno viene incrementato, passiamo alla riga successiva (la 13) e ripetiamo il ciclo interno come abbiamo descritto sopra. Il nostro listato ha fine quando viene raggiunta la determinate del ciclo esterno e a questo punto troveremo la nostra area di lavoro riempita con il valore della variabile riga estesa sulle colonne di ciascuna riga. Ora che abbiamo riempito l'area con il valore della riga tramite un ciclo For Next nidificato potremmo vedere un listato Do Loop per fare il contrario, cioè riempire l'area col valore della colonna.
Codice:
Sub scrivi_col_dolop()
riga = 12: colonna = 7
Do Until riga = 35
 Do While colonna <> 19
 Cells(riga, colonna).Value = colonna
 colonna = colonna + 1
 Loop
riga = riga + 1: colonna = 7
Loop
End Sub
Notiamo subito una netta differenza tra i due cicli, infatti abbiamo dovuto dichiarare i valori iniziali delle variabili riga e colonna prima dell'inizio del ciclo (riga = 12: colonna = 7) in questa tipologia ciclica il VBA non riesce a determinare da dove deve iniziare, in quanto la sintassi di espressione è diversa, una volta indicati i valori di partenza troviamo la prima parola chiave Do Until riga = 35 [ripeti finchè il valore di riga non è uguale a 35] e subito dopo abbiamo posto l'altra condizione che costituisce il ciclo interno Do While colonna <> 19 facciamo attenzione a questo enunciato, abbiamo usato la parola chiave While e il codice viene interpretato così[ripeti mentre colonna è diversa da 19] ma perchè 19 dato che l'ultima colonna che dobbiamo riempire è la n° [18]?.

Lo comprendiamo subito andando avanti con l'analisi del ciclo, possiamo saltare la spiegazione delle istruzioni Cells(riga, colonna).Value = colonna in quanto la loro funzione è uguale a quanto spiegato sopra per il ciclo For con la sola differenza che riempiamo le celle col valore della variabile colonna, mentre la soluzione al quesito posto sta nella riga sotto colonna = colonna + 1 questo è il nostro contatore, il metodo che usa Do ... Loop per incrementarlo e continuare nella sua esecuzione, infatti alla prima esecuzione colonna vale 7 e viene incrementata sempre di 1, poi quando trova la parola chiave Loop ritorna all'altra parola chiave Do (dove ha iniziato il ciclo) ed esegue ancora le istruzioni, ma nella determinante del ciclo abbiamo messo 19 (un valore in più di [18]) semplicemente perchè quando incrementiamo il valore della variabile colonna con la dicitura colonna = colonna + 1 alla parola chiave Loop la determinate del ciclo sarebbe soddisfatta se mettessimo [18] e di conseguenza la nostra area verrebbe riempita fino alla colonna 17

Provate a modificare il valore nell'esempio allegato e comprenderete come agisce il ciclo, inoltre quando si lavora con i cicli e per un motivo qualsiasi ci viene rimandato un errore oppure non viene eseguito quello che volevamo, possiamo usare un piccolo espediente per vedere come agisce il ciclo e quale valore attribuisce alle variabili usate, infatti basta usare la parola chiave Msgbox e possiamo vedere a video il valore della variabile e correggere l'errore. Ecco un esempio di utilizzo
Codice:
Sub scrivi_col_dolop()
riga = 12: colonna = 7
MsgBox riga 
Do Until riga = 35
Do While colonna <> 19
MsgBox colonna 
Cells(riga, colonna).Value = colonna
colonna = colonna + 1
Loop
riga = riga + 1: colonna = 7
Loop
End Sub
L’Istruzione Loop Wend
L’istruzione Loop Wend ripetere un'azione finché una condizione è vera che può essere interpretata come:

While condizione da verificare
azione intrapresa
Wend


Se la condizione è vera, vengono eseguite le azioni indicate nella procedura e quando viene raggiunta l'istruzione Wend, la procedura ritorna all'operazione While e la condizione viene verificata nuovamente. Se la condizione è ancora vera, il processo viene ripetuto, mentre invece se la condizione è falsa, l'esecuzione salta alla prima riga che di codice che segue l’istruzione Wend .
Codice:
Sub Test1()
    Dim i As Integer
    i = 1
    'Loop attraverso le celle della colonna A
     'Si esce dal ciclo se la cella (Cells (i, 1)) è vuota
    While Not IsEmpty(Cells(i, 1))
        'Scrivere il contenuto della cella nella finestra di esecuzione.
        Debug.Print Cells(i, 1)
        'Incrementa la variabile di una unità per testare la cella successiva.
        i = i + 1
    Wend
End Sub
L'istruzione Exit Do
È possibile uscire dal ciclo Do While senza completare il ciclo completo, utilizzando la dichiarazione Exit Do che arresta immediatamente l'esecuzione del ciclo ed esegue la sezione di codice immediatamente successiva all'istruzione Loop, e nel caso di cicli nidificati si puà uscire dal ciclo interno ed eseguire il successivo livello esterno, in quanto si può avere qualsiasi numero di istruzioni Exit Do in un ciclo. Questa istruzione è particolarmente utile nel caso in cui si desidera terminare il ciclo al raggiungimento di un certo valore o di soddisfare una condizione specifica, o nel caso in cui si desidera interrompere un loop infinito a un certo punto.

Esempio: Se la cella A1 è vuota, nTotal si sommano al valore di 55. Se Range ("A1") contiene il valore 5, il ciclo termina e uscire quando il contatore (es. n) raggiunge i 5 e nTotal si sommano a 10 (si noti che il ciclo non viene eseguito per il controvalore di 5, ed esce il ciclo al raggiungimento di questo valore).
Codice:
Sub Test2 ()
Dim n As Integer , nTotal As Integer
nTotal = 0
Do While n <11
nTotal = n + nTotal
n = n + 1
If n = ActiveSheet.Range ("A1") Then 
Exit Do 
End If
Loop
MsgBox nTotal
End Sub
Forzare l’uscita dal ciclo
Forzare l'uscita di un ciclo si corre sempre il rischio di creare un ciclo infinito se la condizione di uscita non viene mai soddisfatta e in caso di emergenza, se una macro crea un Loop infinito si può fermare la sua esecuzione premendo contemporaneamente i tasti della Ctrl + Pausa . È anche possibile premere il tasto Esc e in questo caso viene visualizzata una finestra di errore di esecuzione interrotta, in cui si deve cliccare sul tasto Fine per completare la procedura. Se si desidera gestire i tasti Ctrl + Pausa o Esc in una macro, si deve utilizzare la proprietà EnableCancelKey : L’esempio sotto riportato mostra come personalizzare la finestra del messaggio di errore
Codice:
Sub Test3()
    Dim x As Long
    On Error GoTo Fine
    Application.EnableCancelKey = xlErrorHandler
     'si crea un loop per dare tempo di testare la procedura
    'dell’uso del tasto Esc
    For x = 1 To 50000
        Cells(x, 1) = x
    Next x
Fine:
   If Err.Number = 18 Then MsgBox "Operazione Annullata"
End Sub
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -

Ultima modifica di Alexsandra : 30-04-2014 alle ore 22.24.36
Alexsandra non è collegato   Rispondi citando
Vecchio 13-02-2012, 17.34.27   #7
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
Range, Cells e ciclo With




Abbiamo visto come è strutturato un foglio di calcolo o cartella, abbiamo detto che è costituito da celle, intervalli e fogli, inoltre un insieme di celle è rappresentato da righe e colonne, ricordando che la maggior parte dei compiti che svolgiamo in un foglio di calcolo è quella di introdurre informazioni, tagliare e copiare dati o applicare opzioni di formattazione e tante altre funzioni che coinvolgono celle, righe o colonne, questo insieme è definito Range . Un Range può essere rappresentato da una singola cella o più celle da una colonna, una riga o una selezione di celle, il sistema più facile per identificarlo è proprio il comando Range che ha questa sintassi

Object.Range(nome)

Object : è un riferimento all’oggetto Worksheet che contiene il Range, se viene omesso VBA assume che si riferisca all’ActiveSheets (il foglio che abbiamo attivo)
Nome : è un riferimento al Range o il nome del Range inserito come testo, infatti questo comando lavora anche con Range che hanno un nome, vediamo qualche esempio

Worksheets("Foglio1").Range("A1").Value = 123, Oppure possiamo rappresentarlo come un insieme di celle in questo modo, Worksheets("Foglio1").Range("A1:C5").Value = 123

Possiamo usarlo anche con un nome assegnato agendo in questo modo : Selezioniamo un insieme di celle e dal Menu Inserisci - Nome - Definisci, come da immagine sotto

Fig. 1

E ci comparirà un box come il seguente

Fig. 2

Nota: Per versioni di Excel superiori alla 2003 per assegnare un nome ad un intervallo di celle si deve seguire il percorso Formule - Definisci nome come da immagine sotto stante

Fig. 3

E ci compare una finestra come la seguente

Fig. 4
Fine Nota

Se abbiamo selezionato prima le nostre celle troveremo il loro riferimento nel campo Riferito a oppure possiamo cliccare sull’icona evidenziata dalla freccia rossa e procedere alla loro selezione, fatto questo dobbiamo solo inserire il nome dell’intervallo e cliccando su Aggiungi lo stesso comparirà nel box centrale così:

Fig. 5

A questo punto possiamo modificare il nostro listato in questo modo: Worksheets("Foglio1").Range("pippo").Value = 123

Possiamo riepilogare che con il primo codice abbiamo riempito la cella A1 col valore 123, mentre col secondo abbiamo riempito un insieme di celle (dalla A1 alla C5) col valore 123, mentre assegnando un nome ad un intervallo di celle abbiamo riempito tutto l’intervallo col valore 123. Possiamo però dire anche che se siamo certi di operare nel foglio attivo posso omettere il riferimento Object e quanto abbiamo finora visto lo possiamo scrivere anche in questo modo
  • Range("A1").Value = 123 (per la sola cella A1)
  • Range("A1:C5").Value = 123 (per un intervallo di celle)
  • Range("pippo").Value = 123 (utilizzando un nome di un intervallo di celle)
Sempre sulla falsa riga di quanto appena citato possiamo ulteriormente semplificare il listato usando riferimenti assoluti in questo modo
  • [A1] = 123 (per la sola cella A1)
  • [A1:C5] = 123 (per un intervallo di celle)
  • [pippo] = 123 (utilizzando un nome di un intervallo di celle)
Come abbiamo potuto vedere il comando Range è estremamente flessibile e lo useremo spesso per poter interagire con Excel da VBA ora vediamo come comportarci quando dobbiamo leggere in un foglio e scrivere in un altro. Molte volte abbiamo la necessità di scrivere in un foglio i nostri dati e poterli salvare in un altro foglio per successive consultazioni, useremo sempre l’enunciato Range, ma gli abbineremo anche altre funzioni come Cells e il ciclo With esponiamo ora brevemente la sintassi e l’utilizzo di questi due comandi


L'enunciato Cells
Anche se possiamo usare il comando Range per riattivare una singola cella il comando Cells esegue lo stesso compito ma con maggior flessibilità, quando dobbiamo scrivere o leggere dati in un foglio di calcolo direttamente da VBA con l’enunciato Range siamo sempre vincolati ad una locazione ben precisa che abbiamo appena visto e denominata dal riferimento di cella, ma non sempre sappiamo dove dobbiamo leggere e scrivere, in sostanza è abbastanza difficile usare il comando Range quando dobbiamo copiare un insieme di dati scritti in varie celle estese su righe o colonne. A questo problema si può ovviare usando il comando Cells, che ha questa sintassi

Object.Cells(riga,colonna)

Per quanto riguarda il comando Object tralasciamo ulteriori spiegazioni in quanto vale quanto sopra esposto per il comando Range , noterete però che il riferimento al Range (nome) è espresso in coordinate di riga e colonna, questo ci permette di identificare una singola cella o un intervallo dalla loro posizione di riga e colonna, facciamo qualche esempio di identificazione di celle.

A1 = Cells (1,1)
B5 = Cells (5,2)
D3 = Cells (3,4)


Vediamo ora il ciclo With e poi sintetizziamo il tutto e uniamo i vari comandi


Il Ciclo With
VBA ci fornisce questa speciale struttura With …. End With che ci permette di fare riferimento alle proprietà o metodi che appartengono allo stesso oggetto senza dover specificare ogni volta il riferimento completo all’oggetto, bella come esposizione tecnica ma poco chiara vero? Esponiamo la sintassi del ciclo With e poi semplifichiamo il concetto con degli esempi, la sintassi è :

With Oggetto
Istruzioni
End With


Chiarifichiamo ora il tutto, all’inizio del corso abbiamo parlato di Metodi e Proprietà e anche di Oggetti, abbiamo esposto l'oggetto Workbook (che è la cartella di lavoro cioè il nostro file), l'oggetto Worksheet (che è il foglio di lavoro : Foglio1, Foglio2 ecc...) e l'oggetto Range ( intervallo di celle, A1: B12, C1:D12, ecc...) nella definizione del ciclo With abbiamo detto che ci permette di omettere il riferimento completo all’oggetto (Workbook, Worksheet) quando le proprietà o i metodi che usiamo si riferiscono allo stesso oggetto, infatti basta dichiararlo una sola volta all’inizio della procedura With (vedi sintassi) così la nostra procedura risparmia il tempo che necessita per risolvere il riferimento all’oggetto per ogni proprietà o metodo all’interno dell’istruzione With. Vediamo un esempio e capirete subito come funziona, prendiamo come esempio i dati presenti in un foglio come in figura

Fig. 6

Supponiamo di trovarci nel Foglio1 e vogliamo scrivere i nostri dati nel Foglio2, per compiere questa operazione senza l’utilizzo del ciclo With dobbiamo utilizzare un listato del genere: Worksheets("Foglio2").Range("B1").Value = Worksheets("Foglio1").Range("B1").Value, oppure come abbiamo visto poco sopra in questo modo

Worksheets("Foglio2").Range("B1").Value = [B1].Value
Sheets("Foglio2").[B1].Value = [B1].Value


Ma così copiamo una singola cella, dobbiamo utilizzare un ciclo come abbiamo già visto in questo modo
Codice:
Sub scrivi()
riga = 1
Do Until Sheets("Foglio1").Cells(riga, 2) = Empty
Sheets("Foglio2").Cells(riga, 2).Value = Sheets("Foglio1").Cells(riga, 2).Value
 riga = riga + 1
Loop
End Sub
Dobbiamo utilizzare una sintassi del genere in quanto dobbiamo incrementare il nostro contatore per poter scorrere tutti i dati presenti nel foglio di origine (nel nostro caso il Foglio1) e al tempo stesso incrementare la riga del foglio di destinazione, comunque già in questo listato abbiamo potuto vedere l’utilizzo del comando Cells, credo che sia chiaro come và utilizzato e a cosa serve, in ogni caso possiamo dire che con il comando Cells identifichiamo una cella ben precisa, il nostro problema sta solo nel fatto che dobbiamo dichiarare sempre il riferimento completo sia del foglio di origine che del foglio di destinazione (in presenza di un ciclo) però possiamo ovviare a tutto questo utilizzando il ciclo With in questo modo.
Codice:
Sub scrivi_with()
j = 1
Do Until Sheets("Foglio1").Cells(j, 2) = Empty
 With Sheets("Foglio2")
 .Cells(j, 2) = Sheets("Foglio1").Cells(j, 2).Value
End With
    j = j + 1
Loop
End Sub
Apparentemente sembrano uguali, ma col ciclo With abbiamo evitato la dichiarazione dell’oggetto nel ciclo Do Loop, o meglio lo abbiamo fatto una sola volta con notevole risparmio in termini di ricerca dell’oggetto da parte di VBA e semplificando il listato in base a quanto finora citato relativo agli oggetti possiamo anche scriverlo così
Codice:
Sub scrivi_with()
j = 1
Do Until Cells(j, 2) = Empty
 With Sheets("Foglio2")
 .Cells(j, 2) = Cells(j, 2).Value
End With
    j = j + 1
Loop
End Sub
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato   Rispondi citando
Vecchio 13-02-2012, 17.37.27   #8
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
La Funzione MsgBox e InputBox



Abbiamo usato questa semplice funzione molto spesso in questo corso, adesso vediamola più da vicino e come possiamo personalizzarla per i nostri progetti. La funzione MsgBox() ci permette di mostrare a video un box che riporterà un avviso permettendo così all’utente di scegliere l’operazione più idonea da eseguire. Questo comando ci è utile quando stiamo per mandare in esecuzione una determinata procedura e vogliamo ottenere il consenso dall’utente, oppure la possiamo usare nella gestione degli errori, ci può avvisare e impedire l’esecuzione di una routine che porterebbe il programma alla generazione di un errore con conseguente blocco dell’esecuzione del nostro progetto, ma può chiederci una ulteriore conferma per operazioni “delicate” - tipo cancellazione di file - in sostanza è una funzione che ci permette di comunicare da vicino con l’applicazione che stiamo usando.

Finora abbiamo visto marginalmente l’uso di Msgbox , in questa lezione cercheremo di approfondire le sue potenzialità e il suo uso. Non ha una sintassi particolarmente difficile ma il suo uso “avanzato” ci permette di controllare le varie procedure e gestire tutti gli eventi che abbiamo istanziato nel nostro programma, in sostanza è una funzione di VBA abbastanza semplice da usare che riporta a video un messaggio con un’icona e dei pulsanti predefiniti, a cui si risponde premendo su uno di essi. La sintassi è la seguente :

MsgBox(prompt[, buttons] [, title] [,helpfile ,context]) oppure italianizzando il commando
MsgBox(Messaggio[, Pulsanti] [, Titolo] [, Fileaiuto , Contesto]) Dove
  • Prompt o Messaggio : indica il messaggio che sarà visualizzato nelle finestra di dialogo.
  • buttons o Pulsanti : indica il valore numerico dei pulsanti da visualizzare nella finestra di dialogo.
  • Title o Titolo : Indica il titolo della finestra di dialogo e va scritto fra virgolette
  • helpfile, FileAiuto e context o Contesto : sono relativi alla guida dell’applicazione ma non sono indispensabili
Ricordiamoci che non abbiamo nessun controllo della posizione in cui verrà visualizzato il Box sullo schermo, vediamo ora qualche esempio :
Codice:
Sub box1()
MsgBox "Ciao a tutti"
End Sub
Questo codice ci riporta a video un messaggio come questo

Fig. 1

Come potete vedere abbiamo omesso alcune espressioni nella sintassi appena esposta, ma il nostro box ci appare con il testo che abbiamo inserito, e con la barra del titolo di default [Microsoft Excel] , inoltre è possibile anche far apparire il box usando il valore di Variabili oppure possiamo anche usare anche una forma più evoluta e personalizzare il nostro messaggio di avviso come meglio crediamo, vediamone un esempio
Codice:
Sub box2()
MsgBox "Ciao a tutti", vbCritical + vbOKOnly, "Funzione MsgBox Semplice"
End Sub
Che ci riporta a video un messaggio come questo :

Fig. 2

Notiamo subito che è cambiato il titolo nella barra della finestra ed è comparsa un’icona rossa con una X bianca, possiamo anche cambiare tipo di icona in questo modo :
Codice:
Sub box3()
MsgBox "Ciao a tutti", vbQuestion + vbOKOnly, "Funzione MsgBox Semplice"
End Sub
E ci verrà riportato a video un messaggio come questo

Fig. 3

Vedendo i codici esposti e i vari box che ci sono apparsi possiamo dire che :

Prompt: è il messaggio che verrà visualizzato, nel nostro caso è Ciao a tutti”
buttons : è il tipo di pulsante e relativa icona, nel nostro caso è rappresentato dal codice vbCritical + vbOKOnly
title : è il titolo della finestra, nel nostro caso è Funzione MsgBox Semplice"

Ora però possiamo anche fare un altro “passo avanti” nell’uso di questa funzione, a volte è difficile ricordare tutti i comandi e potremmo usarla anche in un altro modo. Abbiamo detto poco sopra che buttons indica il valore numerico dei pulsanti da visualizzare nella finestra di dialogo, ma finora non abbiamo esposto valori numerici, abbiamo solo rappresentato i pulsanti con delle “parole chiave” tipo : vbCritical + vbOkOnly, oppure vbQuestion + vbOkOnly vediamo questo aspetto modificando il codice finora usato in questo modo :
Codice:
Sub box4()
MsgBox "Ciao a tutti", 0 + 16, "Funzione MsgBox Avanzata" '
End Sub
L’esecuzione di questo codice ci riporta questo avviso

Fig. 4

Come possiamo vedere l’avviso cambia solo nel titolo che abbiamo modificato in Funzione MsgBox Avanzata ma il resto del Box è uguale, eppure il codice è rappresentato in maniera diversa, possiamo vedere che non compaiono più le parole chiave usate in precedenza ma abbiamo inserito dei valori numerici separati da virgole e seguiti dal titolo della finestra. A mio avviso usarla in questo modo è molto più semplice da ricordare e avremmo meno codice da scrivere. Esponiamo ora con una tabella come vengono interpretati i valori da VBA, che ci aiuterà nell'interpretazione di quanto finora esposto. L’argomento buttons indica il valore numerico dei pulsanti da visualizzare nella finestra del Box e sono così rappresentati

Fig. 5

Sempre a questo argomento possiamo associare un’icona da visualizzare nel Box identificata da un valore numerico seguendo questa tabella:

Fig. 6

Abbiamo detto poco sopra che la funzione MsgBox restituisce un valore, questo valore rappresenta il pulsante che abbiamo premuto, infatti come facciamo a sapere quale pulsante, e di conseguenza, quale scelta ha fatto l’utente? Ora dobbiamo fare una piccola parentesi, nelle lezioni precedenti abbiamo sempre esposto MsgBox come un semplice avviso, invece possiamo usarla anche quando dobbiamo prendere delle decisioni, in pratica si sta dimostrando l’estrema versatilità di questa funzione, unica cosa è fondamentale sapere quale tasto è stato premuto dall’utente per consentire o negare l’esecuzione di una procedura.

A questo punto non diventa solo una semplice funzione che rimanda un avviso, ma prende campo un aspetto più importante, cioè può permettere l’esecuzione di una procedura oppure indicarci quale operazione stiamo per eseguire e richiedere un’ulteriore conferma. Vediamo ora con una tabella quali sono i valori che vengono restituiti da MsgBox e poi con qualche riga di codice ne vediamo il suo uso all’interno di una procedura

Fig. 7

In base alla tabella sopra esposta possiamo dire che se l’utente preme il tasto Ok il valore restituito sarà 1, mentre se preme il pulsante Yes il valore restituito sarà 6, di conseguenza possiamo usare la funzione MsgBox anche in altri contesti diversi dal semplice avviso, ma usarla anche per operare delle scelte ed usando le Variabili – come abbiamo detto all’inizio – per ottimizzare sia la funzione ma soprattutto l’uso che ne viene fatto. Vediamo qualche esempio di codice
Codice:
Sub prova()
 Dim Risp As Integer
 Risp = MsgBox("Prova funzione MsgBox", 1 + 64, "Funzione MsgBox Avanzata")
  If Risp = 1 Then
  MsgBox "Hai schiacciato il pulsante Ok", 1+48, "Funzione MsgBox Avanzata"
Else
 Exit Sub
End If
End Sub
Con il codice sopra esposto ci compare una finestra come questa

Fig. 8

E ciccando sul pulsante Ok ci comparirà un messaggio del genere

Fig. 9

Credo che sia abbastanza eloquente come solo sostituendo le condizioni da verificare e le procedure da eseguire possiamo utilizzare questa funzione con scopi ben diversi dal solo avviso, ma possiamo integrarla con le scelte che andiamo ad operare nel proseguo del nostro programma, costituendo così un’ossatura stabile e logica del nostro codice sia per quanto riguarda la gestione degli errori che richiedendo conferma all’utente di quanto si appresta a fare e in base alle scelte che effettua indirizzare il flusso del programma nella direzione appropriata


La Funzione InputBox
Se vogliamo che l'utente possa operare delle scelte su come usare la procedura possiamo usare la funzione Msgbox che abbiamo già visto nella lezione precedente oppure la funzione InputBox, la quale ci permette di ottenere un input dall'utente, la sintassi generale è la seguente:

InputBox (Messaggio) [,Titolo, Default, XPos, YPos, File Aiuto, Contesto])

Messaggio è una stringa usata per indicare all'utente quale informazione deve inserire, ed è l'unico argomento richiesto, tutti gli altri sono opzionali.
Titolo è una stringa usata come titolo per la finestra di dialogo
Default è una stringa per fornire un valore di Default per l'input dell'utente
XPos e YPos sono espressioni numeriche che forniscono le coordinate dove deve apparire la finestra di dialogo, XPos è la distanza orizzontale dal lato sinistro della finestra e YPos è la distanza verticale dal lato superiore della finestra, sono argomenti opzionali, ma fate attenzione se li usate perchè se specificate delle posizioni troppo grandi per questi argomenti si corre il rischio di non far apparire la finestra sullo schermo
FileAiuto è una stringa che contiene il nome di un file della guida di Windows e Contesto è un'espressione numerica che specifica l'argomento nel file della guida relativo alla finestra di dialogo che state visualizzando.FileAiuto e Contesto sono opzionali, ma se specificate FileAiuto dovete specificare anche Contesto, e quando specificate un file della guida per una finestra di dialogo di input, VBA aggiunge automaticamente un pulsante della Guida (?) alla finestra di dialogo. Vediamo ora un esempio
Codice:
Sub funzione_input()
Prova_input = InputBox(prompt:="Inserisci il nome di un file: ", Title:="Crea un nuovo file", Default:="Newfile")
End Sub
ed otteniamo un finestra dei questo tipo

Fig. 10

credo che sia abbastanza semplice ed intuitivo il listato esposto, infatti vediamo che quando digitato nel codice appare nella finestra di dialogo, ora possiamo passare all'argomento appena accennato all'inizio cioè prendere delle decisioni, naturalmente le nostre procedure non possono veramente "Prendere delle decisioni" allo stesso modo di un essere umano, ma bensì possono scegliere tra diversi percorsi di azioni predefinite, basandosi su semplici condizioni e prendendo delle decisioni al solo verificarsi di determinati eventi. Possiamo dire che usiamo le istruzioni di scelta di VBA, definite in una condizione oppure in un insieme di condizioni per cui VBA esegue un blocco di codice della nostra procedura oppure un altro blocco di codice.
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato   Rispondi citando
Vecchio 13-02-2012, 17.39.51   #9
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 Userform con VBA



Finora abbiamo visto come utilizzare delle finestre di dialogo che VBA mette a disposizione tramite le funzioni MsgBox e InputBox, sebbene queste funzioni possano garantire ad un programma un’ottima funzionalità il loro utilizzo è abbastanza limitato. Durante lo sviluppo di programmi più complessi è indispensabile usare finestre di dialogo, che permettano all’utente di selezionare più opzioni, scegliere elementi da una lista o digitare valori diversi, in pratica per incrementare la funzionalità del programma è necessario utilizzare finestre di dialogo personalizzate che ci permettano di velocizzare le nostre procedure, in questo contesto VBA ci mette a disposizione l’oggetto Userform(Finestre Utente) che ci permette la creazione e la manipolazione di finestre di dialogo personalizzate all’interno di programmi o procedure.

Utilizzando le Userform, è possibile costruire finestre personalizzate per visualizzare dati, o richiedere all’utente la digitazione di valori, utilizzando la logica che abbiamo impostato per la corretta esecuzione del programma, per esempio possiamo mostrare una finestra di dialogo, che mette a disposizione una serie di formati data, obbligando l’utente alla scelta di un solo formato tra quelli mostrati.

In sostanza le finestre di dialogo permettono al programma di interagire con l’utente in modo più “sofisticato” e forniscono uno strumento versatile per svolgere le normali funzioni di Input e Output. L’oggetto Userform è una finestra di dialogo vuota e contiene una barra del titolo e un pulsante di chiusura, aggiungendo controlli a un oggetto di tipo Userform è possibile personalizzare l’aspetto e la funzionalità della finestra di dialogo. Ogni oggetto Userform possiede proprietà, metodi e risponde ad eventi, tutti ereditati dall’oggetto Userform, inoltre ogni oggetto Userform incorpora un modulo nel quale l’utente può aggiungere i propri metodi e proprietà e nel quale può scrivere il codice che risponde ad eventi della finestra.

Cosa significa questo? Significa che possiamo definire evento qualsiasi cosa si verifichi all’interno della finestra di dialogo o in un suo controllo, tipici esempi di evento sono la pressione di un pulsante di comando o la selezione di una casella di controllo. Altri eventi possono includere la modifica di una casella di testo o la selezione di una lista, i clic del mouse, la pressione dei tasti e altre azioni interne attivano gli eventi. Gli oggetti utilizzati (finestre e controlli) rendono disponibile una serie di eventi, è quindi possibile scrivere procedure VBA che rispondono a questi eventi. Queste procedure vengono denominate “Procedure di evento” come per esempio la pressione di un pulsante di comando, la procedura di evento contiene tutte (e solo) le azioni da eseguire in relazione all’evento, altro esempio può essere la chiusura di una finestra tramite il pulsante di chiusura la procedura di evento viene eseguita in aggiunta all’azione causata dall’evento (in questo caso la chiusura della finestra di dialogo)


Come creare una UserForm
Per inserire in un file di Excel una Userform la procedura è abbastanza semplice, entriamo nell’editor del VBA (premiamo i tasti ALT+F11) e nella finestra del progetto vediamo il file xls con l’elenco dei fogli presenti al suo interno. Per creare una Userform seguiamo questo percorso Inserisci - Userform e di seguito ci compare una finestra come questa

Fig. 1

Nella finestra del codice è comparsa una UserForm vuota e a sinistra vediamo un box denominato Casella degli strumenti che ci permette di inserire i vari controlli all’interno della Userform. La Userform ora è creata, possiamo modificarne le dimensioni a piacere, basta posizionarsi in un angolo (inferiore destro) e trascinare il mouse tenendo premuto il tasto sinistro e rilasciarlo quando abbiamo raggiunto le dimensioni desiderate.

VBA per default assegna il nome Userform seguito da un numero di indice, ma possiamo modificarne il nome anche per sapere a prima vista il compito assegnato alla Userform. Dalla finestra delle proprietà modifichiamo il nome in Anagrafica, facendo clic nella casella a fianco del campo (Name), cancelliamo il nome attualmente presente (Userform1) e inseriamo il nuovo.

Fig. 2

Ora vediamo che nella finestra dei progetti la UserForm ha cambiato nome, ma il titolo della UserForm è rimasto inalterato, presenta ancora il nome Userform1. Per modificare il titolo sulla barra della Userform dobbiamo modificare il valore presente nel campo caption nella finestra delle proprietà, se modifichiamo il nome in Gestione anagrafica anche la barra della Userform assume questo titolo

Fig. 3

Una Userform ha i suoi eventi, proprio come una cartella di lavoro o un foglio di lavoro ed essendo diversi, per il momento ci fermeremo a quelli più usati che sono: Activate – Click – DblClick – Deactivate – Initialize – Terminate
Per aggiungere eventi, dobbiamo fare doppio clic sulla finestra UserForm:

Fig. 4

Possiamo usare un evento per fissare le dimensioni della Userform, utilizzando l’evento Userform_Initialize che scatterà quando la form viene caricata in memoria. Questo evento può essere causato dall’istruzione Load o dal metodo Show, si utilizza questo evento per impostare l’aspetto iniziale della finestra. Per raggiungere l’evento selezioniamo il box a destra di figura 4 indicato dalla freccia rossa e nell’elenco a discesa scegliamo l’evento Initialize e inseriamo questo codice
Codice:
Private Sub UserForm_Initialize () 
    Anagrafica.Height = 100 
    Anagrafica.Width = 100
End Sub
Avrete notato che per agire sulla Userfom viene inserito il nome della stessa (Anagrafica) seguito dalla parola chiave Heigth (altezza) separate da un punto e con l’operatore uguale abbiamo fissato il valore a 100, la stessa operazione viene ripetuta per la larghezza con la parola chiave Width (larghezza). Se eseguiamo questa macro la Userform prenderà le dimensioni impostate, cioè sarà larga 100 pixel e alta di 100 pixel. Possiamo sfruttare un altro evento per modificare le dimensioni ogni volta che l’utente clicca sulla form aumentandole di 50 pixel ad ogni clic, inserendo questo codice nell’evento Userform_Click
Codice:
Private Sub UserForm_Click ()     
Anagrafica.Height = Anagrafica.Height + 50     
Anagrafica.Width = anagrafica.Width + 50 
End Sub
Sempre con lo stesso metodo che abbiamo appena visto, abbiamo inserito il nome della form seguita dal punto e dalle istruzioni Height e Width e con le assegnazioni che abbiamo visto per le variabili è stato assegnato un valore di 50 pixel preceduto dall’operatore più (+). Un altro evento che dobbiamo prendere in considerazione è l’evento Activate che viene scatenato ogni volta che la form diventa attiva (cioè passa in primo piano). Si utilizza questo evento per aggiornare il contenuto dei controlli, in modo da riflettere i cambiamenti che possono essere avvenuti mentre la finestra non era attiva. Possiamo usare questo evento per preparare i vari controlli a ricevere i dati dell’utente, per esempio se siamo in presenza di un TextBox(casella di testo) o vari OptionButton(pulsante di selezione) possiamo fare in modo che quando viene attivata la form il focus (corrisponde ad avere il campo selezionato e pronto a ricevere il testo) sia già sul Textbox oppure di avere un Optionbox già selezionato. Vediamolo con un esempio
Codice:
Private Sub UserForm_Activate()     
TextBox1.SetFocus
OptionButton1.value=True 
End Sub
Il metodo più semplice per controllare un oggetto Userform è utilizzando i Metodi e le Proprietà predefinite della classe Userform e scrivere le procedure evento per la gestione della finestra e dei controlli in essa contenuti, i metodi più comuni da utilizzare sono: Copy – Cut – Hide – Paste – PrintForm – Repaint – Show

Hide : Nasconde la finestra di dialogo (la Userform) senza liberare la memoria associata all’oggetto, in questo modo vengono mantenuti i valori nei vari controlli contenuti in essa
Show : Rende visibile la finestra sullo schermo, se la finestra non è caricata in memoria, viene effettuato il caricamento.

Inoltre VBA fornisce due comandi che sono molto utili quando usiamo l’oggetto Userform, i comandi sono Load e Unload, questi comandi possono essere utilizzati per caricare l’oggetto in memoria e per liberare la memoria se occupata dall’oggetto. La sintassi per questi comandi è la seguente:

Load Oggetto
Unload Oggetto

In questo enunciato Oggetto rappresenta un riferimento valido ad un oggetto di tipo Userform, con il comando Load carichiamo l’oggetto in memoria, ma non lo rende visibile sullo schermo, e con il comando Unload lo scarichiamo dalla memoria. Abbiamo appena detto che con Load carichiamo l’oggetto in memoria, ma non lo portiamo a video, inneschiamo solo l’evento Initialize della Userform ma per poter vedere l’oggetto sullo schermo dobbiamo usare il comando Show, l’enunciato è il seguente

Anagrafica.Show

Pertanto se vogliamo far comparire una finestra di dialogo a video dovremmo lanciare il comando Show, ma come facciamo? Una volta creata la Form abbiamo a disposizione solo metodi ed eventi, ma tutti riferiti all’oggetto Userform, mentre a noi serve un altro procedimento che veicoli la nostra finestra di dialogo. Se diamo uno sguardo alla finestra dei progetti vediamo che la Form è presente, ma abbiamo appena detto che deve essere veicolata per poter renderla visibile. Un sistema per ottenere questo è di seguire questo percorso Inserisci - Modulo e nella finestra di progetto ora ci comparirà anche il modulo

Fig. 5

A questo punto clicchiamo sulla voce “Modulo1” e nella finestra del codice digitiamo il seguente codice
Codice:
Sub Mostra()
Anagrafica.Show
End Sub
Associamo ora la nostra macro ad un pulsante sul foglio di lavoro e premendo sul pulsante comparirà a video la nostra Userform. Ora abbiamo creato la nostra finestra di dialogo e siamo riusciti a portarla a video, fatte le nostre operazioni sulla form la possiamo “chiudere” usando il comando Unload. Il comando Unload và messo all’interno della Userform, associato ad un pulsante di uscita dalla stessa, la sintassi è la seguente:

Unload Me

Vediamo ora la finestra della casella degli strumenti, noterete che l’etichetta della finestra riporta il nome di Controlli e sono rappresentati dalle varie icone presenti nel box, vediamo cosa rappresentano e come si usano, per farvi comprendere meglio quali siano i controlli li ho raggruppati in questa immagine con il relativo nome e una breve descrizione

Fig. 6

Fig. 7
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato   Rispondi citando
Vecchio 13-02-2012, 17.41.01   #10
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
I Controlli in una Userform



Un oggetto Userform può contenere controlli come possiamo vedere nelle finestre di dialogo normalmente mostrate da Excel o altri programmi. I controlli sono gli elementi di una finestra che consentono all’utente di interagire con il programma. Nella lezione precedente abbiamo fatto una panoramica su questo argomento, adesso vediamo di approfondire elencando i vari controlli disponibili in maniera più dettagliata.

I controlli disponibili in VBA sono:

Label : Corrisponde a Etichetta, inserisce un oggetto di tipo label1 e svolge la funzione di etichetta descrittiva per quei controlli che non ne hanno una propria. E’ inoltre possibile utilizzare le etichette per mostrare il valore di una variabile. Si può modificare il testo mostrato di una etichetta (label1 nel nostro caso) modificando la proprietà Captino, questo è possibile via codice oppure agendo nella finestra delle proprietà, generalmente questo oggetto viene usato nei casi in cui non si debba modificarne il testo, ma semplicemente come elemento descrittivo di un altro controllo

Casella di testo : Inserisce un oggetto di tipo Textbox, questo oggetto permette l’inserimento di testo da parte dell’utente, viene utilizzato per ogni tipo di campo che può essere rappresentato come testo, nomi, date, numeri valute e inoltre può accettare e mostrare più righe di testo, infatti quando necessario compare una barra di scorrimento verticale che permette di scorrere il testo contenuto

Cornice : Inserisce un oggetto di tipo Frame, questo oggetto non ha nessuna funzione specifica, se non quella di raggruppare logicamente un insieme di controlli. Si utilizza solitamente per raggruppare pulsanti di opzione, caselle di controllo e pulsanti interruttore. Usate questo controllo quando volete far risaltare all’utente che i controlli contenuti nella cornice sono in qualche modo collegati tra loro

Pulsante di comando : Inserisce un oggetto di tipo CommandButton, il classico pulsante di standard di Windows che si attiva quando l’utente fa clic su di esso. L’azione svolta al clic sul controllo dipende dal codice che viene messo nell’evento, può compiere operazioni di chiusura (Close) di nascondimento (Hide) , di aggiornamento dei dati, di verifica e così via

Casella di Controllo : Inserisce un oggetto di tipo CheckBox, è composto da un quadrato che contiene un segno di spunta nel caso in cui sia selezionato e da un’etichetta di descrizione. Utilizzate questo controllo per le opzioni che possono avere un valore di tipo Vero o Falso. Può restituire valori True (Vero), quando la casella è selezionata o False (Falso), se la casella non è selezionata, inoltre la presenza di più caselle di controllo non si escludono a vicenda

Pulsante di opzione : Inserisce un oggetto di tipo OptionButton, è composto da un pulsante tondo che contiene una pallina nera nel caso sia selezionato e da un’etichetta di descrizione. Viene usato con una serie di pulsanti di opzione per consentire all’utente una selezione di elementi che si escludono a vicenda

Pulsante Interruttore : Inserisce un oggetto di tipo ToggleButton, mostra lo stato del pulsante Vero o Falso, Acceso o Spento, allo stesso modo di una casella di controllo solo che ha l’aspetto di un pulsante in posizione “Su” o “Giù”

Casella di riepilogo : Inserisce un oggetto di tipo ListBox e mostra una serie di dati presenti nel foglio in cui l’utente può fare una scelta, inoltre la proprietà MultiSelect controlla la possibilità di effettuare la scelta di un solo valore o di più elementi della lista

Casella combinata : Inserisce un oggetto di tipo ComboBox, questo controllo è la combinazione grafica di una casella di testo (TextBox) e di una casella di riepilogo (ListBox) la casella di testo permette la digitazione di dati con la possibilità di suggerire una serie di valori tra cui scegliere attraverso la lista a discesa. Tramite questo controllo è possibile consentire all’utente di inserire un valore non presente nella lista, oppure costringerlo a scegliere un valore tra quelli presenti nella lista. Per poter effettuare questa impostazione bisogna modificare la proprietà Style nella finestra delle proprietà

Schede : Inserisce un oggetto di tipo TabStrip, questo controllo consiste in una singola area in cui è possibile inserire altri controlli, è costituito da una serie (modificabile a piacere) di pulsanti di tabulazione. Questo controllo è simile all’oggetto cornice, in quanto l’area non cambia, ma tramite i pulsanti di tabulazione è possibile mostrare dati di diverse categorie. Per esempio in un’anagrafica di un cliente è possibile avere un tabulatore in cui compaiono i dati generali (indirizzo, telefono etc.) un altro tabulatore mostrerà i dati bancari e così via

Pagine : Inserisce un oggetto di tipo MultiPage, questo controllo è simile al controllo Schede (TabStrip) inoltre ogni pagina di questo controllo può contenere diversi controlli distinti. E’ da utilizzare quando ogni pagina deve avere un contenuto differente

Barra di scorrimento : Inserisce un oggetto di tipo ScrollBar e permette di scorrere i valori contenuti in una finestra

Casella di selezione : Inserisce un oggetto di tipo SpinButton, è una particolare categoria di casella di testo che permette l’inserimento facilitato e la modifica di dati compresi in un certo intervallo. Viene utilizzato per l’inserimento di valori numerici, date o valori in sequenza e si utilizza insieme ad un controllo etichetta(Label) o casella di testo (TextBox). In pratica facendo clic sulla freccia “su” o “giù” il valore viene incrementato o diminuito

Immagine : Inserisce un oggetto di tipo Image, e permette di inserire un’immagine all’interno della finestra in uno dei seguenti formati *.bmp, *.cur, *.jpeg, *.gif, *.ico

RefEdit : Inserisce un oggetto di tipo RefEdit, questa è una speciale casella di testo che consente di inserire e selezionare intervalli sui fogli di lavoro di Excel

Ogni controllo è un oggetto con proprietà, metodi ed eventi specifici esattamente come le finestre (Userform) che li contiene, è possibile impostare le proprietà dei controlli via codice oppure utilizzando la finestra Proprietà dell’editor di Visual Basic. Una volta aggiunto un controllo alla finestra, potete effettuare una serie di operazioni come: copiare l’oggetto, ridimensionarlo, spostarlo, cancellarlo, modificarne la formattazione, il tipo di carattere, il colore e modificare tutte le sue proprietà. Avrete sicuramente la necessità di fare queste operazioni nel momento in cui perfezionerete la vostra tecnica di programmazione delle finestre di dialogo. Per esempio potete decidere che una casella di testo è troppo ampia o troppo stretta per il testo a cui è destinata, così ne modificherete le dimensioni. Oppure un pulsante di comando con la scritta CommandButton7 avrebbe un significato a dir poco “oscuro” per l’utente che userà la vostra finestra di dialogo.

Per poter inserire un controllo nella nostra Userform dovete fare clic sul pulsante della Casella degli strumenti corrispondente al controllo che volete aggiungere nella finestra, in questo modo il puntatore del mouse si trasforma in una croce sottile quando viene posizionato sulla Userform. Posizionate il puntatore a croce sulla finestra nel punto in cui volete inserire il controllo, tenete presente che il punto che scegliete corrisponderà all’angolo superiore sinistro. Fate clic e tenete premuto il pulsante sinistro del mouse, Trascinate ora a destra e in basso fino a che il controllo non raggiunge le dimensioni desiderate, quindi rilasciate il pulsante, a questo punto l’editor di Visual basic inserisce il controllo e il puntatore del mouse ritorna ad essere la freccia standard.
Se proviamo ad inserire una casella di testo (TextBox), con le istruzioni sopra riportate ci comparirà una finestra come quella sotto riportata

Fig. 1

Avrete notato che il controllo è circoscritto da dei piccoli quadratini bianchi che ci permettono di ridimensionare il controllo stesso, posizionandoci col cursore del mouse su uno di essi il puntatore si trasforma in una doppia freccia, che indica la direzione nella quale è possibili ridimensionare l’oggetto. Inoltre posizionandoci sopra al controllo il cursore cambia aspetto e diventa a 4 frecce, in questa condizione è possibile spostare il controllo nella posizione voluta. Ricordate anche che ogni controllo aggiunto alla finestra di dialogo deve avere un nome univoco, a questo pensa già l’editor di VBA, se inseriamo un controllo CommandButtons gli viene assegnato automaticamente il nome del controllo seguito da un numero [es. CommandButtons1] questo numero progressivo viene incrementato automaticamente dall’editor ogni volta che si inserisce un controllo dello stesso tipo.


Modificare i controlli
Una volta che avete aggiunto un controllo alla finestra potete effettuare una serie di operazioni come: copiare l’oggetto, ridimensionarlo, spostarlo, cancellarlo, modificarne la formattazione etc. Avrete sicuramente la necessità di compiere queste operazioni nel momento in cui perfezionerete la vostra tecnica di progettazione delle finestre di dialogo. Per esempio potete decidere che una casella di testo è troppo grande o troppo stretta per il testo che è destinata a ricevere, così necessita di una modifica delle dimensioni, oppure inserire un controllo CommandButon5 avrebbe un significato oscuro per l’utente che userà il programma.

Per modificare un controllo occorre prima selezionarlo facendo clic sopra al controllo stesso e per modificarlo dobbiamo ricorrere alla finestra delle proprietà. Inseriamo ora per esempio 3 controlli, un CommandButton, una TextBox e una Label nella nostra form che adesso si presenta così

Fig. 2

Presentare una Userform in questo modo non è certamente accattivante, dobbiamo cercare di dare una indicazione visiva all’utente sullo scopo della Userform. Iniziamo modificando i 3 controlli inseriti, trascinandoli nella posizione giusta e utilizzando la finestra delle proprietà per modificare il valore caption, modifichiamo anche il titolo della form inserendo la dicitura “Esempio di inserimento”, come etichetta della Label usiamo “Inserisci un valore numerico” e il pulsante di comando diventa “Verifica”. Come già detto tutte queste modifiche le effettuiamo selezionando il controllo e andando a modificare il valore del campo Caption, come evidenziato dalla freccia rossa in figura 3

Fig. 3

Una volta terminata la modifica dei vari controlli e ridimensionata la finestra, otteniamo una form come la seguente

Fig. 4

Possiamo ipotizzare che questa finestra attenda l’inserimento di un valore nella TextBox e al tempo stesso verifichi che sia stato inserito un valore numerico prima di salvarlo in una cella del foglio di lavoro. In questi casi è sempre opportuno fare la verifica del testo inserito per evitare ulteriori errori di runtime nel proseguo del programma. E’ possibile fare verifiche del genere in due modi, uno sfruttando l’evento Change della TextBox e l’altro con opportuno codice quando clicchiamo sul pulsante di verifica prima di eseguire il salvataggio. Vediamo entrambi i metodi, prima però aggiungiamo un’altra Label alla nostra form che ci torna utile per rimandare un avviso in caso di errore. La possiamo inserire in questo modo

Fig. 5

Come potete vedere è stato cambiato anche il colore del testo agendo sul campo ForeColor della finestra delle proprietà come si vede in figura

Fig. 6

A questo punto dobbiamo inserire il codice adatto nell’evento Change e per raggiungere questo evento facciamo doppio clic sulla TextBox e nella finestra del codice ci compare l’evento TextBox1_Change(). Abbiamo già detto che questo evento si scatena quando sente un cambiamento all’interno del campo stesso, per cui se inseriamo un codice come il seguente
Codice:
Private Sub Textbox1_Change()
    If IsNumeric(Textbox1.Value) Then 
     Label2.Visible = False
    Else 
        Label2.Visible = True
TextBox1.Value=””
    End If
End Sub
Se inseriamo un valore numerico la Label2 NON diventa visibile, mentre in caso di valore NON numerico la Label2 diventa visibile e la routine termina cancellando il valore nella TextBox. Se eseguiamo questa routine ci viene riportata la form in questo modo

Fig. 7

Come potete vedere la Label2 è visibile, mentre noi vogliamo che diventi visibile in caso di errore nell’inserimento del tipo di dato richiesto. La Label2 è visibile in quanto non abbiamo inizializzato la form, nella lezione precedente abbiamo visto gli eventi Initialize e Activate delle Userform, nel nostro caso utilizziamo l’evento Initialize per nascondere la Label2 e farla poi apparire in caso di errore tramite il ciclo If presente nell’evento Change della TextBox, pertanto andremo ad aggiungere questo codice
Codice:
Private Sub UserForm_Initialize()
Label2.Visible = False
End Sub
In questo modo la finestra di dialogo ci compare in questo modo

Fig. 8

A questo punto se inseriamo un valore di tipo stringa nel campo della TextBox ci viene mostrata la Label di avviso errore di inserimento

Fig. 9

Per mostrare la Label2 e il testo inserito nel campo della TextBox è stata remmata (è stata resa come un commento e il VBA salta i commenti) un’istruzione nella routine
Codice:
Private Sub Textbox1_Change()
    If IsNumeric(TextBox1.Value) Then
     Label2.Visible = False
    Else
        Label2.Visible = True
' TextBox1.Value = ""
    End If
End Sub
Come vedete è stato posto un apostrofo prima dell’istruzione TextBox1.Value = "" che è quella che si occupa di svuotare il campo. A questo punto abbiamo visto il primo metodo di verifica dei dati, l’altro, come abbiamo precedentemente accennato, viene eseguito premendo il pulsante di “Verifica” prima di eseguire la scrittura del valore della TextBox nel foglio di lavoro. Lo possiamo fare in questo modo
Codice:
Private Sub CommandButton1_Click()
    If IsNumeric(Textbox1.Value) Then 
        Range("A1") = Textbox1.Value 
        Unload Me 
    Else
        MsgBox "Il Valore inserito è errato"
    End If
End Sub
Se eseguiamo questo codice (ovviamento dobbiamo togliere il codice nell’evento TextBox1_Change altrimenti scatta anche quello) in caso di inserimento di un valore stringa ci rimanda questo avviso

Fig. 10
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato   Rispondi citando
Vecchio 13-02-2012, 17.44.27   #11
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
I controlli ListBox e ComboBox



I controlli ListBox e ComboBox permettono di visualizzare una lista di opzioni selezionabili dall’utente. La ragione principale per usare una casella combinata (ComboBox) o una casella di riepilogo (ListBox) è quella di poter visualizzare un elenco di elementi, dove nella casella di riepilogo (ListBox) è un elenco a discesa e gli elementi della lista sono sempre visibili mentre nel ComboBox la lista è “a scomparsa”, ovvero è visibile soltanto se l’utente fa clic sulla freccia verso il basso a destra del controllo. Le caselle combinate sono così chiamate perché sono composte da due parti, una porzione di testo che ricorda il controllo TextBox e un elenco che riporta ad una Listbox e "combinano" le caratteristiche che si trovano in entrambe le caselle di testo (TextBox) e le caselle di riepilogo (ListBox) e sono anche comunemente chiamate "elenchi a discesa".

In sostanza la ComboBox è un elenco a discesa in cui la voce selezionata dall’elenco è visibile nell'area di testo, mentre i valori della lista sono visibili solo cliccando sul menu a tendina, mentre un ListBox mostra un certo numero di valori con o senza una barra di scorrimento, inoltre in una ComboBox, è visibile una sola voce senza utilizzare la tendina a discesa, mentre in un ListBox sono visibili molti più elementi. In una ComboBox è possibile selezionare solo una voce dall’elenco, mentre invece in un ListBox è possibile selezionare più opzioni dall'elenco. La rappresentazione grafica delle due caselle è la seguente:

Fig. 1 Fig. 2


Differenza tra ListBox e ComboBox
  • In un ComboBox è visibile solo un elemento dell’elenco a discesa, e i valori della lista sono visibili utilizzando il menu a tendina, mentre un ListBox mostra un certo numero di valori con o senza una barra di scorrimento.
  • In un ComboBox è possibile selezionare solo un'opzione dalla lista, mentre in un ListBox è possibile selezionare più opzioni dall'elenco.
  • In un ComboBox è possibile inserire un valore digitandolo nell’area di testo se non è incluso nella lista, cosa che non è possibile fare in un ListBox.
  • Il controllo CheckBox può essere utilizzato all'interno di un ListBox, ma non all'interno del ComboBox, inoltre il ListBox consente di visualizzare una casella di controllo accanto a ogni voce in elenco, per consentire all'utente di selezionare gli elementi. Per utilizzare il CheckBoxe in un controllo ListBox, si deve impostare la proprietà ListStyle nella finestra Proprietà su fmListStyleOption oppure utilizzando il codice VBA in questo modo: ListBox1.ListStyle = fmListStyleOption

Nota: Tutte le proprietà e i metodi indicati di seguito sono comuni a ListBox e ComboBox, salvo diversa indicazione, inoltre negli esempi di seguito riportati, i codici VBA devono essere inseriti nel modulo di codice del form, se non diversamente specificato.


Il Metodo AddItem:
Questo metodo permette di aggiunge una voce alla lista in un ListBox a colonna singola o in un ComboBox. La sintassi è la seguente: Control.AddItem(Item, Index), che nel nostro caso diventa: ListBox1.AddItem(Item, Index), dove Item specifica l'elemento o la riga da aggiungere e Index è un numero intero che specifica la posizione in cui il nuovo elemento è collocato all'interno della lista, se omesso, viene aggiunto l'elemento alla fine. I numeri di posizione o di riga iniziano con zero, e il primo elemento ha il numero 0, e così via. Il valore di indice non può essere maggiore del numero totale di righe. Il metodo AddItem può essere usato solo con un codice VBA. Per popolare un ComboBox è possibile utilizzare vari metodi, per esempio, se usiamo una casella combinata per permettere all’utente di vare una scelta “fissa” come può essere di scegliere una regione, un tipo di vettura etc. possiamo usare il metodo AddItem e impostare le varie voci direttamente dal codice, inoltre l’operazione di inserimento dati deve essere fatta nell’evento Initialize della Userfom in questo modo.
Codice:
Private Sub UserForm_Initialize()
ComboBox1.Clear
ComboBox1.AddItem "Veneto"
ComboBox1.AddItem "Sardegna"
ComboBox1.AddItem "Lazio"
ComboBox1.ListIndex = 0
End Sub
Se mandiamo in esecuzione questo codice ci viene riportata questa finestra

Fig. 3

Da notare che la prima voce dell’enunciato è l’istruzione ComboBox1.Clear che serve per svuotare di eventuali dati rimasti in memoria del ComboBox in operazioni precedenti, per essere certi che la casella combinata è vuota, si può usare una condizione come questa : If ComboBox1.ListCount >= 1 Then ComboBox1.Clear

L’istruzione ListCount è una proprietà per determinare il numero di righe presenti in una casella combinata o di riepilogo, che inserendola in un enunciato IF verifica se nella casella sono presenti dei dati, infatti se ListCount è maggiore o uguale a 1 allora si esegue lo svuotamento del ComboBox tramite l’istruzione Clear, evitando così il rischio di trovarsi i dati ripetuti nella casella combinata. La penultima istruzione ComboBox1.ListIndex = 0 Indica che si vuole far apparire la prima voce dell’elenco nel Combo come si vede in figura 3, se avessimo usato la dicitura ComboBox.ListIndex = 1 avremmo come prima voce la seconda (Sardegna) presente nell’elenco. Possiamo utilizzare anche un ciclo per popolare il ComboBox in questo modo
Codice:
Private Sub UserForm_Initialize()
 With ComboBox1
 .Clear
 .AddItem "Veneto"
 .AddItem "Sardegna"
 .AddItem "Lazio"
 .ListIndex =0
 End With
End Sub
Oppure se vogliamo popolare il ComboBox con i dati presenti in un Range del foglio di lavoro possiamo usare questo enunciato:
Codice:
Private Sub UserForm_Initialize()
If ListBox1.ListCount >= 1 Then ListBox1.Clear
i = 1
Do Until Sheets("Foglio1").Cells(i, 1).Value = ""  
With Sheets("Foglio1")
 elemento = .Cells(i, 1).Value
 End With
 ListBox1.AddItem elemento
 i = i + 1
 Loop
ListBox1.ListIndex = 0
End Sub
Per quanto riguarda il controllo ListBox non c’è nessuna differenza da quanto finora esposto, tutti i metodi e gli enunciati proposti possono essere usati anche per la casella di riepilogo ListBox avendo l’accortezza di sostituire il riferimento ComBox1 con ListBox1 (oppure il nome assegnato al controllo)


Il Metodo Clear
Questo metodo rimuove tutti gli elementi in un controllo ComboBox o ListBox e presenta la seguente Sintassi: Control.Clear, inoltre è da tenere presente che il metodo non funziona se ComboBox o ListBox viene associato a una fonte di dati utilizzando l’istruzione RowSource, in quanto i dati devono essere cancellati prima dell'uso del metodo Clear


La Proprietà BoundColumn
Questa proprietà specifica la colonna da cui estrarre il valore da inserire in un controllo ComboBox o ListBox. La prima colonna ha un valore BoundColumn di 1, la seconda colonna ha un valore di 2, e così via, impostando il valore BoundColumn su 1 si assegnerà il valore della colonna 1 al ComboBox o ListBox permettendo così l’inserimento dei valori presenti nella colonna nel controllo. Impostando il valore di BoundColumn a 0 si assegna il valore della struttura ListIndex, che corrisponde al numero della riga selezionata, come valore del controllo ComboBox o ListBox. Questa impostazione è utile se si desidera determinare la riga della voce selezionata. La proprietà BoundColumn può essere impostata nella finestra Proprietà e può essere utilizzato anche con un codice VBA.

Esempio: Impostando il valore BoundColumn a 0 si assegna il valore della proprietà ListIndex come valore del controllo
Codice:
Private Sub UserForm_Initialize()
With ListBox1
.ColumnHeads = True
.ColumnCount = 2
.ColumnWidths = "50;0"
.RowSource = "=Foglio2!A2:B6"
.MultiSelect = fmMultiSelectSingle
.TextColumn = 1
.BoundColumn = 0
End With
End Sub
 
Private Sub CommandButton1_Click()
If ListBox1.Value <> "" Then
TextBox1.Value = ListBox1.Value + 2
End If
End Sub
La Proprietà Column
Si riferisce ad una colonna specifica, o combinazione di colonna e riga, in un ComboBox o ListBox a più colonne. Sintassi: Control.Column (iColumn, iRow). La proprietà Column può essere utilizzata solo con un codice VBA e non è disponibile in fase di progettazione. iColumn specifica il numero di colonna in cui la prima colonna della lista ha valore 0 e iRow specifica il numero di riga la prima riga della lista ha valore 0. Sia iColumn che iRow sono valori interi che vanno da 0 fino al numero di colonne e righe (rispettivamente) nell'elenco meno 1. Se si specifica entrambi i numeri di colonna e riga si farà riferimento ad un elemento specifico, mentre specificando solo il numero di colonna si farà riferimento a una colonna specifica. Per esempio [i]ListBox1.Column (1) è/i] si riferisce alla seconda colonna. È possibile copiare una matrice bidimensionale di valori in un controllo ListBox o ComboBox, utilizzando Column (o list ) piuttosto che aggiungere ogni singolo elemento con il metodo AddItem.

Esempio: Popolare il ListBox utilizzando il metodo AddItem e List e utilizzare la proprietà Column per assegnare il contenuto di ListBox a TextBox
Codice:
Private Sub UserForm_Initialize()
With ListBox1
.ColumnCount = 3
.ColumnWidths = "50;50;50"
.ColumnHeads = False
.RowSource = "=Foglio2!A2:B6"
.MultiSelect = fmMultiSelectMulti
End With
TextBox1 = ""
End Sub
 
Private Sub CommandButton1_Click()
'Il metodo AddItem non funziona se ListBox è associato ai dati, quindi la riga di origine viene cancellata
ListBox1.RowSource = ""
'Crea una nuova riga con AddItem 
ListBox1.AddItem "Banana"
'aggiunge un elemento nella seconda colonna della prima riga
ListBox1.List(0, 1) = "Martedì"
'aggiunta di elementi in 3 colonne della prima riga 
ListBox1.List(0, 2) = "Giorno 2"
ListBox1.AddItem "Arancione"
'Aggiunge un elemento nella seconda colonna della seconda riga
ListBox1.Column(1, 1) = "Mercoledì"
'aggiunta di elementi in 3 colonne della seconda fila 
ListBox1.Column(2, 1) = "Giorno 3"
ListBox1.AddItem "apple", 0
'Crea una nuova riga con AddItem e si posiziona nella riga 1
ListBox1.List(0, 1) = "Lunedì"
'Aggiunta di elementi in 3 colonne e posiziona questa riga come la prima 
ListBox1.List(0, 2) = "Giorno 1"
'elemento in colonna 3 e numero di riga 2 del ListBox
TextBox1.Value = ListBox1.Column(2, 1)
End Sub
La Proprietà ColumnCount
Specifica il numero di colonne da visualizzare in un controllo ComboBox o ListBox, un valore 0 di ColumnCount non visualizza nessuna colonna e questa proprietà può essere impostata nella finestra Proprietà oppure utilizzando un codice VBA.


La Proprietà ColumnHeads
ColumnHeads restituisce un valore booleano (True o False) che determina la visualizzazione delle intestazioni di colonna per un ComboBox o ListBox e può essere impostata nella finestra Proprietà oppure utilizzando un codice VBA. Le intestazioni di colonna possono essere visualizzati solo se ColumnHeads è impostato su True nella finestra Proprietà oppure utilizzando il codice: ListBox1.ColumnHeads = True


La Proprietà List
La proprietà List viene utilizzata in combinazione con ListCount e ListIndex per restituire gli elementi in un controllo ListBox o ComboBox. Sintassi : Control.List (iRow, iCol) . Ogni elemento in una lista ha un numero di riga e un numero di colonna, in cui i numeri di riga e di colonna iniziano da zero, iRow specifica il numero di riga e nel caso iRow = 2 rappresenta la terza riga della lista, mentre invece iColumn specifica il numero di colonna e nel caso che iColumn = 0 indica la prima colonna della lista, omettendo questo argomento iColumn recupererà la prima colonna. Si deve specificare iColumn solo per un ListBox o un ComboBox a più colonne. La proprietà List può essere utilizzata solo con un codice VBA e non è disponibile in fase di progettazione

Esempio: Utilizzare Selected, List per visualizzare e selezionare più elementi in un ListBox
Codice:
Private Sub UserForm_Initialize()
With ListBox1
.ColumnHeads = True
.ColumnCount = 2
.ColumnWidths = "50;0"
.RowSource = "=Foglio3!A2:B6"
.MultiSelect = fmMultiSelectMulti
.TextColumn = 1
End With
With TextBox1
.MultiLine = True
.ControlSource = "=Foglio3!F2"
.Value = ""
End With
End Sub
 
Private Sub CommandButton1_Click()
TextBox1.Value = ""
For n = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(n) = True Then
If TextBox1.Value = "" Then
TextBox1.Value = ListBox1.List(n, 1)
Else
TextBox1.Value = TextBox1.Value & vbCrLf & ListBox1.List(n, 1)
End If
End If
Next n
End Sub
La Proprietà ListCount
Determina il numero totale di righe in un controllo ListBox o ComboBox, e questa proprietà può essere utilizzata solo con un codice VBA e non è disponibile in fase di progettazione.


La Proprietà ListIndex
Determina quale elemento viene selezionato in un controllo ComboBox o ListBox. Il primo elemento di un elenco ha un valore di ListIndex uguale a 0, il secondo elemento ha un valorei 1, e così via, quindi, è un valore intero compreso tra 0 e il numero totale di elementi in un controllo ComboBox o ListBox meno 1. Questa proprietà può essere utilizzata solo con un codice VBA e non è disponibile in fase di progettazione. Nota: In una selezione multipla attivata in un ListBox, ListIndex restituisce l'indice della riga che ha il focus, a prescindere dal fatto che sia selezionata la riga o meno.


La Proprietà ListRows
Specifica il numero massimo di righe che verranno visualizzate nella parte casella di riepilogo di un ComboBox. Il valore predefinito è 8. Nota: Se il numero effettivo di elementi della lista superi tale valore massimo della proprietà ListRows, apparirà una barra di scorrimento verticale nella casella di riepilogo del ComboBox e le voci in eccesso possono essere visualizzate scorrendo verso il basso). ListCount può essere utilizzata con la proprietà ListRows per specificare il numero di righe da visualizzare in un controllo ComboBox e può essere impostata nella finestra Proprietà oppure con un codice VBA. La proprietà ListRows è valida per ComboBox e non per ListBox.

Esempio: Utilizzare la proprietà ListCount e ListRows, per impostare il numero di righe da visualizzare in ComboBox
Codice:
Private Sub UserForm_Initialize()
With ComboBox1
If .ListCount > 5 Then
.ListRows = 5
Else
.ListRows = .ListCount
End If
End With
End Sub
La Proprietà MultiSelect
Specifica se sono consentite selezioni multiple e sono disponibili 3 impostazioni:
fmMultiSelectSingle (valore 0), è l'impostazione predefinita, in cui solo un singolo elemento può essere selezionato
fmMultiSelectMulti (valore 1), permette selezioni multiple in cui un elemento può essere selezionato o deselezionato facendo clic del mouse o premendo la barra spaziatrice
fmMultiSelectExtended (valore 2) permette selezioni multiple, in cui premendo il tasto SHIFT e contemporaneamente spostando la freccia su o giù (o premere MAIUSC e facendo clic del mouse) continua la selezione dalla voce precedentemente selezionata con la selezione corrente (cioè un continuo della selezione); questa opzione permette anche di selezionare o deselezionare una voce premendo CTRL e cliccando il mouse.
La proprietà MultiSelect può essere impostata nella finestra Proprietà oppure con un codice VBA. Nota: La proprietà MultiSelect è valida per ListBox e non per ComboBox . Quando vengono effettuate selezioni multiple, gli elementi selezionati possono essere determinati solo mediante la proprietà Selected immobili della ListBox. La struttura Selected avrà valori che vanno da 0 a ListCount meno 1 e sarà True se l'elemento è selezionato e False se non selezionata.

Esempio: Determinare l’elemento selezionato in un controllo ListBox a selezione singola
Codice:
Private Sub CommandButton1_Click()
If ListBox1.Value <> "" Then
MsgBox ListBox1.Value
End If
End Sub
Il Metodo RemoveItem
Viene utilizzato per rimuovere una riga dalla lista in un ComboBox o ListBox. Sintassi: Control.RemoveItem (row_index), dove Row_index è il numero di riga che deve essere rimosso, considerando che la prima riga ha valore 0. Il metodo RemoveItem non funziona se ComboBox o ListBox viene associato ai dati, quindi utilizzando RowSource i dati devono essere cancellati prima dell'uso, inoltre questo metodo può essere utilizzato solo con un codice VBA.


La Proprietà RowSource
Specifica la riga di origine di una lista (che potrebbe essere un intervallo del foglio di lavoro), per un ComboBox o ListBox. La proprietà RowSource può essere impostata nella finestra Proprietà oppure con un codice VBA. Per impostare RowSource nella finestra delle Proprietà, digitare senza virgolette il Range di origine in questo modo: " = Foglio2 A2: A6" che popola il ComboBox o il ListBox con i valori presenti nelle celle A2: A6 del Foglio2. Il codice VBA per questo passaggio è: ListBox1.RowSource = "= Foglio2 A2: A6". Non è necessario utilizzare il segno di uguale ("= Foglio2 A2: A6"), impostando la proprietà con ListBox1.RowSource = "Foglio2 A2: A6" avrà lo stesso effetto.


La Proprietà Selected
Specifica se un elemento viene selezionato in un controllo ListBox. Sintassi: Control.Selected (Item_Index) e restituisce Vero o Falso, se l'elemento è selezionato oppure no, impostando a True per selezionare la voce o rimuovere la selezione [vale a dire. Control.Selected (Item_Index) = True]. Item_Index è un valore intero compreso tra 0 e il numero di elementi nella lista meno 1, indicando la sua posizione relativa nella lista, vale a dire ListBox.Selected (2) = True seleziona il terzo elemento della lista. Questa proprietà è particolarmente utile quando si lavora con selezioni multiple e può essere utilizzata solo con un codice VBA e non è disponibile in fase di progettazione. Nota: In una selezione multipla in un ListBox, ListIndex restituisce l'indice della riga che ha il focus, a prescindere dal fatto che sia selezionata la riga o meno, da cui la proprietà Selected della ListBox può essere utilizzata per impostare una nuova selezione. In una selezione standard del ListBox, ListIndex restituisce l'indice dell'elemento selezionato e quindi dovrebbe essere usata per impostare una nuova selezione.

Esempio: Determinare gli elementi selezionati in una selezione multipla ListBox utilizzando selected e List
Codice:
Private Sub CommandButton1_Click()
For n = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(n) = True Then
MsgBox ListBox1.List(n)
End If
Next n
End Sub
La Proprietà Style
Questa proprietà è valida per ComboBox e non per ListBox e determina se la scelta della voce può essere fatta dalla lista a discesa oppure digitando nel campo di testo il valore della ComboBox. Dispone di due impostazioni:
  • fmStyleDropDownCombo (valore 0). L'utente ha entrambe le opzioni di digitare un valore personalizzato nell'area di testo o selezionare dall'elenco a discesa. Questo è il valore predefinito.
  • fmStyleDropDownList (valore 2). L'utente può selezionare solo dall'elenco a discesa, come in ListBox.
La proprietà Style può essere impostata nella finestra Proprietà oppure con codice VBA.


La Proprietà TextColumn
Specifica la colonna da visualizzare in un controllo ComboBox o ListBox a più colonne, quando una riga è selezionata dall'utente. La prima colonna ha un valore TextColumn di 1, la seconda ha un valore di 2, e così via. Impostare il valore di TextColumn a 0 visualizza il valore ListIndex (che è il numero della riga selezionata) nella proprietà TextColumn, questa impostazione è utile se si desidera determinare la riga della voce selezionata.
La proprietà TextColumn può essere impostata nella finestra Proprietà o con codice VBA. Nota: In un ComboBox, quando un utente seleziona un elemento, la colonna specificata nella proprietà TextColumn verrà visualizzato nella parte casella di testo del ComboBox.

Esempio: Utilizzo di TextColumn per visualizzare prima colonna e BoundColumn per la seconda colonna in una ListBox a selezione singola
Codice:
Private Sub UserForm_Initialize()
With ListBox1
.ColumnHeads = True
.ColumnCount = 2
.ColumnWidths = "50;0"
.RowSource = "=Foglio2!A2:B6"
.MultiSelect = fmMultiSelectSingle
.TextColumn = 1
.BoundColumn = 2
End With
End Sub
 
Private Sub CommandButton1_Click()
If ListBox1.Value <> "" Then   
TextBox1.Value = ListBox1.Value & " cms"
End If
End Sub
Aggiungere elementi per popolare un controllo ListBox o ComboBox
Impostare la proprietà RowSource di un controllo ListBox o ComboBox in un form utente per un elenco statico:
Me.ListBox1.RowSource = "Foglio1 A1: B6" oppure Me.ListBox1.RowSource = "= Foglio1 A1: B6"
Mentre per un elenco dinamico: Me.ListBox1.RowSource = "Foglio1 A1: B" . & Foglio1.Cells (Rows.Count, "B") End (xlUp) Row

Esempio: Popolare un ComboBox impostando la proprietà RowSource di una lista denominata
Codice:
Private Sub UserForm_Initialize()
With ComboBox1
.ColumnCount = 2
.ColumnWidths = "50;50"
.ColumnHeads = True
.RowSource = "Foglio1!nome_intervallo"  <<<< da cambiare con Vs. nome intervallo
End With
End Sub
Popolare un ComboBox o ListBox da un array a colonna singola in un ListBox:
ListBox1.List = Array ("Riga1", "Riga2", "Riga3", "Riga4")
in un ComboBox:
ComboBox1.List = array ("Riga1", " Riga2", " Riga3", " Riga4")
Compilare un ListBox da una matrice denominata myArray:
Dim myArray As Variant
myArray = Array ("Adidas", "Nike", "Reebok")
Me.ListBox1.List = myArray

Popolare una singola colonna in un ComboBox:
Dim i As Integer
Dim myArray As Variant
myArray = Array ("Adidas", "Nike", "Reebok", "Puma", "Polo")
For i = LBound(myArray) To UBound(myArray)
Me.ComboBox1.AddItem myArray(i)
Next


Esempio: Popolare un ListBox a più colonne da un Range del foglio di lavoro
Codice:
Private Sub UserForm_Initialize()
With ListBox1
.ColumnCount = 3
.ColumnWidths = "50;50;50"
.ColumnHeads = False
End With
Dim rng As Range
Set rng = Foglio1.Range("A1:C6")
Me.ListBox1.List = rng.Cells.Value
End Sub
Esempio: Popolare un ListBox a più colonne dal Range del Foglio di lavoro
Codice:
Private Sub UserForm_Initialize()
With ListBox1
.ColumnCount = 3
.ColumnWidths = "50;50;50"
.ColumnHeads = False
End With
Dim var As Variant
var = Foglio1.Range("A1:C6")
Me.ListBox1.List = var
End Sub
Esempio: Popolare un ListBox a più colonne dal Range di un foglio di lavoro dopo aver posizionato i dati di in una matrice a 2 dimensioni
Codice:
Option Base 1
Private Sub UserForm_Initialize()
Dim rng As Range
Dim cell As Range
Dim totalRiga As Integer, totalColon As Integer
Dim iRow As Integer, iCol As Integer
Dim myArray() As Variant
Set rng = Foglio1.Range("A1:C6")
totalRiga = Foglio1.Range("A1:C6").Rows.Count
totalColon = Foglio1.Range("A1:C6").Columns.Count
ReDim myArray(totalRiga, totalColon)
For Each cell In rng
For iRow = 1 To totalRiga
For iCol = 1 To totalColon
myArray(iRow, iCol) = rng.Cells(iRow, iCol)
Next iCol
Next iRow
Next
With ListBox1
.ColumnCount = 3
.ColumnWidths = "50;50;50"
.ColumnHeads = False
.List = myArray
End With
End Sub
Esempio: Caricare una matrice a 2 dimensioni in un ListBox utilizzando la proprietà List
Codice:
Private Sub UserForm_Initialize()
With ListBox1
.ColumnCount = 3
.ColumnWidths = "50;50;50"
.ColumnHeads = False
End With
With ListBox2
.ColumnCount = 3
.ColumnWidths = "50;50;50"
.ColumnHeads = False
End With
End Sub
 
Private Sub CommandButton1_Click()
Dim myArray(3, 3)
For n = 0 To 2
myArray(n, 0) = n + 1
Next n
myyArray(0, 1) = "R1C2"
myArray(1, 1) = "R2C2"
myArray(2, 1) = "R3C2"
myArray(0, 2) = "R1C3"
myArray(1, 2) = "R2C3"
myArray(2, 2) = "R3C3"
ListBox1.List() = myArray
ListBox2.Column() = myArray
End Sub
Esempio: Popolare un ComboBox con i 12 mesi in un anno
Codice:
Private Sub UserForm_Initialize()
With ComboBox1
.ColumnCount = 1
.ColumnWidths = "50"
.ColumnHeads = False
.RowSource = ""
End With
For n = 1 To 12
ComboBox1.AddItem Format(DateSerial(2014, n, 1), "mmmm")
Next n
End Sub
Esempio: Popolare una ListBox a più colonne da un Range utilizzando il metodo AddItem e List
Codice:
Private Sub UserForm_Initialize()
With ListBox1
.ColumnCount = 3
.ColumnWidths = "50;50;50"
.RowSource = ""
End With
End Sub
 
Private Sub CommandButton1_Click()
Dim conta As Long
Dim totalRiga As Long
totalRiga = Foglio4.Cells(Rows.Count, "A").End(xlUp).Row
conta = 0
Do
With Me.ListBox1
conta = conta + 1
.AddItem Foglio4.Cells(conta, 1).Value
.List(.ListCount - 1, 1) = Foglio4.Cells(conta, 1).Offset(0, 1).Value
.List(.ListCount - 1, 2) = Foglio4.Cells(conta, 1).Offset(0, 2).Value
End With
Loop Until conta = totalRiga
End Sub
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato   Rispondi citando
Vecchio 13-02-2012, 17.51.32   #12
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
Gestione Preventivi: Il Listino Prezzi

Vorrei ora presentarvi la costruzione di un’applicazione di Gestione preventivi molto semplice e intuitiva nell’uso quotidiano, che dispone di un archivio per poter archiviare e visionare i preventivi emessi, di un’anagrafica clienti, di un listino prezzi e altri piccoli accessori che possono essere utili senza dover ricorrere a software costosi e altrettanti onerosi canoni di manutenzione.
Ritengo la fase di progettazione di un software molto importante in quanto deve essere prevista la possibilità di eseguire future implementazioni e si deve operare in modo da poter essere in grado di approntarle in un prossimo futuro. Pertanto è opportuno dotare il foglio preventivi delle opportune “ruote di scorta” che possono esserci utili nel proseguo della programmazione. Parte fondamentale di questa breve presentazione è il foglio Listino e il foglio Archivio, in quanto si deve prevedere la possibilità di poter aggiungere dei campi a seconda delle necessità.
Ho pensato di utilizzare un listino prezzi separando gli articoli in categorie merceologiche in modo da poter individuare facilmente gli articoli durante la stesura del preventivo stesso, e facilitando anche le operazioni di stampa per categoria per i normali usi di gestione giacenze. Pertanto la struttura del foglio Listino, avrà questo aspetto:

Fig. 1

Nota: La larghezza delle colonne è stata volutamente ristretta per poterla rappresentare in questa guida in modo graficamente visibile, potete dare le dimensioni che volete alle varie colonne.

Come vedete ho strutturato il Listino Prezzi sviluppando le categorie sulle colonne e dedicando ad ogni categoria 14 colonne, separandole da una colonna vuota. La riga 1 ospita il titolo della categoria (rif. A1), la riga 2 le etichette (rif. A2) per le varie colonne e dalla riga 3 inseriamo tutti gli articoli con i relativi dati. Essendo ogni categoria composta da 14 colonne, divise da una colonna vuota, e considerando che un foglio di Excel ha 256 colonne disponibili (ver. 2003), facendo un rapido calcolo, dividendo le 256 colonne totali per le 15 utilizzate (14 + la colonna vuota) danno come risultato 16 categorie, che a mio avviso è un numero più che soddisfacente di categorie.

Ogni categoria ha una colonna in cui inserire il codice articolo, poi la descrizione dell’articolo e infine una colonna note, a cui si può dedicare la locazione dell’articolo. Per esempio se parliamo di un componente del motore di una vettura sarà alloggiato nella categoria Motore, e nel campo note si può identificare ulteriormente inserendo Distribuzione oppure Iniezione. Può ritornare utile questo “sottogruppo” per poter estrarre tutti gli articoli che appartengono alla categoria Motore suddividendoli per sottocategorie, come per esempio Iniezione o Distribuzione. Dopo il campo note troviamo il campo Fornitore e di seguito il Codice Fornitore, che sarebbe il codice dell’articolo assegnato dal fornitore nel suo archivio, molto utile da riportare in eventuali ordini a fornitore.

Nel campo U.M. va inserita l’unità di misura dell’articolo e nel campo successivo la data cui viene inserito il prezzo, che si trova nel campo successivo e che si riferisce al prezzo di acquisto dell’articolo. Il campo successivo rappresenta la percentuale di ricarico sul prezzo di acquisto dell’articolo e il prodotto viene inserito nel campo successivo che rappresenta il prezzo finale di vendita. In seguito ci sono altre 4 colonne vuote, che simpaticamente le chiamiamo RDS cioè Ruota di Scorta, utili per ricevere eventuali implementazioni in un prossimo futuro

Fatta questa premessa per spiegare la struttura del foglio Listino possiamo ora passare all’interrogazione dello stesso ipotizzando che in questa fase gli articoli di prova siano stati inseriti manualmente agendo direttamente dal foglio, vedremo anche l’inserimento e la modifica degli articoli nella Form che segue. Come abbiamo già spiegato nel corso base inseriamo una Userfom e la strutturiamo come la seguente inserendo i vari controlli.

Fig. 2

Come prima operazione da eseguire, dobbiamo popolare il ListBox1 (quello delle categorie), e per farlo sfruttiamo l’evento Activate della form che ospita i controlli inserendo questo codice.

Codice:
Private Sub UserForm_Activate()
1)	Dim j As Integer
2)	j = 1
3)	Do Until Sheets("Listino").Cells(1, j) = Empty
4)	ListBox1.AddItem (Sheets("Listino").Cells(1, j).Value)
5)	j = j + 15
6)	Loop
End Sub
Nota: Il codice sorgente esposto NON include un numero davanti ad ogni linea, La numerazione delle linee dei listati rappresentati è stata usata solo per facilitare l’identificazione e la discussione di particolari linee nei vari listati

Commentiamo questo codice: Alla riga 1 dell’enunciato viene dichiarata la variabile j come Integer e alla riga 2 vien posta uguale a 1. Alla riga 3 con un ciclo Do Loop si scorre tutto il foglio Listino con le coordinate di riga 1 e di colonna j che in questo momento ha il valore di 1, pertanto le coordinate diventano riga 1, colonna 1. Alla riga 4 carichiamo il ListBox1 con i valori reperiti nel foglio Listino alle coordinate di riga 1 e colonna j ma alla riga 5 la variabile j, che vale 1 viene incrementata di 15 unità e sostituendo nell'operazione matematica il nome della variabile e inserendo il suo valore ci riporta j=1+15 che prende il valore di 16. Alla riga 6 ritorniamo ad inizio del ciclo tramite la parola chiave Loop con la variabile j che adesso vale 16. Si continua nel ciclo Do effettuando un “salto” ogni 16 colonne fino a trovare nelle coordinate di riga e colonna nessun valore e interrompere il ciclo.

Una volta che abbiamo riempito il ListBox1 delle categorie, facendo clic sullo stesso dobbiamo riempire il ListBox2 con l’elenco degli articoli presenti per la categoria selezionata. Per eseguire l’operazione richiesta sfruttiamo l’evento Click del ListBox2 e inseriamo questo codice

Codice:
Private Sub ListBox1_Click()
1)	posiz = (ListBox1.ListIndex + 1) * 15 - 14
2)	If ListBox2.ListCount >= 1 Then ListBox2.Clear
3)	i = 3
4)	Do Until Sheets("Listino").Cells(i, posiz) = Empty
5)	With Sheets("Listino")
6)	elemen = .Cells(i, posiz).Value & Space(5) & .Cells(i, posiz + 1).Value
7)	End With
8)	ListBox2.AddItem elemen
9)	i = i + 1
10)	Loop
11)	cancella
End Sub
Nella prima istruzione usiamo una variabile (posiz) che abbiamo precedentemente dichiarato pubblica ad inizio del modulo, per cui condivisibile in tutte le routine dello stesso.

Fig. 3

Nella riga 1 usiamo la variabile posiz per calcolare le coordinate della colonna iniziale delle categorie usando una espressione matematica articolata in questo modo. L’istruzione ListBox.ListIndex + 1 riporta la posizione della voce che andiamo a selezionare nella casella a discesa (ListBox1), per esempio se clicchiamo sulla Categoria 2, la funzione riporta come risultato il numero 2. Per verificarlo modifichiamo il listato in questo modo e mandiamolo in esecuzione

Codice:
Private Sub ListBox1_Click()
posiz = (ListBox1.ListIndex + 1) 
MsgBox posiz
End Sub
E ci riporta un messaggio come questo

Fig. 4

Pertanto selezionata la categoria nel ListBox1 abbiamo il valore di ListBox.ListIndex che andremo a moltiplicare per 15 (che rappresenta il numero delle colonne presenti in una categoria) e a cui sottraiamo il numero 14 (che rappresenta il numero delle colonne meno la colonna vuota nera di divisione). Facendo un rapido calcolo le 3 categorie si trovano alla colonna 1 (Rif. A1) poi alla colonna 16 (Rif. P1) e l’ultima categoria si trova alla colonna 31 (Rif. AE1)

Infatti cliccando sulla prima voce del ListBox1 ci viene rimandato come valore di ListBox.ListIndex il numero 1 che moltiplicandolo per 15 e sottraendo 14 riporta come risultato finale 1, che rappresenta la colonna 1. Utilizzando la stessa logica matematica per le altre 2 categorie, avremmo che per la seconda categoria ListBox.ListIndex assume il valore di 2 e per la terza categoria il valore di 3. Eseguendo l’operazione matematica per la seconda categoria moltiplichiamo il valore di ListBox.ListIndex che è 2 per 15 e sottraendo 14 otteniamo come risultato finale il numero 16. Che corrisponde all’esatto numero di colonna in cui inizia la seconda categoria. Anche per la terza categoria, seguendo sempre il calcolo matematico, moltiplicando il valore di ListBox.ListIndex che è 3 per 15 e sottraendo 14 riporta come risultato finale il numero 31.

Ritornando all’enunciato del ListBox1 alla riga 2 si verifica se il numero di voci presenti nel ListBox2 sia maggiore di zero o uguale a 1, se il risultato della verifica è True (cioè Vero) allora si svuota tutto l’elenco di voci presenti nel LIstBox2. Proseguendo alla riga 3 poniamo la variabile i uguale a 3 e nella riga 4, scorriamo tutte le colonne del foglio Listino alle coordinate di riga i (che vale 3) e di colonna posiz (che vale 1 per la prima voce, 16 per la seconda e 31 per la terza) e il ciclo si ferma quando alle coordinate di colonna NON trova niente scritto niente (Empty = vuoto) nella cella. Successivamente alla riga 5 iniziamo un ciclo With che alla riga 6 usiamo per caricare la matrice elemen con I valori presenti alle coordinate di riga I e colonna posiz, inseriamo poi uno spazio di 5 caratteri e memorizziamo in matrice anche I valori che si trovano alle coordinate di riga I e colonna posiz+1. Alla riga 7 dichiariamo la fine del ciclo With e alla [color="Navy"] riga 8[/color + popoliamo il listBox2 con la matrice elemen. Alla riga 9 incrementiamo la variabile i di una unità e alla riga 10 ritorniamo all’inizio del ciclo Do con la parola chiave Loop e ripetiamo tutte le istruzioni con il valore di riferimento di riga incrementato di 1 per passare così alle righe successive. Il ciclo si arresta quando si trova una riga vuota. Alla riga 11 viene richiamata la routine Cancella che si occupa di svuotare tutti i valori presenti nei vari TextBox della form tramite questo codice

Codice:
Private Sub cancella()
z = 1
For z = 1 To 10
    Controls("TextBox" & z) = ""
  Next z
End Sub
Con questo codice scorriamo tutti i controlli TextBox assegnando tramite il ciclo For l’indice z che corrisponde a TextBox(z). al primo ciclo z vale 1 per cui l’enunciato diventa TextBox1 e via di seguito fino alla fine del ciclo.
A questo punto abbiamo il ListBox 2 popolato che ci presenta tutti gli articoli presenti nella categoria selezionata, ora cliccando su un articolo presente nel listBox2 dobbiamo estrarre i valori dell’articolo presenti nel foglio e inserirli nelle varie caselle di testo (TextBox) utilizzando il seguente codice.

Codice:
Private Sub ListBox2_Click()
1)	p = ListBox2.ListIndex + 3 
2)	cancella
3)	vedi
End Sub
L’istruzione alla riga 1 calcola il numero di riga corrispondente alla voce selezionata, come abbiamo visto per il ListBox1, l’istruzione ListBox.ListIndex riporta il numero di voce che viene selezionata, per cui se selezioniamo la 3° voce ci riporta il numero 3 a cui sommiamo ancora il valore 3 per ottenere come risultato finale e nostro riferimento di riga il valore 6. Se andiamo a controllare in figura 1 noteremo che la 3° voce dell’elenco degli articoli è posizionato sulla riga 6. Ritornando al codice alla riga 2 viene richiamata la routine Cancella che abbiamo appena visto per il ListBox1, mentre alla riga 3 dell’enunciato viene richiamata la routine vedi, che si occupa di recuperare i dati forniti dalle coordinate di riga e colonna fornite dal programma. Il codice usato nella routine vedi è il seguente

Codice:
Private Sub vedi()
On Error Resume Next
With Sheets("Listino")
   TextBox1.Text = .Cells(p, posiz)                                      'codice articolo
   TextBox2.Text = .Cells(p, posiz + 4)                                'codice articolo fornitore
   TextBox3.Text = .Cells(p, posiz + 1)                                'descrizione articolo
   TextBox4.Text = .Cells(p, posiz + 2)                                 'note articolo
   TextBox5.Text = .Cells(p, posiz + 3)                                 'fornitore
   TextBox6.Text = .Cells(p, posiz + 5)                                  'unità di misura
   TextBox7.Text = .Cells(p, posiz + 6)                                  'data inserimento costo
   TextBox8.Text = Format(.Cells(p, posiz + 7), "#0.00")   'costo articolo
   TextBox9.Text = Format(.Cells(p, posiz + 8), "#%")      ' % ricarico
   TextBox10.Text = .Cells(p, posiz + 9)                              'prezzo vendita    
   calcola
End With
End Sub
Come si vede nel codice tramite un ciclo With andiamo ad estrarre dal foglio Listino i valori alle coordinate di riga p, che abbiamo determinato con il valore 3 e alla colonna posiz che abbiamo già stabilito il suo valore in base alla categoria scelta e inseriamo nei vari TextBox. Da notare che determinato il valore di posiz, che corrisponde alla prima colonna della categoria scelta, per identificare le altre colonne usiamo la notazione posiz+1, posiz+2 etc.
Essendo posiz un valore variabile tramite la scelta della categoria, in questo modo possiamo spostarci nelle varie colonne con una notazione “variabile” nel codice, cioè non usando delle coordinate fisse che andrebbero bene per una categoria ma non per le altre che andremo a scegliere. Nel proseguo del listato incontriamo poi la routine calcola, che si occupa di verificare il prodotto tra il campo “costo articolo” e “percentuale di ricarico” la routine è:

Codice:
Private Sub calcola() 'calcolo prezzo articolo con ricarico
TextBox10.Text = Format(CDbl(TextBox10) + CDbl(TextBox8) * Val(TextBox9) / 100, "#0.00")
End Sub
In questo enunciato dobbiamo moltiplicare 2 valori, il prezzo di acquisto dell’articolo per la percentuale di ricarico, li andiamo ad inserire nel TextBox del prezzo finale di vendita usando la formattazione numerica con 2 decimali. Per usare un valore decimale si usa la funzione CDbl che converte un valore integer in valore Double. Per il TextBox9 (percentuale di ricarico) usiamo invece la funzione Val che converte un valore stringa in valore numerico. Ho pensato inoltre che in fase di consultazione del listino si potrebbe decidere di cambiare la percentuale di ricarico, oppure il fornitore ci comunica che il prezzo di acquisto di un determinato articolo è stato variato, invece di dover editare possiamo semplicemente cambiare i valori presenti nei vari TextBox inserendo quelli nuovi e tramite l’evento Change possiamo ricalcolare gli importi tramite questo codice

Codice:
Private Sub TextBox8_Change() ' costo di acquisto
If TextBox8 <> "" Then
TextBox10.Text = Format(CDbl(TextBox8) + CDbl(TextBox8) * Val(TextBox9) / 100, "#0.00")
Else
End If
End Sub

Private Sub TextBox9_Change() ' % ricarico
If TextBox9 <> "" Then
TextBox10.Text = Format(CDbl(TextBox8) + CDbl(TextBox8) * Val(TextBox9) / 100, "#0.00")
Else
End If
End Sub
Con le due routine sopra esposte possiamo modificare i valori del TextBox8 (prezzo di acquisto) e del TextBox9 (percentuale di ricarico) per aggiornare automaticamente il prezzo finale di vendita. Da notare che abbiamo inserito l’espressione matematica in un ciclo IF in quanto se dovessimo cancellare tutte le cifre in uno dei 2 TextBox ci verrebbe rimandato un errore, in questo modo evitiamo l’errore in quanto la procedura prosegue finchè il TextBox è diverso da stringa vuota. Possiamo inoltre modificare qualsiasi altro TextBox e correggere eventuali errori oppure effettuare degli aggiornamenti a determinati articoli, però per poter salvare nel foglio Listino i nuovi valori si deve cliccare sul pulsante “Salva” che riporta questo codice

Codice:
Private Sub CommandButton1_Click()
    If p = 0 Then
        MsgBox "Devi scegliere un articolo", vbExclamation
        Exit Sub
    End If
    scrivi
End Sub
Inseriamo anche una condizione con il ciclo IF per essere certi che sia selezionato un articolo quando si clicca sul pulsante di salvataggio dei dati, ricordo che la variabile p viene tratta dall’evento click del ListBox2 dove calcoliamo il numero di riga dell’articolo selezionato, per cui se p è uguale a zero non abbiamo selezionato nessun articolo e rimandiamo un avviso all’utente che deve selezionare un articolo prima di procedere con il salvataggio e forziamo l’uscita dalla routine. Successivamente viene richiamata la routine scrivi che presenta questo codice

Codice:
Private Sub scrivi()
On Error Resume Next
With Sheets("Listino")
   .Cells(p, posiz) = TextBox1.Text            'codice articolo
   .Cells(p, posiz + 1) = TextBox3.Text     'descrizione articolo
   .Cells(p, posiz + 2) = TextBox4.Text     'note articolo
   .Cells(p, posiz + 3) = TextBox5.Text     'fornitore
   .Cells(p, posiz + 4) = TextBox2.Text     'codice articolo fornitore
   .Cells(p, posiz + 5) = TextBox6.Text     'unità di misura
   .Cells(p, posiz + 6) = TextBox7.Text     'data inserimento costo
   .Cells(p, posiz + 7) = TextBox8.Text     'costo articolo
   .Cells(p, posiz + 8) = TextBox9.Text     '% ricarico
   .Cells(p, posiz + 9) = TextBox10.Text   'Prezzo vendita
     End With
End Sub
Come si può notare è molto simile alla routine vedi, sono solo state invertite le posizioni dei TextBox rispetto ai riferimenti del foglio nel ciclo With. In questo caso il valore ubicato alle coordinate di riga p e colonna posiz vengono sovrascritte dai valori presenti nei vari TextBox. Proseguiamo assegnando al pulsante Uscita la routine

Codice:
Private Sub CommandButton2_Click()
   Unload Me
End Sub
Passiamo ora alla routine Stampa Categoria, ricordando che si deve prima selezionare una categoria nel ListBox1 e solo successivamente premere il pulsante Stampa categoria a cui viene assegnato il seguente codice

Codice:
Private Sub CommandButton3_Click()
stampa
End Sub
La routine sopra descritta viene assegnata al tasto Salva presente nella Userform che richiama la routine stampa che si occupa della stampa vera e propria degli elementi selezionati con questo codice

Codice:
Sub stampa()
1) Application.ScreenUpdating = False
2) Sheets("listino").Select
3) Cells(1, posiz).Select
4) ultima = Cells(Rows.Count, posiz).End(xlUp).Row
5) Range(Cells(1, posiz), Cells(ultima, posiz + 9)).Select
6) Selection.Copy
7) Workbooks.Add
8) Range("A1").Select
9) ActiveSheet.Paste
10) Range("a1").Select
11) Range("C:C,I:I").Delete
12) Columns(1).ColumnWidth = 8     'codice
13) Columns(2).ColumnWidth = 30    'descrizione
14) Columns(3).ColumnWidth = 15    'fornitore
15) Columns(4).ColumnWidth = 8     'codice fornitore
16) Columns(5).ColumnWidth = 8     'U.M.
17) Columns(6).ColumnWidth = 10    'data
18) Columns(7).ColumnWidth = 10    'vendita
19) With ActiveSheet.PageSetup
20) .PrintTitleRows = "$1:$2"
21) .CenterHeader = "Listino Articoli - Pagina &P di &N"
22) .RightHeader = "&""Arial,Grassetto\&12Stampa del &D"
23) .LeftMargin = Application.InchesToPoints(0)
24) .RightMargin = Application.InchesToPoints(0)
25) .CenterHorizontally = True
26) .CenterFooter = "Data stampa :&D"
27) .Zoom = 90
28) End With
29) ActiveSheet.PrintOut Copies:=1
30) ActiveWorkbook.Saved = True
31) ActiveWorkbook.Close
32) Windows("Preventivi.xls").Activate
33) Range("Q10").Select
34) Application.CutCopyMode = False
35) Application.ScreenUpdating = True
36) Unload Me
End Sub
Questa routine di stampa è stata strutturata per avere un riepilogo scritto degli articoli presenti in una categoria relativo ai prezzi di acquisto, sono stati volutamente esclusi i campi in cui abbiamo inserito la percentuale di ricarico e il prezzo di vendita. Può essere utile in forma scritta se si vuole controllare i prezzi di acquisto dei fornitori per singolo articolo, oppure affidare il controllo a qualche subalterno senza dover divulgare notizie sensibili sulle percentuali di utile.

Commentiamo ora il codice della routine. Con l’istruzione presente alla riga 1 si evita di vedere a video le operazioni che compie la macro in esecuzione, alla riga 2 attiviamo il foglio “Listino” e selezioniamo la cella alle coordinate di riga 1 e colonna posiz (che conosciamo già) alla riga 4 troviamo l’ultima cella scritta della colonna posiz e alla riga 5 selezioniamo l’intervallo di celle partendo dalla riga 1 e colonna posiz fino alla riga ultima e colonna posiz + 9.

Alla riga 6 copiamo l’intervallo di celle, alla riga 7 aggiungiamo una nuova cartella di lavoro, selezioniamo la cella A1 alla riga 8 e alla riga 9 incolliamo i dati copiati precedentemente, poi selezioniamo la cella A1 alla riga 10 e cancelliamo due colonne alla riga 11. Dalla riga 12 alla riga 18 modifichiamo la larghezza delle prime 7 colonne per adattarle al testo e dalla riga 19 alla riga 28 impostiamo il setup della stampante, per poi mandare il documento in stampa alla riga 29. Alla riga 30 salviamo il file creato, (magari utile per future consultazioni) e alla riga 31 lo chiudiamo. Passiamo poi il controllo al file origine, cioè “Preventivi.xls” alla riga 32, selezioniamo la cella Q10 alla riga 33 e alla riga 34 disabilitiamo la selezioni delle celle copiate nel foglio Listino, per poi riabilitare lo schermo e chiudere la routine alla riga 36
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato   Rispondi citando
Vecchio 13-02-2012, 17.54.55   #13
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
#2

Gestione Preventivi: Anagrafica Clienti


In un programma di gestione Preventivi non può mancare la gestione dell’anagrafica clienti. Ora vedremo come costruire e gestire un archivio anagrafico, visualizzarne i dati, modificarli e inserirne di nuovi. L’anagrafica oltre ad essere molto importante in ogni supporto informatico risulta essere molto utile in quanto la possiamo strutturare in modo da pianificare il lavoro quotidiano inserendo per ciascun cliente, oltre ai dati anagrafici, anche i recapiti telefonici, il fax, l’indirizzo email e tanto altro. Iniziamo strutturando il foglio clienti che conterrà l’elenco dei dati in questo modo.

Fig. 1

Nota: La larghezza delle colonne è stata volutamente ristretta per poterla rappresentare in questa guida in modo graficamente visibile, potete dare le dimensioni che volete alle varie colonne.

L’archivio clienti che utilizzeremo in questo contesto è rappresentato dal foglio di lavoro “clienti”, in cui la prima riga viene utilizzata per inserire le intestazioni delle colonne e dalla riga successiva andremo ad inserire l’elenco dei dati. Questa struttura ricalca il concetto di tabella nei database, dove le colonne rappresentano i campi della tabella e le righe i record. Inseriamo 5 clienti di prova e costruiamo una Userform per interrogare l’archivio come quella riportata in figura 2, con 1 controllo LisBox, 16 controlli TextBox inseriti in un controllo Frame e 3 controlli CommandButton

Fig. 2

Nell’evento Activate della Form è stato inserito il listato che permette di visualizzare l’archivio clienti in questo modo:

Codice:
Private Sub UserForm_Activate() 
aggiorna
End Sub
L’evento contiene una sola riga di codice che richiama la routine aggiorna, in quanto il codice che sarebbe stato inserito nell'evento Activate verrà usato in altri parti del programma per cui, in casi del genere, invece di continuare a ripetere lo stesso codice risulta più utile spostarlo in una procedura a sé e richiamarla quando ci ritorna utile. Ritornando al nostro evento, la prima istruzione che dobbiamo eseguire è quella di popolare il controllo ListBox presente sul lato sinistro della Form e la routine aggiorna si occupa proprio di questo utilizzando il seguente codice

Codice:
Private Sub aggiorna() 
1.	If ListBox1.ListCount >= 1 Then ListBox1.Clear
2.	i = 2
3.	Do Until Sheets("clienti").Cells(i, 2).Value = ""
4.	With Sheets("clienti")
5.	elemento = .Cells(i, 2).Value
6.	End With
7.	ListBox1.AddItem elemento
8.	i = i + 1
9.	Loop
10.	ListBox1.ListIndex = 0
End Sub
Alla riga 1 utilizziamo l’istruzione ListCount che inserendola in un enunciato IF verifica se nel ListBox sono presenti dei dati. Dalla sintassi si evince che se ListCount è maggiore o uguale a 1 allora il ListBox contiene dei dati e viene svuotato del contenuto tramite l’istruzione Clear, evitando così il rischio di trovarsi i dati ripetuti nella casella combinata. Alla riga 2 viene assegnato il valore 2 alla variabile i. Questo valore identifica la riga iniziale dove abbiamo archiviato i dati dei clienti. Dalla riga 3 e fino alla riga 9 tramite un ciclo DO Loop scorriamo tutto l’archivio, usando la variabile i per identificare la riga (che vale 2) e la colonna 2, dove abbiamo inserito la ragione sociale del cliente. Nel ciclo la variabile i viene incrementata di 1 unità alla riga 8 in modo da poter scorrere tutte le righe dell’archivio fino a trovare una cella vuota nella colonna 2 che interromperà l’esecuzione del codice in quanto l’istruzione inserita alla riga 3 viene stabilito come fine ciclo la presenza di una cella vuota nella colonna 2 che indica la fine dell’archivio.

Mentre il ciclo scorre le righe vengono letti i valori alle coordinate di riga i e colonna 2 e caricati nella matrice elemento per poi usarla per popolare il ListBox1 con l’istruzione AddItem, presente alla riga 7. Alla riga 9 la parola chiave Loop ci riporta a inizio del ciclo, alla riga 3, e si ripetono tutte le operazioni fino alla riga 9 che terminano quando viene trovata una cella vuota nella colonna 2 che segnala la fine dell’archivio. La riga 10 con l’istruzione ListIndex si Indica al programma che vogliamo far apparire come prima voce dell’elenco nel ListBox, la prima voce dell’elenco dell’archivio clienti, se avessimo assegnato a ListIndex il valore 1 avremmo come prima voce la seconda presente nell’elenco dei clienti, perché questo tipo di controllo ha come valore iniziale “0” [zero], per cui la prima voce presente nell’elenco di questo controllo avrà come valore List 0, la seconda valore 1, la terza valore 2 e così di seguito.

A questo punto del programma avremmo il ListBox1 con l’elenco dei clienti, se notate presenta un pallino sulla sinistra del nome del cliente, questa opzione è possibile ottenerla agendo sulla proprietà ListStyle dalla finestra delle proprietà una volta selezionato il controllo come evidenziato in Figura 3 dalla freccia rossa.

Fig. 3

Quando selezioniamo un cliente nel ListBox1 facendo clic col mouse su uno di loro, tutti i controlli TextBox verranno popolati con i dati presenti nell’archivio sfruttando l’evento Click del controllo ListBox tramite questo codice

Codice:
Private Sub ListBox1_Click()
1.	p = ListBox1.ListIndex + 2
2.	vedi
End Sub
Alla riga 1 ritorniamo ad usare l’istruzione ListIndex, che abbiamo appena visto, oltre a quanto appena detto possiamo aggiungere che per conoscere la riga del foglio a cui corrisponde la voce selezionata dobbiamo sommare al valore di ListIndex il valore 2 in quanto rappresenta il numero di riga iniziale dell’archivio anagrafico, pertanto la variabile p rappresenta il numero di riga iniziale del nostro archivio. Dobbiamo inoltre tenere presente che la variabile p è stata dichiarata pubblica a inizio modulo, per cui utilizzabile in tutte le routine del modulo

Fig. 4

Alla riga 2 viene richiamata la routine vedi, che si occupa di popolare tutti i controlli TextBox con i dati del cliente scelto. Il codice della routine è il seguente:

Codice:
Private Sub vedi() 
TextBox1.Text = Sheets("clienti").Cells(p, 1)            'cod
TextBox2.Text = Sheets("clienti").Cells(p, 2)            'rag.sociale
TextBox3.Text = Sheets("clienti").Cells(p, 3)            'indirizzo
TextBox4.Text = Sheets("clienti").Cells(p, 4)            'cap
TextBox5.Text = Sheets("clienti").Cells(p, 5)            'città
TextBox6.Text = Sheets("clienti").Cells(p, 6)            'provincia
TextBox7.Text = Sheets("clienti").Cells(p, 7)            'p.iva
TextBox8.Text = Sheets("clienti").Cells(p, 8)            'pagamento
TextBox9.Text = Sheets("clienti").Cells(p, 9)            'banca+agenzia
TextBox10.Text = Sheets("clienti").Cells(p, 10)        'iban
TextBox11.Text = Sheets("clienti").Cells(p, 11)        'email
TextBox12.Text = Sheets("clienti").Cells(p, 12)        'telefono
TextBox13.Text = Sheets("clienti").Cells(p, 13)        'telefono diretto
TextBox14.Text = Sheets("clienti").Cells(p, 14)        'fax
TextBox15.Text = Sheets("clienti").Cells(p, 15)        'responsabile
TextBox16.Text = Sheets("clienti").Cells(p, 16)        'cellulare
End Sub
Credo che sia molto semplice il codice esposto, si prendono tutti i valori presenti nel foglio clienti alle coordinate di riga p e colonna fissa data dalle impostazioni dell’archivio anagrafico che abbiamo visto in figura 1 e si inseriscono nei vari controlli TextBox

Nota: Con il termine colonna fissa si intende una colonna definita da un numero preciso e NON da una variabile

Abbiamo citato varie volte la routine cancella, vediamo ora il suo codice
Codice:
Private Sub cancella()
1.	conta = 1
2.	For conta = 1 To 16
3.	Controls("TextBox" & conta) = ""
4.	Next conta 
End Sub
Alla riga 1 assegniamo alla variabile conta il valore 1 e alla riga 2 viene usata in un ciclo For per scorrere tutti I controlli TextBox, tenendo presente che la variabile conta determina il valore iniziale del ciclo, sempre nella riga 2 viene determinato il valore finale del ciclo, che nel nostro caso è rappresentato dal valore 16 che corrisponde al numero dei controlli che vogliamo svuotare. Alla riga 3, usiamo l’operatore di concatenamento & per “incollare” il valore della variabile conta, che rappresenta il contatore del ciclo, alla stringa TextBox ottenendo così la sintassi esatta per identificare i vari controlli (TextBox1, TextBox2 etc.) e assegnare così ai vari TextBox il valore di stringa vuota tramite le due virgolette poste dopo il segno di uguale. Alla riga 4 la parola chiave Next seguita dal nome della variabile conta (il contatore del ciclo) ci riporta alla riga 2 di inizio ciclo e si ripetono le operazioni appena descritte fino al raggiungimento del valore finale del ciclo.

Possiamo ora vedere le azioni svolte dai 3 pulsanti presenti nella Form. Il pulsante Uscita risulta molto semplice e oramai conosciuto per uscire da tutte le Form di VBA, questo è il codice

Codice:
Private Sub CommandButton1_Click() 
Unload Me
End Sub
L’ultimo pulsante presente nella Form è Inserisci Nuovo che si occupa di inserire un nuovo cliente. In questo contesto all’inserimento di un nuovo cliente viene assegnato un codice cliente numerico progressivo, questa non è da ritenere un’operazione indispensabile, il programma funziona anche con codici cliente personalizzati, possiamo considerarlo come un esempio per esporre una tecnica che ci permette di velocizzare le operazioni nei nostri programmi. La tecnica di cui parlo è quella di usare un foglio di appoggio che non è altro che un normale foglio di lavoro in cui andremo a inserire i dati più significativi che ci consentono di semplificare e velocizzare i nostri listati rendendo più lineare la programmazione dei nostri progetti. La struttura del foglio di appoggio Setup è la seguente

Fig. 5

Utilizzeremo il foglio di appoggio inserendo nelle varie righe della prima colonna (A) tutte le descrizioni delle operazioni che ci interessano e poi nella colonna 2 (B) inseriamo i dati che andremo ad utilizzare nelle nostre procedure. Come potete vedere dalla figura 5 il foglio di appoggio non viene utilizzato solo per creare un progressivo del codice cliente, ma dalle descrizioni delle varie operazioni si può ipotizzare che l’uso di questa “tecnica” all’interno dei nostri progetti sia molto vasta e diffusa. Passiamo ora a vedere il codice della routine di inserimento nuovo cliente

Codice:
Private Sub CommandButton3_Click() 
1.	cancella
2.	Mt = Mt & "Attenzione vuoi inserire un nuovo Cliente Confermi?" & Chr(13) & Chr(13)
3.	rs = MsgBox(prompt:=Mt, Title:="Gestione Clienti", Buttons:=vbYesNo + vbQuestion)
4.	If rs = vbNo Then Exit Sub
5.	x = Sheets("Setup").Cells(1, 2)
6.	TextBox1.Text = x + 1
7.	Sheets("Setup").Cells(3, 2) = True
8.	TextBox2.SetFocus
End Sub
Commentiamo il codice. Alla riga 1 c’è la chiamata alla solita routine cancella che svuota tutti I campi poi alla riga 2 e alla riga 3 ci sono le istruzioni che si occupano di portare a video un messaggio di avviso dell’azione che si sta per compiere, rimanendo in attesa di una risposta dall’utente che deve avvenire tramite la selezione del tasto Si oppure del tasto No. Alla riga 4 utilizziamo una condizione IF per uscire dalla routine nel caso si sia deciso di abbandonare la richiesta cliccando sul tasto No della finestra di avviso. Questo è il messaggio

Fig. 6

Se abbiamo deciso di proseguire con l’inserimento di un nuovo cliente cliccando sul pulsante Si, alla riga 5 assegniamo alla variabile x il valore che abbiamo precedentemente scritto con altra routine, che vedremo poco sotto, nella riga 1 e colonna 2 del foglio di appoggio Setup e alla riga 6 assegniamo tale valore al controllo TextBox1 della Form incrementandolo di 1 unità. In questo modo con una sola riga di codice abbiamo ottenuto il codice cliente in forma progressiva. Alla riga 7 del listato andiamo a scrivere il valore True alla riga 3 e colonna 2 del foglio setup, questa scrittura la utilizzeremo come Flag (bandierina) per segnalare ad altra routine da dove proviene una determinata richiesta. Nel nostro caso dobbiamo far sapere alla routine che si occupa di salvare tutti i dati che stiamo facendo un nuovo inserimento, per cui dobbiamo calcolare la riga in cui andare a scrivere i nuovi dati. Nel caso di un nuovo cliente si deve trovare la prima riga vuota dell’elenco e in quella inserire i nuovi dati. Alla riga 8 portiamo il focus, cioè portiamo il cursore sul controllo TextBox2 in attesa dell’inserimento da parte dell’utente della ragione sociale del cliente. Passiamo ora al pulsante Salva che si occupa di salvare i dati di un cliente nell’archivio anagrafico tramite questo codice

Codice:
Private Sub CommandButton2_Click() 
1.	If Sheets("Setup").Cells(3, 2) = True Then
2.	Application.ScreenUpdating = False
3.	Sheets("clienti").Select
4.	ultima = Cells(Rows.Count, 1).End(xlUp).Row
5.	p = ultima + 1
6.	Sheets("Setup").Cells(1, 2) = TextBox1.Text
7.	Sheets("Setup").Cells(3, 2) = False
8.	ElseIf Sheets("Setup").Cells(3, 2) = False Then
9.	End If
10.	Sheets("clienti").Cells(p, 1) = TextBox1.Text           'cod
11.	Sheets("clienti").Cells(p, 2) = TextBox2.Text           'rag. sociale
12.	Sheets("clienti").Cells(p, 3) = TextBox3.Text           'indirizzo
13.	Sheets("clienti").Cells(p, 4) = TextBox4.Text           'cap
14.	Sheets("clienti").Cells(p, 5) = TextBox5.Text           'città
15.	Sheets("clienti").Cells(p, 6) = TextBox6.Text           'provincia
16.	Sheets("clienti").Cells(p, 7) = TextBox7.Text           'P.iva
17.	Sheets("clienti").Cells(p, 8) = TextBox8.Text           'Pagamento
18.	Sheets("clienti").Cells(p, 9) = TextBox9.Text           'Banca
19.	Sheets("clienti").Cells(p, 10) = TextBox10.Text         'Iban
20.	Sheets("clienti").Cells(p, 11) = TextBox11.Text         'email
21.	Sheets("clienti").Cells(p, 12) = TextBox12.Text         'Telefono1
22.	Sheets("clienti").Cells(p, 13) = TextBox13.Text         'Telefono diretto
23.	Sheets("clienti").Cells(p, 14) = TextBox14.Text         'fax
24.	Sheets("clienti").Cells(p, 15) = TextBox15.Text         'responsabile
25.	Sheets("clienti").Cells(p, 16) = TextBox16.Text         'cellulare
26.	aggiorna
27.	cancella
End Sub
Alla riga 1 tramite un ciclo If verifichiamo se si tratta di un salvataggio normale o di un nuovo inserimento, infatti se il valore contenuto nella cella alla riga 3 colonna 2 del voglio setup contiene il valore di True (Vero) allora si tratta di un nuovo cliente e vengono eseguite tutte le istruzioni del ciclo fino alla riga 7. Alla riga 2 evitiamo il saltellio dello schermo e alla riga 3 selezioniamo il foglio clienti. Alla riga 4 assegniamo il valore numerico, tramite una funzione, dell’ultima riga scritta alla variabile ultima e alla riga 5 assegniamo alla variabile p il valore della variabile ultima incrementata di 1 unità, in questo modo il valore di p rappresenta il valore numerico della riga che andrà a ricevere i nuovi dati del cliente. Alla riga 6 il valore contenuto nel TextBox1 (che sarebbe il codice cliente) viene scritto nella riga 1 colonna 2 del foglio setup. Se ricordate al clic sul pulsante Nuovo inserimento abbiamo letto il valore dell’ultimo codice cliente inserito nel foglio setup e lo abbiamo incrementato di 1 unità. Alla riga 7 andiamo a scrivere nel foglio setup alla riga 3 colonna 2 il valore di False in modo che nelle normali operazione di modifica di un campo qualsiasi non vengano interpretate come nuovi inserimenti. Alla riga 8 poniamo una condizione in caso il valore letto nel foglio setup alla riga 3 colonna 2 sia Falso, ma in questo caso non viene eseguita nessuna operazione in quanto alla riga 9 termina il ciclo If.

Con il codice presente dalla riga 10 alla riga 25 vengono sostituiti i valori presenti nel foglio clienti alle coordinate di riga p e colonna fissa con il valore contenuto nei controlli TextBox. Alla riga 26 viene richiamata la routine aggiorna, che ripopola il controllo ListBox, se questo non avvenisse, e andiamo a modificare solo il nome del cliente, tale modifica non comparirebbe nel ListBox, mentre invece ricaricando i dati avremo istantaneamente la modifica fatta anche nel ListBox. Alla riga 27 viene richiamata la solita routine cancella, che svuota tutti i controlli TextBox
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato   Rispondi citando
Vecchio 05-03-2012, 15.48.07   #14
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
#14

Gestione Preventivi - Parte 3

In questa lezione vedremo la memorizzazione dei documenti e la loro consultazione, a completamento del file “Preventivi” usato finora per approfondire gli argomenti trattati nelle lezioni precedenti. L’area di lavoro principale è il foglio “Preventivi” che abbiamo strutturato come da figura

Fig. 1

Abbiamo visto che per emettere il documento si deve agire nel seguente modo:

1) Cliccare sul pulsante “Nuovo documento” per inserire data e numero del documento
2) Cliccare sul pulsante “Cliente” per selezionare il destinatario del documento
3) Compilare manualmente i campi “Agente” e “Trasporto” agendo sulle frecce di selezione del campo
4) Inserire gli articoli cliccando sul pulsante “Inserisci Articoli

Una volta eseguite queste fasi il documento è compilato in tutte le sue parti e possiamo eseguire la stampa e la memorizzazione in archivio premendo il pulsante “Memorizza” che ci mostrerà una finestra di scelta come questa

Fig. 2

Come si intuisce dall’immagine prima dell’archiviazione viene richiesto se vogliamo stampare il documento, se clicchiamo su Si il Preventivo viene inviato alla stampante di sistema e poi archiviato, scegliendo No si archivia direttamente svuotando il foglio. Vediamo il codice associato al pulsante Memorizza:

Codice:
Sub Memorizza()
m = Sheets("Setup").[B3]       'riga dove scrivere
posiz = Sheets("Setup").[B4]   'colonna dove scrivere
Dim Mt As String
If Sheets("Setup").[B2] = True Then    'controllo il flag
  Mt = Mt & "Attenzione Il Preventivo era già in memoria ??" & Chr(13) & Chr(13)
  Mt = Mt & "Vuoi Sovrascriverlo??" & Chr(13) & Chr(13)
 rs = MsgBox(prompt:=Mt, Title:="Gestione Preventivi", Buttons:=vbYesNo + vbQuestion)
 If rs = vbNo Then Exit Sub
salva
svuota_prev
ElseIf Sheets("Setup").[B2] = False Then
Sheets("Setup").[B1] = [P14]
salva
svuota_prev
End If
End Sub
In sintesi abbiamo raccolto in precedenza i dati necessari per eseguire la memorizzazione del documento nel foglio “Archivio” e salvati anche nel foglio di appoggio “Setup” come si può vedere dalla figura sotto riportata

Fig. 3

Tornando al codice della routine “Memorizza”, commentiamo ora le prime due righe di codice

m = Sheets("Setup").[B3]
posiz = Sheets("Setup").[B4]


Con l’enunciato sopra esposto assegniamo alle variabili m e posiz il valore presente nelle celle B3 e B4 del foglio “Setup” che rappresentano rispettivamente il numero di riga e colonna del foglio “Archivio” dove andremo a salvare i dati. Queste due variabili nel modulo VBA in cui sono alloggiate, sono utilizzate da varie Routine (Sub) per cui devono essere accessibili a tutte le procedure o Sub presenti nel modulo stesso. Per renderle disponibili alle varie Routine si devono dichiarare con l’enunciato Dim all’inizio del modulo e prima di qualsiasi altra dichiarazione, come si può vedere dalla figura sottostante

Fig. 4

E’ risaputo che il salvataggio dei dati è una fase molto importante, pertanto dobbiamo verificare prima di eseguirla se il documento presente nel foglio “Preventivi” è un Nuovo Documento o se è un documento esistente caricato dall’archivio, in quanto i valori delle variabili m e posiz variano per i due casi. Per identificare la “provenienza” del documento usiamo dei “Segnalatori” o Flag, in questo modo:

If Sheets("Setup").[B2] = True

In pratica abbiamo precedentemente salvato in una cella del foglio “Setup” la dicitura FALSE o TRUE in base all’operazione che stiamo facendo. Se iniziamo un nuovo documento al momento del click sul pulsante “Nuovo Documento” andremo a scrivere nella cella B2 il valore FALSE, mentre invece se clicchiamo sul pulsante “Richiama” per editare un documento presente in archivio, andremo a scrivere TRUE. E’ come “Segnare il percorso” e in questo modo sappiamo se stiamo facendo un nuovo documento oppure se stiamo editandone uno dall’archivio. Per decidere quale operazione eseguire in base al Flag impostato inseriamo le varie operazioni da eseguire in un ciclo IF come il seguente

Codice:
 If Sheets("Setup").[B2] = True Then    'controllo il flag
  Mt = Mt & "Attenzione Il Preventivo era già in memoria ??" & Chr(13) & Chr(13)
  Mt = Mt & "Vuoi Sovrascriverlo??" & Chr(13) & Chr(13)
 rs = MsgBox(prompt:=Mt, Title:="Gestione Preventivi", Buttons:=vbYesNo + vbQuestion)
 If rs = vbNo Then Exit Sub
salva
svuota_prev
ElseIf Sheets("Setup").[B2] = False Then
Sheets("Setup").[B1] = [P14]
salva
svuota_prev
End If
Come si vede dal codice sopra esposto abbiamo posto 2 condizioni nel ciclo IF

If Sheets("Setup").[B2] = True Then
…………………. Istruzioni ……….
ElseIf Sheets("Setup").[B2] = False Then
………… altre istruzioni ………..
End If


Possiamo interpretare il codice in maniera molto semplicistica affermando:

Se il documento corrente è un Nuovo documento allora esegui queste istruzioni, Altrimenti Se il documento corrente è già presente in archivio e lo stai modificando esegui queste istruzioni. Pertanto in base al valore presente nella cella B2 abbiamo già impartito le istruzioni che devono essere svolte. Vediamo ora la 1° condizione del ciclo

If Sheets("Setup").[B2] = True Then

Con questa istruzione verifichiamo se il valore della cella B2 del foglio Setup è uguale a TRUE (cioè stiamo editando un documento già archiviato) allora si avvisa l’utilizzatore che il documento era già in memoria e si chiede se vuole sovrascriverlo. L’avviso riportato è come il seguente

Fig. 5

Il codice che si occupa di mostrare questo avviso è:

Codice:
 Mt = Mt & "Attenzione Il Preventivo era già in memoria " & Chr(13) & Chr(13)
Mt = Mt & "Vuoi Sovrascriverlo??" & Chr(13) & Chr(13)
rs = MsgBox(prompt:=Mt, Title:="Gestione Preventivi", Buttons:=vbYesNo + vbQuestion)
A questo punto l’utilizzatore deve fare una scelta, se sceglie NO allora tramite

IF rs = vbNo Then Exit Sub

Usciamo dalla Routine senza eseguire nessuna azione, scegliendo invece SI vengono eseguite le Routine salva e svuota_prev e poi usciamo dalla Sub. Mentre invece la 2° condizione del ciclo, espressa con:

Codice:
 ElseIf Sheets("Setup").[B2] = False Then
Sheets("Setup").[B1] = [P14]
salva
svuota_prev
Viene eseguita se il valore nella cella B2 del foglio “Setup” è uguale a FALSE (per cui stiamo facendo un nuovo preventivo), non riporta nessun avviso, aggiorna il valore della cella B1 del foglio “Setup” ed esegue la Routine “controllo”. Bisogna prestare particolare attenzione all’enunciato

Sheets("Setup").[B1] = [P14]

Bisogna ricordare che per una corretta stesura del Preventivo è fondamentale emettere documenti con una numerazione univoca, eseguire il processo di numerazione è abbastanza semplice. Quando si “stacca” il preventivo n° 1, nella cella B1 del foglio di appoggio “Setup” sarà presente il valore 0 [zero]
Nota: ricordo che in quella cella viene memorizzato il numero dell’ultimo preventivo memorizzato

Per cui quando clicchiamo sul pulsante “Nuovo Documento” andremo a leggere il valore presente nella cella B1 del foglio Setup incrementandolo di 1 unità e inseriamo tale valore nella cella P14 del foglio Preventivi. In seguito, quando memorizzeremo il preventivo nel foglio “Archivio” andremo a sovrascrivere il valore della cella B1 del foglio “Setup” col valore della cella P14 del foglio “Preventivi”. Il processo si ripete poi per ogni documento che salveremo, per cui diventa importante il salvataggio del documento. Vediamo ora la routine salva

Codice:
Private Sub salva()
j = 17
With Sheets("Archivio")
 .Cells(m, posiz) = [M6]                       'Cliente
 .Cells(m, posiz + 1) = [M7]                  'Indirizzo
 .Cells(m, posiz + 2) = [M8]                  'Città
 .Cells(m, posiz + 3) = [B11]                 'pagamento
 .Cells(m, posiz + 4) = [G11]                 'banca
 .Cells(m, posiz + 5) = [M14].Value     'data preventivo
 .Cells(m, posiz + 6) = [P14]                  'n° preventivo
 .Cells(m + 1, posiz) = [D14]                 'email
 .Cells(m + 1, posiz + 1) = [H14]            'Agente
 .Cells(m + 1, posiz + 2) = [J14]             'trasporto
 .Cells(m + 1, posiz + 3) = [P50]             'tot. imponibile
 .Cells(m + 1, posiz + 4) = [P52]             'importo iva
 .Cells(m + 1, posiz + 5) = [P54]             'totale
 .Cells(m + 1, posiz + 6) = [B56]             'note
 
 End With
  m = m + 2
Do Until Sheets("Preventivi").Cells(j, 2) = Empty
 With Sheets("Archivio")
 .Cells(m, posiz) = Sheets("Preventivi").Cells(j, 2).Value            'codice
 .Cells(m, posiz + 1) = Sheets("Preventivi").Cells(j, 3).Value        'descrizione
 .Cells(m, posiz + 2) = Sheets("Preventivi").Cells(j, 14).Value       'quantità
 .Cells(m, posiz + 3) = Sheets("Preventivi").Cells(j, 15).Value       'prezzo
 .Cells(m, posiz + 4) = Sheets("Preventivi").Cells(j, 17).Value       'importo
 End With
    j = j + 1: m = m + 1
Loop
  Mt = Mt & "Stampo il Preventivo?" & Chr(13) & Chr(13)
  rs = MsgBox(prompt:=Mt, Title:="Gestione Preventivi", Buttons:=vbYesNo + vbQuestion)
If rs = vbNo Then
 Exit Sub
Else
 ActiveSheet.PrintOut copies:=1
stampa
End If
End Sub
Commentiamo il codice iniziando da:

j = 17

Con la variabile j indichiamo il numero di riga del foglio Preventivi dove iniziamo a inserire gli articoli del preventivo, lo possiamo vedere in Figura 1 che la prima riga che riceve gli articoli del Preventivo è la 17, inoltre abbiamo precedentemente citato che le variabili m e posiz identificano rispettivamente riga e colonna del foglio Archivio” dove memorizzare i dati, che eseguiamo col ciclo With

Codice:
With Sheets("Archivio")
.Cells(m, posiz) = [M6]                       'Cliente
 .Cells(m, posiz + 1) = [M7]                  'Indirizzo
 .Cells(m, posiz + 2) = [M8]                  'Città
 .Cells(m, posiz + 3) = [B11]                 'pagamento
 .Cells(m, posiz + 4) = [G11]                 'banca
 .Cells(m, posiz + 5) = [M14].Value     'data preventivo
 .Cells(m, posiz + 6) = [P14]                  'n° preventivo
 .Cells(m + 1, posiz) = [D14]                 'email
 .Cells(m + 1, posiz + 1) = [H14]            'Agente
 .Cells(m + 1, posiz + 2) = [J14]             'trasporto
 .Cells(m + 1, posiz + 3) = [P50]             'tot. imponibile
 .Cells(m + 1, posiz + 4) = [P52]             'importo iva
 .Cells(m + 1, posiz + 5) = [P54]             'totale
 .Cells(m + 1, posiz + 6) = [B56]             'note
End With
Per comprendere meglio il codice aiutiamoci con l’immagine del foglio Archivio

Fig. 6

Come vedete nella prima riga del foglio abbiamo i mesi (riga di colore verde) e i dati principali del preventivo andiamo a salvarli nelle righe gialle (2° e 3° riga), per cui con m identifichiamo la 1° riga gialla e con posiz la 1° colonna del mese, per cui con:

.Cells(m, posiz) = [M6]

Nella cella alle coordinate m,posiz (1° riga e 1° colonna) del foglio “Archivio” andiamo a scrivere il valore della cella N6 del foglio “Preventivi”. Successivamente dobbiamo scrivere nelle colonne adiacenti, ma senza incrementare e/o modificare il valore delle variabili m e posiz, per cui usiamo l'enunciato

.Cells(m, posiz + 1) = [M7]

In pratica sommiamo al valore di posiz 1 unità per scrivere nella 2° colonna, 2 unità per scrivere nella 3° colonna e via di seguito fino alla 7° colonna, ultima colonna del mese. Usiamo lo stesso procedimento per scrivere nella 2° riga, incrementando il valore di m (la riga) di 1 unità e il valore di posiz come abbiamo fatto per la riga precedente, pertanto l'enunciato diventa

.Cells(m + 1, posiz) = [D14]

Ora dobbiamo scrivere il corpo del Preventivo, tramite il seguente codice:

Codice:
 m = m + 2
Do Until Sheets("Preventivi").Cells(j, 2) = Empty
 With Sheets("Archivio")
 .Cells(m, posiz) = Sheets("Preventivi").Cells(j, 2).Value            'codice
 .Cells(m, posiz + 1) = Sheets("Preventivi").Cells(j, 3).Value        'descrizione
 .Cells(m, posiz + 2) = Sheets("Preventivi").Cells(j, 14).Value       'quantità
 .Cells(m, posiz + 3) = Sheets("Preventivi").Cells(j, 15).Value       'prezzo
 .Cells(m, posiz + 4) = Sheets("Preventivi").Cells(j, 17).Value       'importo
 End With
    j = j + 1: m = m + 1
Loop
In pratica aumentiamo il valore della variabile m di 2 unità, per cui passiamo alla 1° riga verde-chiaro sotto alle righe gialle in cui abbiamo salvato i dati principali del preventivo, e poi usiamo un ciclo Do Loop per scorrere le righe del preventivo e copiarle nel foglio “Archivio”. Interpretiamo il codice:

Do Until Sheets("Preventivi").Cells(j, 2) = Empty

Ripeti (il ciclo) finchè nel foglio Preventivi non ci sono celle vuote alle coordinate j, 2. Se le celle non sono vuote, tramite il ciclo with si copiano i dati dal foglio “Preventivi” nel foglio Archivio alle coordinate di riga e colonna pari ai valori di m,posiz, mentre invece per scorrere le righe di dati presenti nel foglio “Preventivi” si cicla alle coordinate di riga e colonna pari ai valori di j per la riga e ai valori fissi di colonna impostati nel ciclo. Si termina il ciclo incrementando il valore di m e di j finchè non si soddisfa la condizione iniziale e si esce dal ciclo. A questo punto i dati sono stati trascritti nel foglio “Archivio” e si manda in stampa il documento tramite il codice:

Codice:
 Mt = Mt & "Stampo il Preventivo?" & Chr(13) & Chr(13)
  rs = MsgBox(prompt:=Mt, Title:="Gestione Preventivi", Buttons:=vbYesNo + vbQuestion)
If rs = vbNo Then
 Exit Sub
Else
ActiveSheet.PrintOut copies:=1
stampa
End If
End Sub
Che ci riporta un avviso a video come il seguente

Fig. 7

Cliccando su “No” si esce dalla Routine tramite l’enunciato

If rs = vbNo Then Exit Sub

Altrimenti cliccando su “Si” si invia il documento alla stampante di sistema e si termina la procedura.
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
Alexsandra non è collegato   Rispondi citando
Vecchio 15-05-2014, 17.59.55   #15
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
Editor di Visual Basic for Applications



Abbiamo visto nella lezione precedente come registrare ed eseguire una macro, ora vediamo l’Editor di Visual Basic che offre numerosi strumenti avanzati di sviluppo e programmazione per modificare o scrivere delle macro, creare finestre di dialogo personalizzate e tanto altro, consentendo di far interagire le applicazioni di Microsoft Office con moduli programmati. Faremo una panoramica generale dell’editor di VBA e approfondiremo i comandi dei suoi menù, dei pulsanti delle barre strumenti e di come essi si ambientano in Excel. Le macro in Visual Basic for Applications sono memorizzate in una speciale parte della cartella di lavoro di Excel detta Modulo. Un modulo VBA contiene il codice sorgente della macro, ossia l’insieme delle istruzioni della macro stessa. Quando si registra una macro di Excel si può specificare la cartella di lavoro in cui verrà salvata, che può essere:
  • La cartella corrente
  • Una nuova cartella di lavoro
  • La cartella macro personale (File Personal.xls)

Fig. 1

Excel sceglie, o crea, se necessario, il modulo in cui memorizza la macro registrata e gli assegna il nome di default Modulo1, dove 1 è un numero progressivo che indica i moduli che sono stati creati in una cartella di lavoro. Per esempio, la prima volta che si salva una macro registrata nella cartella macro personale (Personal.xls per Excel 2003 e Personal.xlsb per Excel superiore alla 2003) Excel crea un modulo di nome Modulo1, se si continua a registrare macro e si salvano sempre nella cartella macro personale, Excel continua a memorizzare le macro nel medesimo Modulo1.
Se in seguito si sceglie di memorizzare una macro in una cartella di lavoro diversa, (questa cartella di lavoro) Excel aggiungerà un nuovo modulo denominato sempre Modulo1 in cui memorizzare la macro. Successivamente se si ritorna a memorizzare una macro nella cartella macro personale Excel aggiungerà un nuovo modulo denominato Modulo2 nella cartella di lavoro Personal.xls

Teniamo presente che la cartella macro personale viene caricata all’apertura di Excel pertanto se memorizziamo delle macro in questa cartella esse saranno disponibili per tutte le cartelle di Excel che andremo ad aprire o creare. In pratica se memorizziamo una macro in un foglio di calcolo normale una volta che questo file viene chiuso la macro non sarà più disponibile, mentre se scriviamo una macro che rappresenta una interessante funzione che potrebbe esserci utile in altri file la memorizziamo nel file Personal.xls rendendola così disponibile anche per altri file Excel. Il file Personal.xls non è altro che un normale file di Excel con estensione xls, o xlsb per versioni di Excel superiori alla 2003, che ha solo la particolarità di essere caricato all’avvio di Excel e di essere un file nascosto, cioè non verrà visualizzato, inoltre quando inseriamo una macro al suo interno, alla chiusura del file di Excel ci viene richiesto il salvataggio del file personale in questo modo

Fig. 2

Se per qualche motivo viene memorizzata una macro nella cartella macro personale e dovesse sorgere qualche problema o interferire con le normali cartelle di lavoro di Excel si deve editare il file Personal.xls e cancellare o modificare la macro che presenta le anomalie. Se per qualche motivo non si riesce a modificare la macro e si vuole risolvere rapidamente il problema è possibile ricorrere a maniere drastiche, come la cancellazione del file, senza che la rimozione del file Personal.xls pregiudichi la normale esecuzione di Excel, in quanto se il file Personal.xls è assente nel sistema Excel lo ricrea con le impostazioni di default. A solo scopo informativo il percorso dove viene localizzato il file Personal.xlsb (per Excel 2007 o superiori) è il seguente:

C: \Utenti\NOME UTENTE\AppData\Roaming\Microsoft\Excel\XLStart

Ovviamente dovete prima attivare la visualizzazione dei file nascosti, ma per il momento tralasciamo questo argomento che esula dal contesto della lezione. Per poter vedere i moduli contenuti in un file con estensione xls bisogna ricorrere all'Editor di Visual Basic, che è uno strumento che consente di creare moduli, esaminare i contenuti, creare o modificare il codice sorgente delle macro, creare finestre di dialogo e fare tante altre cose relative alla creazione e alla manutenzione di programmi in Visual Basic For Applications. Per vedere i moduli o il codice sorgente VBA in esso contenuto bisogna avviare l’editor VB e per farlo si può scegliere una di queste opzioni: Selezionare dal menu Strumenti - Macro - Editor Visual Basic oppure premere semplicemente i tasti ALT+F11, Excel avvierà l’editor VB che viene visualizzato come in figura sotto riportata

Fig. 3

L’Editor di VB visualizza tre finestre contenute in una finestra principale e ciascuna delle tre finestre visualizza importanti informazioni sul progetto VBA (un progetto è l’insieme di moduli e oggetti memorizzati in una cartella di lavoro). Ognuna delle tre finestre dell’Editor VB viene visualizzata di default nella posizione ancorata come mostrato in figura 3. Le tre finestre dell’Editor VB e le relative funzioni sono:

Gestione Progetti: Questa sotto finestra (Posiz. A Fig. 3) contiene un diagramma ad albero delle cartelle di lavoro aperte e degli oggetti Excel in esse contenute (oggetti, moduli, riferimenti, Form e così via). Si userà questa finestra per navigare fra i vari moduli e altri oggetti di un progetto VBA

Finestra delle Proprietà: In questa finestra (Posiz. B Fig. 3) compare un elenco di tutte le proprietà dell’oggetto attualmente selezionato. La scheda “Alfabetico”, della finestra proprietà presenta un elenco ordinato alfabeticamente delle proprietà dell’oggetto selezionato. La scheda per “Categoria" sempre nella stessa finestra le elenca invece ordinate per categoria

Finestra del Codice: La finestra del codice (Posiz. C Fig. 3) è quella in cui si può esaminare, modificare o creare ex-novo il codice sorgente VBA. Questa finestra viene usata per scrivere nuove macro o editare macro esistenti


Finestra Gestione Progetti
La finestra “Gestione progetti” consente di visualizzare un elenco gerarchico di tutti gli elementi del progetto che sono contenuti nella cartella di lavoro, che includono fogli di lavoro, Forms e moduli. Per default questa finestra utilizza un sistema di visualizzazione definito “diagramma a albero”. Basta fare clic su uno dei segni + che si trovano alla sinistra di una voce del progetto per espandere l’elenco mostrandone la ramificazione. Una volta espanso il diagramma il segno + si trasforma in segno e basta cliccare su quest’ultimo per far collassare la ramificazione e chiuderla. La finestra della Gestione progetti contiene altri due pulsanti: Visualizza codice e Visualizza oggetto evidenziati nella figura 4 dal rettangolo rosso

Fig 4

Il pulsante Visualizza codice mostra i contenuti o listato del codice del modulo nella finestra del Codice (Posiz. C Fig. 3) mentre il pulsante Visualizza oggetto mostra l’oggetto che corrisponde alla voce selezionata, può essere un foglio di calcolo o una Form. Quando si lavora col codice sorgente di una macro nella sotto finestra Codice, si possono anche chiudere le finestre Gestione progetti e Proprietà, per dare più spazio al codice in modo da vederne una parte maggiore. Si può chiudere quando si vuole una qualsiasi sotto finestra dell’Editor VB (Gestione progetti, Proprietà e Codice) con un clic sul pulsante di chiusura posto nel vertice superiore destro (la classica X) e per visualizzare una delle finestre si può fare clic sul relativo pulsante nella barra strumenti dell’Editor VB evidenziati dal rettangolo rosso in Figura 4

Fig. 5

Oppure tramite il percorso dal menù: Visualizza - Gestione progetti


La Finestra delle Proprietà
Tutti gli oggetti di Excel hanno delle proprietà che ne controllano l’aspetto e il comportamento, un foglio di lavoro ha la proprietà di essere visibile oppure no, un pulsante ha una proprietà per altezza e larghezza e così via. Per modificare l’aspetto e il comportamento di un oggetto dobbiamo cambiarne le proprietà, e lo possiamo fare selezionando un foglio di lavoro, un modulo o una Form nella finestra Gestione progetti e controllare le sue proprietà nella finestra delle proprietà. La finestra Proprietà contiene due schede: Alfabetico e Categoria. Nella scheda Alfabetico, le proprietà sono visualizzate in ordine alfabetico senza alcun riferimento alla categoria di appartenenza, mentre nella scheda per Categoria, le proprietà sono disposte in ordine alfabetico all'interno di varie categorie.

Fig. 6

Le proprietà riportano i valori assegnati agli oggetti che definiscono l'aspetto e le funzionalità degli stessi, solitamente questi valori possono essere letti oppure assegnati, in questo caso si dice che la proprietà è di lettura e scrittura, esistono anche proprietà di sola lettura, alle quali è possibile accedervi in sola lettura. Se la finestra non fosse visibile è possibile accedervi attraverso il percorso dal menu Visualizza - Finestra proprietà


La Finestra del Codice
La modalità di visualizzazione di default del codice sorgente VBA è visualizza modulo intero, in cui tutto il codice sorgente di un modulo è visualizzato in una finestra di testo che permette lo scorrimento ed ogni macro in questa finestra è separata da una linea continua grigia. L’Editor di VB permette anche di vedere i contenuti di un modulo in modalità Visualizza routine attivabile dalle due icone presenti nel vertice inferiore sinistro della finestra del codice evidenziate dalla freccia rossa in Figura 7

Fig. 7

Quando la finestra Codice è in modalità Routine, come si nota nella figura 8 si può vedere soltanto il codice sorgente di una macro alla volta

Fig. 8

Per visualizzare una determinata routine nella finestra del codice in modalità Routine basta solo posizionare il cursore col mouse sulla routine e cliccare sull'icona relativa nella figura 7, per tornare poi alla visualizzazione a modulo intero si deve cliccare sull'icona a fianco. Nella modalità a Modulo intero si può usare l’elenco a discesa delle procedure per passare rapidamente da una macro all'altra.
___________________________________

- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale -
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: 02.51.58.


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.