Per tutti:
>..se volete provarci sappiate che probabilmente, qualora doveste
>riuscire, sareste i primi a farlo ... direi che è una sfida
>intrigante ...
Forse non ho capito bene ciò che bisogna fare. Tento di spiegare
l'architettura del file da zero. Fin dove l'ho analizzato.
Anatomia di un applicativo complesso: Parte prima.
Nella Formula SERIE del 1° Grafico, il primo argomento ( titolo ) è
il nome definito ttlTrm
questo è la concatenazione di altri 2 nomi definiti rngT e rngY:
ttlTrm = rngT&" " &rngY ( questa e le successive da leggersi nel senso
che quello che c'è a destra del segno uguale è la formula riferito al
nome alla sinistra del segno uguale )
Il nome rngT è un 'OFFSET' di trmRng: precisamnete punta alla riga
posta immediatamente sopra alla colonna dinamica restituita da trmRng
rngT = SCARTO(trmRng;-1;;1;1)
Come si arriva a trmRng ?
Intanto individuiamo, provvisoriamente in maniera statica, l'area dei
valori; questa è $C$3:$K$12. Il trimestre successivo, ci saranno,
però, nuovi dati da inserire in L3:L12; quindi dobbiamo dinamizzare
quest' area che chiameremo tRng. Possiamo definire questa area come un
OFFSET della prima colonna di dati, cioè la C3:C12. Se il primo
argomento della funzione SCARTO non è una singola cella ma
l'intervallo C3:C12, possiamo ottenere l'espansione in senso
orizzontale di tale intervallo con:
tRng = SCARTO(Foglio1!$C$3:$C$12;;;;CONTA.VALORI(Foglio1!$C$3:$N$3))
Attualmente per il file in esame l'ultimo argomento restituisce il
numero 9
Come possiamo individuare una di queste 9 colonne in base alla cella
attiva e la cella attiva stessa?
Affrontiamo il problema da un punto di vista statico; vogliamo
individuare il 3° trimestre del 2010; cioè le celle E3:E12
trmRng = INDICE(tRng;0;3)
Il secondo argomento impostato a 0, forza il riferimento a tutte le
celle della terza colonna della matrice tRng ( mentre se avessimo
messo per es 2 avrebbe puntato alla cella E3 ).
Per dinamizzare la formula il nostro 3 deve essere sostituito dalla
differenza tra il numero assoluto della colonna E - il numero assoluto
della colonna C ( la prima della matrice ) + 1 ; cioè 5 - 3 + 1; come
dire RIF.COLONNA ( E3)- RIF.COLONNA(C3)+1
Abbiamo allora la formula :
trmRng = INDICE(tRng;0;RIF.COLONNA ( E3)- RIF.COLONNA($C$3) + 1)
Ora dobbiamo dinamizzare la lettera delle colonne in relazione alla
cella attiva all'interno della matrice di dati e apportare le
correzioni in caso si selezionino celle al di fuori di tale
intervallo; vogliamo che, selezionando E3, un nome definito aRng ci
restituisca E3 ; selezionando E4 si restituisca E4 ecc; altresì se
selezioniamo E1 ci restituisca E3 e se selezioniamo E34 ci restituisca
un riferimento a E12
vogliamo che si venga restituito il riferimento alla cella E3
In termini statici da C3 possiamo *spostarci* a E3 con
=SCARTO($C$3;0;2;1;1)
In termini dinamici ( in riferimento alla cella attiva )
=SCARTO($C$3;CELLA("row")-RIF.RIGA(tRng);CELLA("col")-
RIF.COLONNA(tRng);1;1)
Questa funziona solo se la cella attiva è all'interno della matrice
dei dati. Se vogliamo forzare un riferimento all'interno dell'area dei
dati giochiamo con la funzione MEDIANA su 3 coordinate sia per quanto
riguarda il rif di riga che quello di colonna:
Per il rif di riga
1) Rif di riga cella attiva: CELLA("row")
2) Rif di riga 1a cella di dati : RIF.RIGA(sRng)
3) Rif di riga ultima cella di dati: come ha risolto l'autore? In un
modo intrigante, ma che personalmente non adotterei. Io preferirei la
triviale ( ma non l'ho testata e non vorrei aver preso una cantonata)
= RIF.RIGA(sRng) + RIGHE(tRng)- 1
L'autore risolve con
= MAX(RIF.RIGA(tRng))
che non funziona sul foglio di lavoro ( vi restituisce lo stesso
valore di RIF.RIGA(tRng)), ma funziona con comportamento intrinseco
matriciale se la formula è riferita ad un nome definito. Provate!
Questo è un punto di riflessione sulle formule matriciali nei nomi
definiti!
Uguale ragionamento per la colonna della cella attiva ( che qui
salto ).
Se l'utente clicca una riga superiore a quella dell'area dei dati la
mediana dei 3 valori è quella della prima riga dei dati
Se l'utente clicca una riga inferiore a quella dell'area dei dati la
mediana dei 3 valori è quella dell' ultima riga dei dati
Se clicca una riga in corrispondenza di quella dei dati la mediana
individua proprio la riga corripondente alla cella attiva
la cella attiva dell'area dei dati oppure quella più *vicina* in caso
di cella attiva fuori area dati sarà quella definita così:
aRng =
SCARTO(sRng;MEDIANA(CELLA("row");RIF.RIGA(sRng);MAX(RIF.RIGA(tRng)))-
RIF.RIGA(sRng);MEDIANA(CELLA("col");RIF.COLONNA(sRng);MAX(RIF.COLONNA(tRng)))-
RIF.COLONNA(sRng))
Il seguito in una prossima puntata, sempre che qualcuno non vada più
avanti di me
Elio