Choose: uso proprio ed uso (ma guarda un po') nelle matrici

 

Il problema

 

La funzione Choose è utilizzata per restituire un valore da un elenco in base ad un indice indicato tra gli argomenti.

La sua sintassi è:

Choose(indice, val1, val2, ..., val-n)

Indice è un valore compreso tra 1 ed il numero di elementi compreso negli argomenti valx, ma non solleva errori se ha un valore al di fuori di questo intervallo. Semplicemente non restituisce nulla. Indice può essere rappresentato sia da costanti numeriche che da variabili anch'esse di tipo numerico

valx è l'elenco dei valori tra cui sceglierne uno in base al valore di Indice

se indice è 2 dall'elenco dei valori viene scelto val2

se indice è 5 viene scelto val5

Questo che segue è un esempio d'uso della funzione Choose. Le due istruzioni evidenziate in grassetto vengono mostrati un esempio d'uso della funzione con variabili ed uno da costanti stringa:

 

Sub EsempioChoose()
Dim Scelta
Dim X As Integer
Dim B1, B2, B3
B1 = "Italia": B2 = "Svizzera": B3 = "Austria"
X = Val(InputBox("scegli 1 2 o 3" & vbCr & vbCr _
& "Italia" & vbCr & "Svizzera" & vbCr & "Austria", "La tua scelta"))
If X < 1 Or X > 3 Then
MsgBox "Non è una scelta giusta"
Exit Sub
End If
Scelta = Choose(X, B1, B2, B3)
'Scelta = Choose(X, "Italia", "Svizzera", "Austria")
MsgBox "Hai scelto " & Scelta
End Sub

Le prime righe servono per ottenere dall'utente una scelta e per verificare se l'utente ha effettuato una scelta giusta

 

 

 

Viene richiesto di scrivere un numero che viene memorizzato nella variabile X

Se viene superato il controllo (quasi doveroso in ogni richiesta di Input che si rispetti)

 

 

verrà restituito nella variabile Scelta un valore in base al numero digitato e memorizzato nella variabile X

 

 

 

La questione Matrici

La funzione può essere usata anche per costruire delle matrici.

Usare Choose per costruire una matrice è semplice: è sufficiente usare per Indice il contatore di un ciclo e memorizzare il valore scelto in una matrice anziché in una semplice variabile.

 

E' ovvio che questo metodo, come quello usato con la funzione Array o con la funzione Split, è comodo quando abbiamo pochi elementi da memorizzare nella matrice.

I tre metodi sono simili, ma quello con Choose, secondo me, è più flessibile ed più comodo e lo vedremo tra poco.

 

Con Array avremo:

Matrice = Array("Mic", 2, "carlo", 7, "giovanni")

Occorre tener presente che la matrice così creata avrà tre particolari caratteristiche:

  1. la matrice sarà di tipo dinamica : infatti il comando Erase Matrice la distrugge veramente e leggendone i limiti si provoca un errore "Indice non incluso nell'intervallo")

  2. avrà una sola dimensione

  3. la base degli indici è sensibile alla Option Base impostata nel modulo

    1. Con Option Base 1 la matrice avrà l'indice inferiore pari a 1 e l'indice superiore pari al numero degli elementi in essa memorizzati (nell'esempio sopra riportato sarà pari a 5).

    2. Con Option Base 0 o addirittura omesso (è la situazione di default) avrà l'indice inferiore pari a 0 e l'indice superiore pari al numero degli elementi in essa memorizzati -1 (nell'esempio sopra riportato sarà pari a 4: tra 0 e 4 le locazioni create saranno uguali a 5)

Per questo motivo dobbiamo porre attenzione quando andremo a leggere i dati memorizzati nella matrice.

 

 

Con Split avremo:

Dati = "Giuliana*Michele*Gabriele*Giosia*Stefano*Marcello*Gaetano*Maria*Edith"

Matrice = Split(Valori, "*")

Queste sono le caratteristiche della matrice creata con questo metodo.

  1. la matrice sarà di tipo statico: infatti il comando Erase Matrice causa solo lo svuotamento delle locazioni della matrice e non la sua completa distruzione; la prova è che la lettura dei suoi limiti non provoca errori

  2. anche questa matrice avrà una sola dimensione

  3. la base degli indici della matrice non sarà sensibile alla Option Base usata ma sarà sempre uguale a 0 (zero) 

 

La questione Choose

Se per creare la nostra matrice utilizziamo la funzione Choose la nostra matrice sarà come noi la vogliamo:

  1. Statica o Dinamica

  2. ad 1 o più dimensioni

  3. con l'indice inferiore che più ci aggrada: 0, 1, o altro.

Ma vediamo subito l'esempio che sto proponendo. In questo ho usato una matrice statica, ad 1 dimensione e con gli indici inferiori e superiori rispettivamente posti ad 1 e a 10 con: Dim Matrice(1 To 10) per memorizzare 10 elementi

 

Sub Crea_Array_Con_Choose()
Dim A, A1, A2, Messaggio
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

 

End Sub

 

La struttura della matrice così costruita avrà questo aspetto:

   

Con questo metodo potremmo creare anche una matrice a più dimensioni. Per esempio potremmo desiderare di costruire una matrice a due dimensioni:

10 righe

3 colonne

per memorizzare il nome, la città e l'indirizzo dei nostri bravi amici come mostrato nel seguente esempio.

Uso la funzione Choose su un gruppo di elementi per ogni colonna della matrice.

 

Sub Array_Con_Choose()
Dim A, B, A1, A2, Messaggio
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

End Sub

 

La matrice avrà questa struttura:

 

 

Conclusioni

Come vedete dagli esempi sopra riportati, questo modo di costruire le matrici (Array, Split, Choose) 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 negli esempi dell'ultimo articolo (Le Matrici: la Funzione Filter).

 

A questo punto posso suggerire di dare un'occhiata agli articoli già pubblicati nei due siti: l'articolo "le matrici" nel vecchio sito e gli articoli Suggerimenti (aggiornabile), Suddividere le stringhe e Suddividere (casi particolari) in questo, nonché l'articolo Le Matrici - Atto Unico del mio amico Ennius sempre in questo sito

 

prelevato sul sito www.ennius.altervista.org