Usare il Select Case. - dal 04/09/04 pagina vista: volte

Quando in procedure vba usiamo valutare condizioni da verificare, spesso ricorriamo alle istruzioni If...Then...End If che forse ci sono più congeniali visto che si basano su un nostro modo di ragionare abituale : SE si verifica questa condizione, ALLORA mi fai questo, ALTRIMENTI mi fai quest'altro (oppure non mi fai niente), ecc. ecc.

Se le condizioni da verificare sono molte, si ricorre a tante istruzioni If ...Then...End If chiuse, oppure a tanti ElseIf quante sono le condizioni oltre la prima, o ancora agli operatori Or e And per concatenare condizioni da verificare.

La compilazione di codice con molti If non è strutturalmente sbagliata, ma costringe rallentamenti nell'esecuzione del codice quando le condizioni sono molte e quelle previste si trovano più avanti rispetto alla prima condizione If : infatti vengono lette tutte le condizioni fino a che non viene trovata la condizione prevista.

Esiste un'altro modo per gestire la verifica di condizioni, ed è il Select Case .

La struttura Case risulta infatti più flessibile e completa rispetto ad istruzioni If nidificate, offrendo una maggiore semplicità di codice, oltre ad una più rapida esecuzione. Vediamo intanto la sintassi di un'istruzione Select Case : (con espressione si intende il soggetto da valutare, con elenco costanti si intende la possibile condizione da verificare del soggetto)

  • Select Case espressione       'inizio istruzione Select Case

  • Case elenco costanti            'Caso da verificare

  • ...istruzioni da eseguire

  • Case elenco costanti            'Caso da verificare

  • ...istruzioni da eseguire

  • Case Else                             'Caso altrimenti...(se non si verificano i Case previsti)

  • ...istruzioni da eseguire

  • End Select                            'fine istruzione Select Case (sempre necessaria per chiudere la struttura Case)

L'espressione in una struttura Case è di solito una variabile o una proprietà (per esempio di un controllo ActiveX). L'elenco delle costanti è il valore da verificare; può essere un valore numerico, una costante od una variabile stringa, un intervallo di valori, una condizione relazionale o una combinazione di questi elementi. Non vi sono limitazioni al numero di istruzioni che possono seguire un'istruzione Case. Facciamo subito qualche esempio:

  • Supponiamo di stare utilizzando delle OptionButton poste su una UserForm, e di voler attivare istruzioni diverse in funzione della OptionButton che verrà selezionata. In questo caso per intercettare quale Opzione viene scelta, sfrutteremo una proprietà delle OptionButton, la proprietà Value, che corrisponde a True quando una OptionButton è selezionata; useremo quindi True come condizione da verificare (espressione del Select Case), mentre useremo il nome delle OptionButton come costante da verificare ad ogni Case. In questo esempio faccio restituire un messaggio, ma potremo ovviamente istruire le istruzioni che vorremo:

  • Select Case True
    Case OptionButton1
    MsgBox "pippo uno"
    Case OptionButton2
    MsgBox "pippo due"
    Case OptionButton3
    MsgBox "pippo tre"
    '...altri Case se necessari
    End Select

In pratica questa struttura verifica quale (Value) delle OptionButton corrisponderà a True, ed esegue l'istruzione prevista dall'opzione selezionata. Se avessimo usato l'istruzione If, avremmo dovuto scrivere:

 Istruzione a più If chiuse :

 Istruzione con ElseIf


If OptionButton1.Value = True Then
MsgBox "pippo uno"
End If
If OptionButton2.Value = True Then
MsgBox "pippo due"
End If
If OptionButton3.Value = True Then
MsgBox "pippo tre"
End If

If OptionButton1.Value = True Then
MsgBox "pippo uno"
ElseIf OptionButton2.Value = True Then
MsgBox "pippo due"
ElseIf OptionButton3.Value = True Then
MsgBox "pippo tre"
End If

