La Funzione Choose

Ultima modifica: 27-05-2016

Una funzione comoda per effettuare delle scelte veloci è la funzione Choose.

Uso della Funzione Choose

Nel VBA di Excel la funzione Choose restituisce un valore da una lista di argomenti in base al valore indicato da un indice.

La sintassi è:

Choose( indice, val1, val2, ... val_n )

ovvero

Val_scelto = Choose(2, "Pippo", "Topolino", "Qui Quo Qua", "Paperino", "Zio Paperone")

Questo esempio restituisce il valore "Topolino".

L'indice su cui si basa la funzione Choose è a "base 1" cioè inizia da 1. Per cui se "indice" è 1 restituisce il primo valore, se è 2 restituisce il secondo valore e così via.

Bisogna porre particolare attenzione all'indice che si passa alla funzione: se non rientra nel range degli oggetti in esame restituisce NULL e questa cosa fa arrabbiare il debugger.

Se "indice" è superiore al numero degli argomenti passati nella funzione si ottiene un valore nullo. Da questo ne consegue che bisogna porre attenzione a come viene usato il valore restituito dalla funzione e su come viene gestito l'errore.

In questo esempio viene mostrato uno dei modi con cui viene gestito l'errore per far sì che la macro non venga interrotta con un messaggio di errore del sistema.

Questa volta l'istruzione On Error viene usata con l'Istruzione GoTo che consente di saltare ad una determinata riga della routine. La riga deve possedere un'etichetta di riga a cui GoTo possa fare riferimento. Per assegnare un'etichetta a una riga di codice occorre inserire un identificatore (nome), seguito dai due punti, all'inizio della riga del codice sorgente come è mostrato nel frammento di codice mostrato qui di seguito.

 

Vediamo questo esempio in cui alla funzione viene passato un indice con valore "7" mentre il numero degli argomenti da scegliere è "5".

Sub test_Choose_1()

Dim Val_scelto, Msg
On Error GoTo ERRORE
Val_scelto = Choose(7, "Pippo", "Topolino", "Qui Quo Qua", "Paperino", "Zio Paperone")
Cells(1, 1) = Val_scelto
MsgBox Val_scelto
Exit Sub

ERRORE:
Msg = "Errore " & Str(Err.Number) & " generato da " & Err.Source & Chr(13) & Err.Description
MsgBox Msg, vbCritical, "Errore"
On Error GoTo 0


End Sub

In questo esempio il valore restituito dalla funzione viene usato in 2 modi differenti:

Viene scritto nella cella del foglio

Viene mostrato in una MsgBox

Nel primo caso non succede nulla. Nella cella indicata viene scritto semplicemente nulla (rimarrà vuota)

Nel secondo caso verrà invece generato il seguente errore

Errore di run-time '94':
Utilizzo non valido di Null

Questo perchè la Funzione MsgBox non accetta valori "null".

In questi casi si può ovviare in alcuni modi:

Primo modo: Mettere una If prima di invocare la MsgBox

Sub test_Choose_1()
Dim Val_scelto, Msg
Val_scelto = Choose(7, "Pippo", "Topolino", "Qui Quo Qua", "Paperino", "Zio Paperone")
' NB l'indice "7" potrebbe causare un errore in quanto il numero degli argomenti tra cui poter scegliere è 5
Cells(1, 1) = Val_scelto
If Val_scelto Then
MsgBox Val_scelto
Else
MsgBox "Si è verificato un errore", vbCritical, "Errore"
End If
End Sub

Secondo modo: dare a MsgBox il valore restituito dalla funzione Choose concatenato con una stringa vuota

Sub test_Choose_1()
Dim Val_scelto
Val_scelto = Choose(7, "Pippo", "Topolino", "Qui Quo Qua", "Paperino", "Zio Paperone")
Cells(1, 1) = Val_scelto
MsgBox "" & Val_scelto
End Sub

Terzo modo: intercettare l'eventuale valore nullo restituito dalla funzione Choose con la Funzione IsNull

Sub test_Choose_2()
Dim Index, Valore
Index = Val(InputBox("scegli un numero"))
Valore = Choose(Index, "a1", "a2", "a3")
If IsNull(Valore) Then
   MsgBox "Valore non trovato"
Else
   MsgBox Valore
End If
End Sub

 

Creare delle matrici con la funzione Choose

