Moderatori: Anthony47, Flash30005
=SOMMA(SE(C6:C105<>"";SE(C6:C105=C7:C106;1)+SE(C6:C105=D7:D106;1)))
Function GioZzz(ByRef myBlock As Range, ByRef myNums As Range, ByRef TriNum As Range, ByRef myZZZ As Range) As Long
Dim ANums, ATri, vZZZ As Long
Dim I As Long, CCheck As Long, myCnt As Long
ANums = myNums.Value
ATri = TriNum.Value
vZZZ = myZZZ.Value
'
For I = 1 To myNums.Count
CCheck = (ANums(1, I) + ATri(1, 1) * ATri(1, 2) + ATri(1, 3)) Mod 90
If CCheck = 0 Then CCheck = 90
If Application.WorksheetFunction.CountIf(myBlock, CCheck) > 0 Then
myCnt = myCnt + 1
End If
Next I
If myCnt = vZZZ Then GioZzz = 1
End Function
=GioZzz($C6:$V6;$C5:$V5;$X$3:$Z$3;AA$1)
wallace&gromit ha scritto:Sarà il caldo o l'aria di mare
ma in questo quesito
non ho ancora capito
cosa viene richiesto di fare
se un'idea verrà in mente
qui di nuovo sarò
e non mancherò
d'intervenir nuovamente
agosto 2015, Anthony47, Moderatore e poeta
![]()
![]()
2)-nella cella aa6 scrivo 20 conta.se es del 1° e 2° numero e quindi per 20 volte
=conta.se($c7:v7;c6)+conta.se($c7:v7;d6....+conta.se($c7:$v7;v6);
3)-trascino la formula AA6 in giù tanto le righe dell'archivio e alla fine
conterò nella colonna i vari punti;
4)-ritorno in aa6 e aggiungo alla formula in totale dei 20 conta.se
se((...)=aa1;"").
=SE(SOMMA(CONTA.SE($C6:$V6;$C5:$V5))=$AA$1;1;"")
Diciamo che e' stato fatto un passo avanti, probabilmente. Avendo nuovamente tirato in ballo i valori da sommare e moltiplicare devo immaginare che i punti 1, 2, 3 e 4 che avevi fatto ieri pomeriggio non sono quelli reali, quindi nella formula non ci sono 20 "conta.se($C7:V7;Cx)" ma 20 "conta.se($c7:v7;ValoreCalcolatoVoltaPerVolta)".Ok un dato è certo che sono riuscito a farmi capire che
nella cella aa6 vorrei sapere tutto il risultato della colonna
(145) senza aver trascinato la formula in giù.
=SE(CONTA.SE($C6:$V6;(RESTO(SOMMA($C5)+$X$3*$Y$3+$Z$3;90)))+CONTA.SE($C6:$V6;(RESTO(SOMMA($D5)+$X$3*$Y$3+$Z$3;90)))+EtcEtc+EtcEtc+ + + ...+CONTA.SE($C6:$V6;(RESTO(SOMMA($V5)+$X$3*$Y$3+$Z$3;90))))=$AA$1;1;"")
Function AZzz(ByRef myAll As Range, ByRef my3 As Range) 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
myTot = myTot + Application.WorksheetFunction.CountIf( _
Application.WorksheetFunction.Index(myAll, I, 0), mycrit)
Next J
Next I
AZzz = myTot
End Function
=AZzz(C6:V150;X3:Z3)
=SE(AZzz(C6:V150;X3:Z3)=AA$1;1;"")
Anthony47 ha scritto:Prendero' per buona la formula inserita nel file che avevi pubblicato:=SE(CONTA.SE($C6:$V6;(RESTO(SOMMA($C5)+$X$3*$Y$3+$Z$3;90)))+CONTA.SE($C6:$V6;(RESTO(SOMMA($D5)+$X$3*$Y$3+$Z$3;90)))+EtcEtc+EtcEtc+ + + ...+CONTA.SE($C6:$V6;(RESTO(SOMMA($V5)+$X$3*$Y$3+$Z$3;90))))=$AA$1;1;"")
Alla userfunction sara' passato il riferimento all'intervallo dati (C6:V150, nel file pubblicato); il riferimento ai tre valori adiacenti che saranno usati nel calcolo di ValoreCalcolatoVoltaPerVolta (X3-Y3-Z3 nel file pubblicato). La userfunction non confrontera' il risultato con una valore prefissato (AA1 nell'esempio), ma restituira' il conteggio complessivo per consentire il debug del calcolo: sara' la tua formula che confronta il conteggio col valore che preferisci e restituire il risultato cercato
Se vuoi ottenere risultati piu' articolati utilizzerai questo risultato nell'ambito di una formula piu' complessa; es
- Codice: Seleziona tutto
=SE(AZzz(C6:V150;X3:Z3)=AA$1;1;"")
NB: e' solo un esempio, non so se questa formula ti servira' ancora
NB2: se devi usare formule piu' complesse, cerca di inserire il conteggio ottenuto con AZzz in una cella e poi utilizza questo valore per le formule piu' complesse: la function impiega 1-2 decimi di sec per completarsi, eseguirla decine o centinaia di volte risultera' sempre piu' rallentante.
No, di questa storia del 90 non ne so niente.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
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
La funzione conta riga per riga il risultato della formula che ho mimato e somma i risultati di tutte le righe dell'intervallo.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.
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
=BZzz($C6:$V150;$X3:$Z3;AA1)
Questo lo fai da solo, basta che nella formula usi le coordinate giuste (nella formula che ti ho dato sono ancora $X3:$Z3).3)i dati di x3:z3 portarli a partie da X6:Z6
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.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
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)4) gli operatori dovrebbero essere e considerati in X1=+; y1=*; Z1=+, questo perchè in seguito posso scambiarli di posizione sempre in x-y-z.
Mi spiace, ma secondo me sbagli i calcoli; infatti il calcolo (Col C)+(Col X * Col Y)+ (Col Z) sulle prime tre righe fa rispettivamente 5, 4 e 3, non 5-5-5; come visibile nelle celle con sfondo giallo:succede che molte formule fatto il calcolo come dimostrato
in Colonna AF6-7-8 danno lo stesso esito cioè 5 molte formule
danno 4 ecc ecc.;
Non l'ho capita, ma forse (per quanto detto al punto precedente) non e' nemmeno necessario.DOMANDA si può avere UNA macro che mi scriva la prima formula
come rappresentativa di tutte le altre che danno lo stesso risultato?
Per i conteggi, ogni colonna ha i numeri da 1 a 90
Eventualmente si può fare i dati da trascriverli in un foglio a parte
Piu' o meno come al solito?Spero e prego che la spiegazione sia chiara e limpida
Torna a Applicazioni Office Windows
Inserimento parziale valore cella in MessageBox Autore: Ricky0185 |
Forum: Applicazioni Office Windows Risposte: 6 |
Aggiornare cella con somma quando aggiungo nuova colonna Autore: marcopont |
Forum: Applicazioni Office Windows Risposte: 1 |
Aumenta altezza riga in base valore cella Autore: trittico69 |
Forum: Applicazioni Office Windows Risposte: 47 |
Visitano il forum: Nessuno e 34 ospiti