Riprendiamo...
1) Precisazione: nella function quando fa il calcolo nelle formule mie mancava: (1 conta.se per ogni numero) hai tenuto presente che se resto da ZERO "0" quello zero diventa 90
No, di questa storia del 90 non ne so niente.
Se vuoi che quel calcolo restituisca da 1 a 90 allora aggiungi questa riga in questa posizione
- Codice: Seleziona tutto
mycrit = (myAll.Cells(I - 1, J).Value + (my3.Cells(1, 1) * my3.Cells(1, 2)) + my3.Cells(1, 3)) Mod 90 'ESISTENTE
if mycrit = 0 then mycrit = 90 'AGGIUNGERE
2) se nel conteggio orizzontale (riga per riga) il risultato non tiene conto di: quante volte ha trovato AA1 quindi nella cella AA6 è questo che vorrei vedere; ho usato
la prima formula e mi da 665 a cosa si riferisce? mentre se uso la seconda mi da nulla.
La funzione conta riga per riga il risultato della formula che ho mimato e somma i risultati di tutte le righe dell'intervallo.
La formula che ho suggerito, =AZzz(C6:V150;X3:Z3), applicata sui dati del file pubblicato il giorno 3-8, mi da 650 (4, 2, 7 sono in X3:Z3, non so se corrisponde ancora al valore originale).
650 e' il risultato del calcolo fatto su Riga6 con riferimento ai dati in Riga5, poi su Riga7 con riferimento ai dati in Riga6, poi su Riga8 con riferimento ai dati in Riga7, etc etc
Risultati piu' articolati li devi calcolare tu.
Ora pero' mi viene il dubbio che la somma debba essere fatta gia' avendo confrontato il risultato riga per riga al valore in AA1; cioe' contare solo le volte che nella riga il risultato e' pari ad AA1.
Se e' cosi' allora la function doverebbe essere modificata in
- Codice: Seleziona tutto
Function BZzz(ByRef myAll As Range, ByRef my3 As Range, ByVal myComp As Long) As Long
'Vedi http://www.pc-facile.com/forum/viewtopic.php?f=26&t=105141
Dim I As Long, J As Long, myTot As Long
'
For I = 1 To myAll.Rows.Count
For J = 1 To myAll.Columns.Count
mycrit = (myAll.Cells(I - 1, J).Value + (my3.Cells(1, 1) * my3.Cells(1, 2)) + my3.Cells(1, 3)) Mod 90
If mycrit = 0 Then mycrit = 90
myTot = myTot + Application.WorksheetFunction.CountIf( _
Application.WorksheetFunction.Index(myAll, I, 0), mycrit)
Next J
If myTot = myComp Then BZzz = BZzz + 1
myTot = 0
Next I
End Function
(questo codice tiene gia' conto del discorso che 0=90)
Poi userai la formula
- Codice: Seleziona tutto
=BZzz($C6:$V150;$X3:$Z3;AA1)
Da copiare poi in orizzontale
3)i dati di x3:z3 portarli a partie da X6:Z6
Questo lo fai da solo, basta che nella formula usi le coordinate giuste (nella formula che ti ho dato sono ancora $X3:$Z3).
Non capisco pero' quel "
a parti[re]e da X6:Z6", perche per me si tratta di 3 celle 3, che stanno a un indirizzo preciso, non "a partire" da un indirizzo.
3)Bis- per spiegarmi- la formula che la function fa funzionare (per spiegarmi cosa fa-anche perchè se la formula rimane in AA6 che senso avrebbe) la parte che controlla
l'archivio diventa $c$6:$v$150.. perchè questa sarà trascinata in basso e cmq a DX per avere i risultati dei numero/punti in rigo 1
Da quel che ho capito finora la formula non andra' copiata verso il basso; comunque andra' copiata verso destra, per cui nella nuova formula ho messo i $ che servono per la copia verso destra.
4) gli operatori dovrebbero essere e considerati in X1=+; y1=*; Z1=+, questo perchè in seguito posso scambiarli di posizione sempre in x-y-z.
La function si aspetta che queste tre informazioni siano in tre celle adiacenti in orizzontale, di cui il primo valore sara' moltiplicato per il secondo e poi sommato col terzo (prima di essere elaborato come "modulo 90"); l'indirizzo di questo intervallo lo inserirai tu nella formula (nella formula che ti ho dato sono in $X3:$Z3)
Spero che sia piu' chiaro...
Ciao