In altre circostanze abbiamo già trattato l'argomento "Matrici" o "Array".

Stavolta vediamo come creare una matrice usando la funzione Choose. Non si sa mai, a volte può tornarci comodo.

Anche qui, come in molti altri casi possiamo generare della matrici come più ci fa comodo: Statiche, Dinamiche, ad una dimensione, a più dimensioni, a base 0 o a base differente.

Una volta creata una o più liste di valori da dare come argomenti alla funzione Choose possiamo creare le nostre Matrici.

Cominciamo con un primo esempio facile.

Creazione di una matrice ad una dimensione

L'operazione per svolgere questa operazione è semplice.

Viene iniziato un ciclo che, partendo da 1, va fino all'ultimo elemento che si intende assegnare alla Funzione Choose

A questa funzione si passa, come indice, lo stesso indice usato per il ciclo, quindi i dieci nomi che vogliamo memorizzare nella matrice

Durante tutte queste iterazioni la matrice "Matrice()" viene popolata.

Sub Crea_Array_mono_Con_Choose()
Dim A, Message
Dim Matrice(1 To 10)
For A = 1 To 10
   Matrice(A) = Choose(A, "Michele", "Carlo", "Francesco", "Franco", "Gabriele", "Girolamo", "Angelo", "Marcello", "Giuseppe", "Giorgio")
Next
Message = ""
For A = LBound(Matrice) To UBound(Matrice)
   Message = Message & A & " " & Matrice(A) & vbCrLf
Next
MsgBox Message
End Sub

Creazione di una matrice a più dimensioni

Leggermente più complesso, ma non troppo, è il discorso per la creazione di una matrice a più dimensioni.

Nel prossimo esempio potremmo desiderare di creare una matrice a due dimensioni: 10 righe e 3 colonne.

In questo esempio uso ancora la funzione Choose su un gruppo di elementi per ogni colonna della matrice.

Esempio: il nome, la città e l'indirizzo.

Agisco in questo modo:

Creo una matrice di 10 righe e 3 colonne

Inizio un ciclo che conta da 1 a 10

In questo ciclo, utilizzo l'indice del ciclo anche come indice della funzione Choose che cambia ad ogni passo del ciclo

Ora è la volta di mostrare il codice usato

Sub Array_Con_Choose()
Dim A, B, Message
Dim Matrice(1 To 10, 1 To 3)
For A = 1 To 10
   Matrice(A, 1) = Choose(A, "Michele", "Carlo", "Francesco", "Franco", "Gabriele", "Girolamo", "Angelo", "Marcello", "Giuseppe", "Giorgio")
   Matrice(A, 2) = Choose(A, "Roma", "Cologna", "Milano", "Torino", "Venezia", "Genova", "Sassari", "Ancona", "Padova", "Messina")
   Matrice(A, 3) = Choose(A, "AREA PORTO", "VIA GRAMSCI", "VIA GRAMSCI", "STRADA Maggiore", "VIA CAVOUR", "VIA FORNACE", "STRADA PRIVATA", "VIA DEL TUSCOLANO", "VIA NAPOLEONE", "VIA DEL POPOLO")
Next
' questi che seguono sono solo 2 dei modi per scrivere nel foglio i dati così memorizzati
' primo metodo

For A = LBound(Matrice, 1) To UBound(Matrice, 1)
   For B = LBound(Matrice, 2) To UBound(Matrice, 2)
      Cells(A, B) = Matrice(A, B)
   Next
Next
' secondo metodo
For B = LBound(Matrice, 2) To UBound(Matrice, 2)
   For A = LBound(Matrice, 1) To UBound(Matrice, 1)
      Cells(A, B + 10) = Matrice(A, B)
   Next
Next
End Sub

Come vedete dagli esempi sopra riportati, questo modo di costruire le matrici va bene quando le matrici debbono contenere pochi elementi. E' ovvio che se la matrice dovrà memorizzare un numero elevato di elementi sarà più conveniente, anche se richiede un tempo di esecuzione relativamente più lungo, la classica creazione usando i cicli come mostrato in esempi esempio che ho presentato in altre circostanze.

A questo punto posso suggerire di dare un'occhiata agli articoli già pubblicati nel sito: l'articolo "le matrici" esempio, i Suggerimenti (aggiornabile) esempio, Suddividere le stringhe esempio e Suddividere (casi particolari) esempio.