Per capire la differenza nella velocità dell'esecuzione, supponiamo che sia selezionata la OptionButton3 : con la struttura If il codice non sa quale sarà la condizione da eseguire, e quindi viene letta la prima condizione, poi la seconda infine la terza, che corrisponde alla situazione esistente, e solo a questo punto eseguite le istruzioni ; con la struttura Case già ad inizio istruzioni il codice sa che è l'OptionButton3 ad essere selezionata, e cerca quindi subito il Case che interessa eseguendo l'istruzione corrispondente.

La proposizione Case può essere seguita anche da una qualsiasi delle seguenti forme di elenco costanti :

  • costante X To costante Y - cioè un intervallo di valori formato da un valore seguito dalla parola chiave To, e quindi da un altro valore, es:  Case 5 To 10 , oppure da un insieme di intervalli, es: Case 5 To 10, 20 To 30, 40 To 60  in questo caso si deve inserire una virgola tra gli intervalli.

  • Utilizzare la parola chiave Is con gli operatori di confronto (a esclusione di Is e Like) per specificare un intervallo di valori. Se non viene indicata, la parola chiave Is verrà inserita automaticamente in presenza di operatori di confronto. es: per valutare il caso che un numero sia negativo, scriveremo Case Is < 0 (caso che un numero sia (Is)  inferiore a zero), oppure Case Is > MaxNumber (caso che un numero sia superiore ad un valore maggiore X).

  • Inoltre è possibile specificare intervalli e/o più di un'espressione per le stringhe di caratteri (testo). Il testo dovrà essere racchiuso tra doppi apici e corrispondere esattamente (Maiuscole/minuscole) ad espressione. Es: Case "Pippo" . Interessante è la possibilità di definire intervalli di stringhe con la parola chiave To. Es: Case "ab" To "fe" - verranno riconosciute come stringhe valide tutti i valori (le parole) compresi (come "abbaino", "cane", "doccia" "faccia") tra le due lettere che formano i due limiti dell'intervallo ("ab" e "fe").

  • Consiglio poi di includere un'istruzione Case Else, sebbene non sia obbligatorio, in un blocco Select Case per gestire valori di espressione non previsti

In tutti questi casi sarà necessario reperire l'"espressione" oggetto della/delle verifiche (quella espressione assegnata al Select Case). Possiamo utilizzare una variabile reperita sia attraverso una TextBox, una InputBox, una cella, o variabili restituite da un'altra procedura o istruzione, anche posta a monte del Select Case.

Vediamo alcuni esempi dove una variabile (che chiameremo Valore) la reperiamo tramite la TextBox1; anche in questo esempio faccio restituire un semplice messaggio, ma ognuno sfrutterà le istruzioni a lui necessarie:

  • Valore = TextBox1.Value     'prendiamo con "Valore" il contenuto che avremo nella TextBox1
    Select Case Valore     
      'impostiamo le condizioni da verificare sull'espressione "Valore"
    Case 1 To 5                  
     'se Valore è compreso tra 1 e 5
    MsgBox "primo caso" 
    'si restituisce questa istruzione
    Case 6 To 10, 16 To 25 
    'se Valore è compreso tra 6 e 10, oppure è compreso tra 16 e 25
    MsgBox "secondo caso" 
    'si restituisce questa istruzione
    Case Is < 0                    
    'se Valore è un numero negativo
    MsgBox "sei in negativo" 
    'si restituisce questa istruzione
    Case "Pippo", "bac" To "let" 
     'se Valore è uguale a Pippo, oppure una parola compresa tra bac e let
    MsgBox TextBox1.Text  
    'si restituisce questa istruzione
    Case Else                        
    'se non si verifica nessuno dei Case previsti, allora(Else)
    MsgBox "fuori caso"    
    'si restituisce questa istruzione
    End Select

