If ... Iif ... Select Case

Ultima modifica: 02-07-2016

 

Molto spesso chi è dedito alla programmazione si imbatte in un problema legato alla comparazione di dati. Oppure a dover compiere un'azione al posto di un'altra a seconda che ci si trova in una situazione o in un'altra.

Per verificare o comparare determinate situazioni od eventi possiamo avvalerci di alcune istruzioni o funzioni:

Per gli esempi che seguiranno terremo conto di questa tabella esempio

 

L'istruzione If...Then...Else

L'istruzione che forse usiamo con più facilità è l'istruzione If che segue questa sintassi:

If Condizioni then
istruzioni da seguire
End If

Premetto che per determinare l'intervallo faccio uso di una funzione personale esempio che verrà ripetuta in quasi tutte le routines.

Vediamo come esempio il codice seguente che conta le occorrenze di una parola in un elenco. In questo esempio la istruzione If viene usata nel modo più semplice

Sub Istruzione_if()
Dim Intervallo As Range
Dim Righe, Colonne, R, C
Dim Nome, Conta
Set Intervallo = IntervalloDati() ' viene richiamata la funzione che determina l'intervallo
Righe = Intervallo.Rows.Count
Colonne = Intervallo.Columns.Count
Nome = Range("I1") ' nella cella "I1" c'è il nome da cercare
C = 1: Conta = 0
For R = 1 To Righe
If Intervallo(R, C) = Nome Then ' quando viene trovato il nome viene incrementato il contatore
Conta = Conta + 1
End If
Next
Range("H1") = Conta
End Sub

Nel seguente esempio aggiungiamo un altro elemento alla istruzione: Else (altrimenti). La sintassi è lievemente più complessa di quella appena vista:

If condizione Then
Istruzioni
Else
IstruzioniAlternative
End If

Sempre lavorando sulla stessa tabella vogliamo ora sapere quante occorrenze ci sono per un determinato nome e quante sono le altre:

Sub Istruzione_if_else()
Dim Intervallo As Range
Dim Righe, Colonne, R, C
Dim Nome, ContaSi, ContaNo
Set Intervallo = IntervalloDati() ' viene richiamata la funzione che determina l'intervallo
Righe = Intervallo.Rows.Count
Colonne = Intervallo.Columns.Count
Nome = Range("I1") ' nella cella "I1" c'è il nome da cercare
C = 1: ContaSi = 0: ContaNo = 0
For R = 1 To Righe
If Intervallo(R, C) = Nome Then ' quando viene trovato il nome viene incrementato il contatore ContaSi
ContaSi = ContaSi + 1
Else ' altrimenti viene incrementato il contatore ContaNo
ContaNo = ContaNo + 1
End If
Next
Range("H4") = ContaSi
Range("I4") = ContaNo
End Sub

Ora un costrutto un po' più complesso: aggiungiamo anche un ElseIf.

La sintassi per questo tipo di costrutto è lievemente più complesso ancora:

If condizione Then
Istruzioni
ElseIf condizione
Istruzioni
Else
IstruzioniAlternative
End If

In questo costrutto si possono inserire illimitate ElseIf.

In questo esempio vogliamo contare i nomi che finiscono con le varie vocali o con altre lettere.

Questo può essere un esempio di codice:

Sub Istruzione_if_elseif()
Dim Intervallo As Range
Dim Righe, Colonne, R, C
Dim A, E, I, O, U, NoVoc
Dim Nome, Finale
Set Intervallo = IntervalloDati() ' viene richiamata la funzione che determina l'intervallo
Righe = Intervallo.Rows.Count
Colonne = Intervallo.Columns.Count
Columns("H:I").ClearContents
C = 2: A = 0: E = 0: I = 0: O = 0: U = 0: NoVoc = 0
For R = 1 To Righe
Nome = Intervallo(R, C)
Finale = Right(Nome, 1) ' viene estratta l'ultima lettera del nome
If Finale = "a" Then ' viene incrementato il contatore relativo alla lettera estratta
A = A + 1
ElseIf Finale = "e" Then
E = E + 1
ElseIf Finale = "i" Then
I = I + 1
ElseIf Finale = "o" Then
O = O + 1
ElseIf Finale = "u" Then
U = U + 1
Else
NoVoc = NoVoc + 1 ' altrimenti viene incrementato l'ultimo contatore
End If
Next
Range("H4") = A & " voc a"
Range("H5") = E & " voc e"
Range("H6") = I & " voc i"
Range("H7") = O & " voc o"
Range("H8") = U & " voc u"
Range("H9") = NoVoc & " altro"
End Sub

Per la cronaca il risultato ottenuto con la tabella presentata viene ottenuto questo risultato:


5 voc a --> 2 voc e --> 6 voc i --> 15 voc o --> 0 voc u --> 0 altro

 

La funzione Iif

La funzione Iif consente un particolare tipo di verifica condizionale. Con questa funzione, se espressione è vera viene restituita la prima parte dell'espressione, altrimenti la seconda parte. In alcuni casi può essere sostituito alla If ... Then ... Else ... End If.

La sua sintassi è semplice:

IIf(espressione condizionale, vero, falso)

Proviamo ad usare questa funzione per cercare le occorrenze di un nome scritto nella cella J1:

Sub La_Funzione_Iif()
Dim Intervallo As Range
Dim Righe, Colonne, R, C
Dim Nome
Set Intervallo = IntervalloDati() ' viene richiamata la funzione che determina l'intervallo
Righe = Intervallo.Rows.Count
Colonne = Intervallo.Columns.Count
Columns("H:I").ClearContents
Nome = Range("J1")
C = 1
For R = 1 To Righe
Nome = Range("J1")
Intervallo(R, 8) = IIf(Intervallo(R, C) = Nome, "Sì", "No") ' questo dovrebbe essere chiaro
Next
End Sub

