User‎ > ‎

Le Matrici di Excel ... uno sguardo a come sono fatte

Alcune considerazioni su chi usa già le matrici e le formule matriciali e le UDF.
Ero indeciso su dove collocare questi appunti, si parlerà più di VBA però è rivolto a chi usa le Matrici di Excel che verranno viste, diciamo, con la lente d'ingrandimento ... per questo ho deciso di pubblicarli nella sezione User.
Tutto è nato da una vecchia discussione in cui si cercava con una udf di restituire una matrice simile a quelle restituite da excel ... anzi di più ... si tentava di restituire un risultato matrice coerente all'argomento passato ... faccio un esempio ... sarà forse più chiaro ... consideriamo la funzione conta.se ... in particolare un conta.se in forma matriciale:
=CONTA.SE(A1:A8;B1:B8)
in questa formula vengono confrontate le due colonne ... o meglio viene eseguito il CONTA.SE su tutti i valori delle celle del range B1:B8 o meglio sulla matrice dei valori di tale range la formula restituisce qualcosa tipo:
={0\0\0\1\1\1\0\0}
il valore delle celle B4, B5, B6 è presente una volta nel range A1:A8 potete verificarlo facilmente posizionandovi sulla barra delle formule e premendo poi F9
vediamo ora un conta.se che considera due righe
=CONTA.SE(A1:H1;A2:H2)
in questa formula vengono confrontate due righe ... la formula restituisce qualcosa tipo:
{0;1;2;2;1;0;0;1}
beh confrontate ... forse non è proprio la parola più adatta ma il concetto ora dovrebbe essere più chiaro ... ecco quindi che in base a come è fatto l’argomento il risultato è una matrice coerentemente strutturata.

Questo per spiegare come è nata l’analisi e cosa si prefiggeva ...
La prima cosa che feci fu quella di cercare di guardare più da vicino come fossero fatte queste matrici che Excel restituiva da calcoli nelle formule ...
Subito immaginai di trovarmi di fronte a vettori riga, vettori colonna e matrici rettangolari ... (Proprietà Value di Range Multicella - Lavorare con i Range in Memoria )
Così usando una function che contasse le dimensioni di una matrice sono andato a verificare ...
La function è quella classica:
‘da incollare in un modulo standard
Function n_dim(m)
On Error Resume Next
Dim i As Long
Dim c
For i = 1 To 60
    c = UBound(m, i)
    If Err Then
        n_dim = i - 1
        Exit Function
    End If
Next
End Function

Questa formula:
=RIF.RIGA($A$1:$A$3)
restituisce una matrice in Excel corrispondente a:
{1\2\3}
in una cella quindi usando n_dim
=n_dim(RIF.RIGA($A$1:$A$3))
da confermare con Ctrl+Maiusc+Invio
il risultato è 2 dimensioni .... siamo di fronte ad un vettore colonna ... ricordate? in particolare una matrice del tipo:
v(1 to 3, 1 to 1)
Per verificare provate a digitare in una cella test10() poi posizionandovi nella barra premete F9.
Function test10()
'vettore colonna
Dim v(1 To 3, 1 To 1)
'restituisce {1\2\3}
v(1, 1) = 1
v(2, 1) = 2
v(3, 1) = 3
test10 = v
End Function
il risultato è quello atteso:
{1\2\3}
mi aspettavo un risultato analogo con la formula:
=RIF.COLONNA($A$1:$C$1)
che restituisce una matrice in Excel corrispondente a:
{1;2;3}
in una cella quindi usando n_dim
=n_dim(RIF.COLONNA($A$1:$C$1))
da confermare con Ctrl+Maiusc+Invio
il risultato è 1 ... una dimensione ... ovvero un vettore puro!
del tipo v(1 to 3)
per verificare provate a digitare in una cella test11() poi posizionandovi
nella barra premete F9
da incollare in un modulo standard
Function test11()
'vettore
Dim v(1 To 3)
'restituisce {1;2;3}
v(1) = 1
v(2) = 2
v(3) = 3
test11 = v
End Function
il risultato è:
{1;2;3}
ma non è finita ... stesso risultato infatti si ha digitando in una cella
test12() e seguendo la stessa procedura premendo F9
da incollare in un modulo standard
Function test12()
'vettore riga
Dim v(1 To 1, 1 To 3)
'restituisce {1;2;3}
v(1, 1) = 1
v(1, 2) = 2
v(1, 3) = 3
test12 = v
End Function

ancora il risultato è:
{1;2;3}
un esempio pratico di utilizzo di queste conclusioni in una UDF lo trovate a questo link.

Concludo con le matrici rettangolari proponendo nuovamente questa serie di operazioni:
la formula:
=RIF.RIGA($A$1:$A$3)*RIF.COLONNA($A$1:$B$1)
che diventa
{1\2\3}*{1;2}
e restituisce una matrice in Excel corrispondente a:
{1;2\2;4\3;6}
in una cella quindi usando n_dim
=n_dim(RIF.RIGA($A$1:$A$3)*RIF.COLONNA($A$1:$B$1))
da confermare con Ctrl+Maiusc+Invio
il risultato è ovviamente questa volta 2 dimensioni .... siamo di fronte ad una matrice retangolare ... in particolare una matrice del tipo v(1 to 3, 1 to 2)
graficamente qualcosa del tipo:
1;2
2;4
3;6
digitando in una cella test13() e seguendo la stessa procedura premendo F9
'da incollare in un modulo standard
Function test13()
'matrice rettangolare
Dim v(1 To 3, 1 To 2)
'restituisce {1;2;3}
v(1, 1) = 1
v(2, 1) = 2
v(3, 1) = 3
v(1, 2) = 4
v(2, 2) = 5
v(3, 2) = 6
test13 = v
End Function
il risultato è
{1;4\2;5\3;6}
 
 
 
Comments