Accedi per seguire   
Seguaci 0
Alexsandra

Vba : Prendere Decisioni - Input - If - Select Case

1 messaggio in questa discussione

VBA : Prendere decisioni - Input - If - 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.

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

Sub funzione_input()
Prova_input = InputBox(prompt:="Inserisci il nome di un file: ", Title:="Crea un nuovo file", Default:="Newfile")
End Sub

E otteniamo un finestra dei questo tipo

%25234old_01.png Fig. 1

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.

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

Sub prova()
Dim Alex As Integer
Alex = "1"
If Alex = "1" Then MsgBox ("Bravi")
End Sub

In pratica la funzione fa questa valutazione: se la variabile Alex è 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

Sub prova1()
Dim Alex As Integer
Alex = "2"
If Alex = "1" Then 
MsgBox ("Bravi")
Else
MsgBox ("Condizione non soddisfatta")
End If
End Sub

Oppure usando l'enunciato a riga singola

Sub prova()
Dim Alex As Integer
Alex = "2"
If Alex = "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

Sub nidifica()
Dim Alex
Alex = InputBox(prompt:="Inserisci a quanti gradi metti il termostato del riscaldamento: ", Title:="Misura la temperatura di casa")
[color=darkred]If Pianeta > 20 Then
MsgBox "Troppo caldo, vedrai che bolletta"[/color]
Else
 If Alex > 18 Then
 MsgBox "Temperatura giusta"
 Else
 MsgBox "Temperatura troppo bassa, ti prendi un raffreddore"
 End If
[color=darkred]End If[/color]
End Sub

Eseguendo questa macro otteniamo questo:

%25234old_02.png Fig. 2 %25234old_03.png Fig. 3

%25234old_04.png Fig. 4 %25234old_05.png Fig. 5

%25234old_06.png Fig. 6 %25234old_07.png Fig. 7

Vediamo nel dettaglio casa abbiamo fatto, per comprendere meglio la nidificazione usiamo anche i colori, all'inizio abbiamo dichiarato la variabile alex 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 Alex > 20 Then confronta il valore della variabile alex e avendole assegnato il valore 30 tramite InputBox viene soddisfatta la prima condizione che abbiamo post, cioè [se alex è 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 rosso e ci riporta a fine codice.

Se nell'InputBox inseriamo un valore diverso (ad esempio 20) la prima condizione If Alex > 20 Then non viene soddisfatta ed allora passiamo alle istruzioni Else in questo blocco di istruzioni abbiamo posto 2 condizioni, la prima che viene verificata è If Alex > 18 Then [se Alex è 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 Alex > 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 Alex viene mandato in esecuzione il blocco di codice quando il valore della variabile è True ne consegue che inserendo il valore 30 Alex diventa True alla prima condizione ed esegue il flusso di codice di colore rosso, invece se assegniamo a Alex il valore 20 diventa True alla prima istruzione delle condizioni nidificate nel blocco Else, ogni altro valore assegnato [da 1 a 18] alla variabile Alex 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ì

Sub nidifica_abbreviato()
Dim Alex
Alex = InputBox(prompt:="Inserisci a quanti gradi metti il termostato del riscaldamento: ", Title:="Misura la temperatura di casa")
If Alex > 20 Then
MsgBox "Troppo caldo, vedrai che bolletta"
ElseIf Alex > 18 Then
MsgBox "Temperatura giusta"
Else
MsgBox "Temperatura troppo bassa, ti prendi un raffreddore"
End If
End Sub

Abbiamo detto all'inizio che ci sono delle istruzioni condizionali e incondizionali, quelle che abbiamo visto finora sono istruzioni condizionali, mentre quelle incondizionali sono rappresentate dalla parola chiave Goto, quando VBA incontra l'istruzione Goto inizia immediatamente l'esecuzione delle istruzioni indicate da questo comando. Su questo comando non c'è molto da spiegare, praticamente permette di effettuare un "salto" da un punto all'altro del codice, generalmente viene usato per richiamare un funzione ripetitiva nel programma oppure per terminare la procedure stessa, la sintassi è: Goto nome_etichetta

Per il momento non approfondiamo l'argomento, essendo un comando anche poco usato, ma lo tratteremo nella prossima lezione abbinandolo all'uscita forzata dai cicli al verificarsi di determinate condizioni, ora per completare il ciclo decisionale è opportuno parlare di un altro comando per compiere questa funzione : Select Case

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

Sub Selec_cast()
Dim Alex
Alex = InputBox(prompt:="Inserisci a quanti gradi metti il termostato del riscaldamento: ", Title:="Misura la temperatura di casa")
Select Case Alex
 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 [Alex] 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 [Alex], 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 Alex con le condizioni specificate in ogni blocco Case dell'istruzione Select Case.

Innanzi tutto VBA controlla il valore della variabile Alex 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

Modificato da Alexsandra

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti
Accedi per seguire   
Seguaci 0