Le istruzioni Select Case possono essere nidificate. A ciascuna istruzione Select Case nidificata deve corrispondere un'istruzione End Select. In questo altro esempio nidifichiamo un'altra istruzione Select Case all'interno del secondo caso:

  • numero = Cells(1, 1).Value  '"numero"è la variabile che usiamo ora, presa dalla cella A1
    Select Case numero
    Case 1 To 5
    MsgBox "primo caso"     
    'si restituisce questa istruzione
    Case 6 To 11, 15 To 25
     
    MsgBox "secondo caso" 
    'si restituisce questa istruzione, inoltre si esegue un ulteriore Select Case  (in rosso): Caso
         
    Select Case numero   '"numero" compreso tra 6 e 11: si verifica se "numero" e compreso tra 6 e 8 oppure
         Case 6 To 8              
    ' è compreso tra 9 e 11, e si eseguono le istruzioni corrispondenti
         MsgBox "prima terzina"
         Case 9 To 11
         MsgBox "seconda terzina"
         End Select

    Case Is < 0
    MsgBox "sei negativo"
    End Select

Questo tipo di costruzione risulta utile quando si voglia, all'interno di una condizione (o gruppo di condizioni) creare differenti alternative nell'ambito della condizione stessa.

Un ultimo accorgimento quando si usi il SelectCase con espressioni che siano stringhe di testo: abbiamo visto che la variabile che rappresenta l'espressione può provenire da diverse parti, da una TextBox, da un valore selezionato in una ComboBox, o ListBox, da una cella del foglio di lavoro, da un'altra variabile, ecc.; in tutti questi casi non saremo mai sicuri di come è scritta la stringa per quanto concerne maiuscole/minuscole, e visto che dovremo scrivere nel codice l'elenco costanti esatto, conviene convertire la variabile tutta in maiuscolo (oppure tutto in minuscolo) e scrivere l'elenco costanti in maiuscolo. Esempio: supponiamo di voler selezionare dei nomi di squadre di calcio, e non sapremo se saranno scritti "Milan" o MILAN" o ancora "milan"; rendiamo quindi tutto maiuscolo con la funzione Ucase, e scriveremo i nomi nel codice tutto maiuscolo:

  • Testo = UCase(TextBox1.Value)  'questo restituisce la variabile Testo tutta in maiuscolo
    Select Case Testo
    Case "MILAN"
    'istruzioni da eseguire
    Case "INTER"
    'istruzioni da eseguire
    Case "JUVENTUS"
    'istruzioni da eseguire
    Case "ROMA"
    'istruzioni da eseguire
    Case Else
    'istruzioni da eseguire
    End Select

Ancora per comparare la diversità di costruzione istruzioni tra If...Then .. e una struttura Case, vediamo questa riga della routine di esempio sopra riportata: (numero è la variabile da valutare)

  • Case 6 To 10, 16 To 25  - questa istruzione verifica che  numero sia compreso tra due intervalli di valori. Se numero fosse 8, l'istruzione accerta che numero rientra nel primo intervallo, ed eseguirà istruzioni successive. Usando invece il costrutto If..Then, avremmo dovuto scrivere:

  • If numero >= 6 And numero <= 10 Or numero >= 16 And numero <= 25 Then

come si nota, la struttura Case ci consente un bel risparmio di istruzioni, risparmio tanto maggiore quanto maggiore è il numero degli intervalli da verificare. Con If siamo costretti ad usare gli operatori And per definire l'intervallo, e Or per concatenare gli intervalli.

Se invece compariamo le differenze per quanto riguarda stringhe di testo, con la struttura Case scriviamo:

  • Case "Pippo", "bac" To "let" - dove è sufficiente scrivere "bac" To "let" per comprendere tutte le parole (o frasi) comprese tra le iniziali "bac" e "let" (ad esempio "baciami mostro!" oppure "dammi la mano", o ancora "lasciami andare", ecc.)., mentre con If avremmo dovuto usare l'asterisco ( * ) per indicare che cerchiamo tutto ciò che si troverà dopo le tre lettere della prima stringa e tra le due stringhe, così: (valore è la variabile da valutare)

  • If valore = "Pippo" Or valore >= "bac*" And valore <= "let*" Then

Concludo facendo notare che la costruzione con una struttura Case (quando possibile) è sicuramente più semplice e immediata da capire e scrivere rispetto alla struttura If..Then.


 Buon lavoro.

prelevato sul sito www.ennius.altervista.org