Viene restituita una serie di Sì e di No a seconda che nelle varie celle viene trovato o meno il nome cercato.

 

Istruzione Select Case

Altro modo utile e, a volte, più semplice è quello di usare l'istruzione Select Case.

La sintassi di questo costrutto è la seguente:

Select Case Variable
Case X1
[istruzioni X1]
Case X2
[istruzioni X2]
........
Case Else
[istruzionielse]
End Select

La logica che segue questo tipo di istruzione è il seguente:

Prendiamo in esame la variabile Variable:

nel caso è uguale al valore "X"
esegui questa istruzione

nel caso è uguale al valore "Y"
esegui un'altra istruzione
..........
altrimenti
esegui l'ultima istruzione e finisci

Ora un esempio concreto:

Nella seconda colonna di un intervallo di celle abbiamo un elenco di nomi:

Pierluigi
Mirella
Giuseppe
Andrea
Pierluigi
Alessio
Romano
Claudio
Carlo
Massimo
Giovanni
Franca
Alessio
Alessio
Andrea
Alessio
Roberto
Enrico
Carlo
Stefano
Giovanni
Andrea
Domenico
Claudio
Oreste
Giovanni
Luigi

Vogliamo sapere quanti di questi nomi finiscono con con le varie vocali

ci comportiamo in questo modo:

Determiniamo l'intervallo
scorriamo tutta la seconda colonna
preleviamo l'ultima lettera
esaminiamo la lettera
incrementiamo il relativo contatore
alla fine mostriamo il risultato

Sub Istruzione_Case()
Dim Intervallo As Range
Dim Righe, Colonne, R, C, A, E, I, O, U, NoVoc
Dim Nome, Finale
Worksheets("Foglio1").Select
' viene definito l'intervallo
With Range("A1").CurrentRegion
   Righe = .Rows.Count - 1
   Colonne = .Columns.Count
   Set Intervallo = .Offset(1, 0).Resize(Righe, Colonne)
End With
Righe = Intervallo.Rows.Count
' viene ripulito l'intervallo in cui vengono visualizzati i risultati
Columns("H:I").ClearContents
C = 2: A = 0: E = 0: I = 0: O = 0: U = 0: NoVoc = 0
' si inizia a ciclare nella colonna dei nomi
For R = 1 To Righe
   Nome = Intervallo(R, C)
' viene prelevata l'ultima lettera del nome
   Finale = Right(Nome, 1)
' vengono incrementati i contatori A, E, ... se vengono trovate le vocali a, e,...
   Select Case Finale
      Case "a"
         A = A + 1
      Case "e"
         E = E + 1
      Case "i"
         I = I + 1
      Case "o"
         O = O + 1
      Case "u"
         U = U + 1
      Case Else
         NoVoc = NoVoc + 1
   End Select
Next
' vengono visualizzati i risultati
Range("H2") = "Iniziali con vocali"
Range("H4") = A & " voc a"
Range("H5") = E & " voc e"
Range("H6") = I & " voc i"
Range("H7") = O & " voc o"
Range("H8") = U & " voc u"
Range("H9") = NoVoc & " altro"
End Sub
Qui esempio è possibile vedere l'esempio.

Quel che segue nella tabella mostra alcuni modi di usare i blocchi Case in una istruzione Select Case.

Case 5 il valore 5
Case "Giovanni" Giovanni
Case 9, 11, 13 uno dei valori descritti nell'elenco
Case 1 To 4 un valore compreso tra 1 e 4
Case "A" To "Az", "a" To "az" un nome compreso tra A e z (maiuscoli e minuscoli)
Case Is > MaxNumber un valore superiore al valore descritto
Case Is > 20 come sopra
Case 1 To 4, 7 To 9, 11, 13, Is < MaxNumber raggruppa tutti i casi appena visti

In questo elenco sono mostrati alcuni dei modi di usare le varie clausole Case.

Un esempio di come usare le sintassi più complesse del semplice Case visto qui sopra è questo:

Sub Istruzione_Case2()
Dim Intervallo As Range
Dim Righe, Colonne, R, C
Dim Bimbo, Ragazzo, Adulto, Anziano, Altro
Dim Eta, Finale, Hover
Worksheets("Foglio1").Select
With Range("A1").CurrentRegion
   Righe = .Rows.Count - 1
   Colonne = .Columns.Count
   Set Intervallo = .Offset(1, 0).Resize(Righe, Colonne)
End With
Righe = Intervallo.Rows.Count
Columns("H:I").ClearContents
C = 7: Bimbo = 0: Ragazzo = 0: Adulto = 0: Anziano = 0: Altro = 0
Hover = 56
For R = 1 To Righe
   Eta = Intervallo(R, C)
   Select Case Eta
      Case 1 To 9
         Bimbo = Bimbo + 1
      Case 10 To 17
         Ragazzo = Ragazzo + 1
      Case 18 To 54
         Adulto = Adulto + 1
      Case 55
         Altro = Altro + 1
      Case Is >= Hover
         Anziano = Anziano + 1
   End Select
Next
Range("a1").Select
Range("H2") = "Fasce di età"
Range("H4") = Bimbo & " fino a nove anni"
Range("H5") = Ragazzo & " tra i 10 e i 17 anni"
Range("H6") = Adulto & " tra i 18 e i 54 anni"
Range("H7") = Altro & " 55 anni"
Range("H8") = Anziano & " dai 56 anni in poi"
End Sub

Qui esempio potete osservare l'esempio in azione.

Per questa volta è tutto.