PDA

Visualizza Versione Completa : Calcolo ripetizioni massime - Excel



Stefansen
06-05-19, 14:42
Ho un foglio con colonna A una serie di nomi in frequenza del tipo:
Pippo, Pluto, Gianni, Pippo, Pippo, Pippo, Gianni, Pluto

Mi serve da calcolare la ripetizione massima di Pippo (in questo caso 3). L'ho fatto in maniera indiretta: nella colonna B mi mette 1 se cella affianco è Pippo + somma di quella superiore e così, altrimenti 0 e riparte il calcolo quando ritrova Pippo, poi valore massimo.
Mi chiedevo c'è un modo meno grezzo di farlo?

Inoltre un foglio Excel risulta meno pesante se progettato nel modo:
>A2=F(A1)
>A3=F(A2)
oppure
>A3=F(F(A1))
dove A1 è la cella e F la funzione
ovvero è più leggero se metto una singola funzione in una cella e poi il rimando ad un altra e così via oppure se le metto tutte direttamente sulla stessa cella?

1/Zero
06-05-19, 14:49
Sì, c'è un modo più rapido.

Zuma
06-05-19, 14:52
Sì, c'è un modo più rapido.

ed è anche meno "grezzo" :sisi:

Stefansen
06-05-19, 15:08
Se c'è è probabilmente una funzione che "di nascosto" fa sostanzialmente quel che ho fatto Io dandoti esplicitamente il risultato

KymyA
06-05-19, 15:11
Senti, come già detto io risolvo tutto con il VB... se vuoi ti faccio il foglio excel con la funzione o te la copio qui.
Cosa vuoi che faccia? Metto su una funzione che deve fare cosa in base a che parametri?

Tipo :

Stefansen(RangeCelle;stringa)

quindi nel tuo caso per sapere la ripetizione max di "Pippo" nella colonna B dovresti inserire in una cella :
=Stefansen(B1:B999;"Pippo")

KymyA
06-05-19, 15:22
Function Stefansen(ByVal sCol As String, ByVal iInizio As Integer, ByVal iFine As Integer, _
ByVal sTesto As String) As Integer

' Cerca nella colonna sCol il massimo di ripetizioni
Dim iRow As Integer, iMax As Integer, iConteggio As Integer
Dim bCheck As Boolean
Dim sCella As String

iRow = iInizio

Do
sCella = Trim(Range(sCol & Trim(iRow)))

If sCella = "" Then

Exit Do

End If

If sCella = sTesto Then
If bCheck = False Then
bCheck = True
iMax = 1
Else
iMax = iMax + 1
End If
Else
If bCheck = True Then
bCheck = False
If iMax > iConteggio Then
iConteggio = iMax
End If
End If
End If

iRow = iRow + 1

If iRow > iFine Then
Exit Do
End If

Loop

Stefansen = iConteggio

End Function

Fruttolo
06-05-19, 15:45
La ripetizione di pippo è pippe

Stefansen
06-05-19, 15:48
Function Stefansen(ByVal sCol As String, ByVal iInizio As Integer, ByVal iFine As Integer, _
ByVal sTesto As String) As Integer

' Cerca nella colonna sCol il massimo di ripetizioni
Dim iRow As Integer, iMax As Integer, iConteggio As Integer
Dim bCheck As Boolean
Dim sCella As String

iRow = iInizio

Do
sCella = Trim(Range(sCol & Trim(iRow)))

If sCella = "" Then

Exit Do

End If

If sCella = sTesto Then
If bCheck = False Then
bCheck = True
iMax = 1
Else
iMax = iMax + 1
End If
Else
If bCheck = True Then
bCheck = False
If iMax > iConteggio Then
iConteggio = iMax
End If
End If
End If

iRow = iRow + 1

If iRow > iFine Then
Exit Do
End If

Loop

Stefansen = iConteggio

End Function



Grazie, proverò a vederci qualcosa anche se in genere preferisco non usare il VBA

shen_long
06-05-19, 15:52
Mi serve da calcolare la ripetizione massima di Pippo (in questo caso 3). L'ho fatto in maniera indiretta: nella colonna B mi mette 1 se cella affianco è Pippo + somma di quella superiore e così, altrimenti 0 e riparte il calcolo quando ritrova Pippo, poi valore massimo.
Mi chiedevo c'è un modo meno grezzo di farlo?
Dipende, se sei uno studente universitario e hai tempo da perdere sicuramente c'è un modo meno grezzo e sicuramente più corretto.
Se usi excel come aiuto per il lavoro che fai, e vuoi risolvere la cosa senza perdere tempo in minchiate, il metodo da te usato è quello giusto.

KymyA
06-05-19, 16:02
Grazie, proverò a vederci qualcosa anche se in genere preferisco non usare il VBA

L'ho scritta in due secondi, senza troppi controlli. Ad esempio bisognerebbe controllare che iInizio sia minore di iFine...

Io ho riempito la colonna A (da A1 ad A30) di nomi, poi nella cella B1 ho inserito :


=Stefansen("A";1;30;"Pippo")

