Ciao,
per risolvere il tuo problema mi vengono in mente tre soluzioni, due con formule e una con VBA, ma ce ne sono sicuramente delle altre.
La prima (esempio giallo) fa tutto con un'unica formula, piuttosto macchinosa ma efficace:
codice:
=INDICE($A$1:$R$4;1;SE(E(B2=1;SOMMA($B2:B2)=1);CELLA("col";B2);0) + SE(E(C2=1;SOMMA($B2:C2)=1);CELLA("col";C2);0) + SE(E(D2=1;SOMMA($B2: D2)=1);CELLA("col";D2);0)+ SE(E(E2=1;SOMMA($B2:E2)=1);CELLA("col";E2);0) + SE(E(F2=1;SOMMA($B2:F2)=1);CELLA("col";F2);0) + SE(E(G2=1;SOMMA($B2:G2)=1);CELLA("col";G2);0) + SE(E(H2=1;SOMMA($B2:H2)=1);CELLA("col";H2);0) + SE(E(I2=1;SOMMA($B2:I2)=1);CELLA("col";I2);0) + SE(E(J2=1;SOMMA($B2:J2)=1);CELLA("col";J2);0) + SE(E(K2=1;SOMMA($B2:K2)=1);CELLA("col";K2);0) + SE(E(L2=1;SOMMA($B2:L2)=1);CELLA("col";L2);0) + SE(E(M2=1;SOMMA($B2:M2)=1);CELLA("col";M2);0) + SE(E(N2=1;SOMMA($B2:N2)=1);CELLA("col";N2);0) + SE(E(O2=1;SOMMA($B2:O2)=1);CELLA("col";O2);0) + SE(E(P2=1;SOMMA($B2:P2)=1);CELLA("col";P2);0) + SE(E(Q2=1;SOMMA($B2:Q2)=1);CELLA("col";Q2);0) + SE(E(R2=1;SOMMA($B2:R2)=1);CELLA("col";R2);0))
questa formula riconosce il primo valore 1 verificando che:
- il valore dela cella in esame sia 1
- la somma di tutte le celle, dalla prima fino a quella in esame, sia 1
Solo la cella che ha entrambe queste caratteristiche (funzione E() ) permette al corrispondente SE di aggiungere il valore della sua colonna alla somma generale, tutte le altre celle aggiungeranno zero, quindi alla fine, la somma coinciderà col numero di colonna del primo 1.
A quel punto la funzione INDICE preleva il valore della cella con riga=1 e colonna indicata dalla somma.
Per il valore massimo la formula è analoga ma la somma viene fatta dalla cella in esame alla fine:
codice:
=INDICE($A$1:$R$4;1;SE(E(B2=1;SOMMA(B2:$R2)=1);CELLA("col";B2);0) + SE(E(C2=1;SOMMA(C2:$R2)=1);CELLA("col";C2);0) + SE(E(D2=1;SOMMA(D2:$R2)=1);CELLA("col";D2);0)+ SE(E(E2=1;SOMMA(E2:$R2)=1);CELLA("col";E2);0) + SE(E(F2=1;SOMMA(F2:$R2)=1);CELLA("col";F2);0) + SE(E(G2=1;SOMMA(G2:$R2)=1);CELLA("col";G2);0) + SE(E(H2=1;SOMMA(H2:$R2)=1);CELLA("col";H2);0) + SE(E(I2=1;SOMMA(I2:$R2)=1);CELLA("col";I2);0) + SE(E(J2=1;SOMMA(J2:$R2)=1);CELLA("col";J2);0) + SE(E(K2=1;SOMMA(K2:$R2)=1);CELLA("col";K2);0) + SE(E(L2=1;SOMMA(L2:$R2)=1);CELLA("col";L2);0) + SE(E(M2=1;SOMMA(M2:$R2)=1);CELLA("col";M2);0) + SE(E(N2=1;SOMMA(N2:$R2)=1);CELLA("col";N2);0) + SE(E(O2=1;SOMMA(O2:$R2)=1);CELLA("col";O2);0) + SE(E(P2=1;SOMMA(P2:$R2)=1);CELLA("col";P2);0) + SE(E(Q2=1;SOMMA(Q2:$R2)=1);CELLA("col";Q2);0) + SE(E(R2=1;SOMMA($R2:R2)=1);CELLA("col";R2);0))
Un'altra soluzione, sempre con formule, richiede di inserire delle righe di servizio fra una riga e l'altra di quelle esistenti.
Nell'esempio le righe di servizio le ho colorate di verde e poi ho nascosto quella relativa a Marco riducendone a zero l'altezza per farti vedere l'effetto che fa: la riga c'è ma non si vede e l'unica cosa che si nota è il salto di numerazione.
Aggiungere queste righe semplifica molto le formule da usare perché basta inserire nella cella B12 questa formula
codice:
=SE(B11=1;B$10;"")
poi copia/incollare la cella B12 in tutte le celle delle righe di servizio e infine inserire nelle colonne Primo e Ultimo queste formule:
codice:
=MIN(B12:R12)
=MAX(B12:R12)
Rispetto alla prima soluzione questa ha il vantaggio di utilizzare formule molto più semplici e, soprattutto, non richiede di costruire pazientemente tutta la somma iniziale.
E poi c'è la soluzione VBA che è quasi banale:
codice:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("b2:r4")) Is Nothing Then
For i = 2 To 18
If Cells(Target.Row, i) = 1 Then
Cells(Target.Row, 20) = Cells(1, i)
Exit For
End If
Next
For i = 18 To 2 Step -1
If Cells(Target.Row, i) = 1 Then
Cells(Target.Row, 21) = Cells(1, i)
Exit For
End If
Next
End If
End Sub
Al variare di uno dei valori della tabellina di zeri/uno (Range("b2:r4")) esamina la riga corrispondente in un senso e nell'altro (i valori 2 e 18 corrispondono alla colonna B e alla colonna R) e, al primo 1 incontrato riporta il valore della prima riga nelle caselle alla colonna 20 e 21 (Primo e Ultimo).
I valori fissi 2, 18, 20 e 21 possono essere sostituiti assegnando dei nomi alle colonne e usando quelli.
Vedi se una di queste soluzioni può andarti bene.
Ciao