e mi è uscito nella cella il valore 3 che effettivamente era il massimo di ripetizioni...

Ciome
06-05-19, 16:26
Ho un foglio con colonna A una serie di nomi in frequenza del tipo:
Pippo, Pluto, Gianni, Pippo, Pippo, Pippo, Gianni, Pluto

Mi serve da calcolare la ripetizione massima di Pippo (in questo caso 3). L'ho fatto in maniera indiretta: nella colonna B mi mette 1 se cella affianco è Pippo + somma di quella superiore e così, altrimenti 0 e riparte il calcolo quando ritrova Pippo, poi valore massimo.
Mi chiedevo c'è un modo meno grezzo di farlo?

Inoltre un foglio Excel risulta meno pesante se progettato nel modo:
>A2=F(A1)
>A3=F(A2)
oppure
>A3=F(F(A1))
dove A1 è la cella e F la funzione
ovvero è più leggero se metto una singola funzione in una cella e poi il rimando ad un altra e così via oppure se le metto tutte direttamente sulla stessa cella?

togli tutto il puttanaio e metti

=CONTA.SE(intervallo; "pippo")

manuè
06-05-19, 16:28
La ripetizione di pippo è pippe

ma minni ha le minne?

Stefansen
06-05-19, 16:43
togli tutto il puttanaio e metti

=CONTA.SE(intervallo; "pippo")

Eh?
Conta.se mi conta il numero dei "Pippo" presenti nell'intervallo non il numero massimo di Pippo successivi

KymyA
06-05-19, 16:43
togli tutto il puttanaio e metti

=CONTA.SE(intervallo; "pippo")

Dimostri di non aver capito una sega.
Non vuole il conteggio, ma il numero massimo di ripetizioni di una stringa in una colonna


A
B
B
A
C
A
B
B
A
B
B
B
C
C
B

Per B vale 3

Stefansen
06-05-19, 16:50
Comunque ho usato questa formula, dove sulla colonna A ho la lista di nomi:
Bi=se(e(Ai="Pippo",Bi-1<>0),1+Bi-1,se(e(Ai="Pippo",Bi-1=0),1,0)
e sembra funzionare

Bi-1 è la cella sopra a quella riferita per la formula

Poi trovo il valore max nella colonna B che corrisponde alla ripetizione massima di Pippo

Ciome
06-05-19, 17:05
continuo a non capire. stefansen spiegami. tu hai l'elenco. conta i pippo. la tua formula che segna 1 e somma al valore precedente è una conta.

cosa deve fare tutto sto ambaradan se arriva a tre pippo? e cosa deve fare se non arriva a tre pippo?



Bi=se(e(Ai="Pippo",Bi-1<>0),1+Bi-1,se(e(Ai="Pippo",Bi-1=0),1,0)

sta roba fa...
"se la cella a fianco è pippo e la cella sopra è diversa da zero, prendi il valore della cella sopra e sommaci 1,
altrimenti, se a fianco abbiamo pippo ma sopra abbiamo zero, restituisci 1.
se nessuno dei due casi, restituisci zero".

e quindi poi la formula che lavora con le celle di b cosa fa? per capire cosa ti serve

Stefansen
06-05-19, 17:12
continuo a non capire. stefansen spiegami. tu hai l'elenco. conta i pippo. la tua formula che segna 1 e somma al valore precedente è una conta.

cosa deve fare tutto sto ambaradan se arriva a tre pippo? e cosa deve fare se non arriva a tre pippo?

Se cella A5=Pippo >>> B5=Pippo+valore(B4) se B4 diverso da 0 (ovvero A4=Pippo) altrimenti B5=1 (ricomincia l'iter)

Quindi hai
Pluto 0
Pippo 1
Pippo 2
Pippo 3
Pluto 0
Pippo 1

ti calcoli il valore massimo della colonna B è hai la sequenza più lunga di Pippo registrata

Ciome
06-05-19, 17:13
ahhhh la sequenza più lunga. ok. ci penso e ti dico

una veloce googlata: https://stackoverflow.com/questions/30633434/how-to-find-largest-sequence-of-a-given-number-in-excel

assomiglia molto alla tua idea, ma il secondo messaggio sotto propone anche una versione con due sole formule senza una colonna di supporto.

KymyA
06-05-19, 17:59
visto che con il VB è tutto più veloce? 5 minuti...

Voialtri sarà che la soluzione è più "elegante", ma state ancora analizzando il problema. io -TAC- soluzione. Peraltro parametrica e riciclabile anche in altre funzioni/fogli

shen_long
06-05-19, 22:03
visto che con il VB è tutto più veloce? 5 minuti...

Voialtri sarà che la soluzione è più "elegante", ma state ancora analizzando il problema. io -TAC- soluzione. Peraltro parametrica e riciclabile anche in altre funzioni/fogliMa non è vero, la soluzione migliore è quella del primo post. Zero sbatti, due formule in dieci secondi.

Quella di VB sicuro è più elegante e immagino che faccia più colpo ai party, ma quando lavori "basta che funzioni" :asd: