conteggi consecutivi



  • conteggi consecutivi
    di Giorgum data: 12/07/2015 09:58:04

    Ciao a tutti, sto cercando di creare una funzione contatore condizionato. Avrei bisogno di una funzione che conta il numero di negativi consecutivi in un vettore, torna a zero appena trova un numero positivo e stabilisce il numero maggiore di consecutivi negativi. Allego file per chiarimenti
    chiedo aiuto grazie in anticipo



  • di Vecchio Frac data: 12/07/2015 11:01:25

    Questa cosa mi ricorda una vecchia discussione identica.
    Intanto fai una ricerca nello storico.





  • di ninai data: 12/07/2015 19:02:25

    ciao
    Anche io ho un ricordo ma, se ti interessa lo sviluppo dei negativi consecutivi:
    in C7:
    =SE(B7<0;C6+1;0)
    e trascini in basso
    per sapere il massimo delle ripetizioni di negativi, basta mettere in una cella: =MAX(C7:C47)

    se vuoi direttamente il massimo delle ripetizioni senza colonna di appoggio:
    =MAX(FREQUENZA(SE(B7:B47<0;RIF.RIGA(B7:B47));SE(B7:B47>=0;RIF.RIGA(B7:B47))))
    Matriciale (da confermare con CTRL+MAIUSCOLO+INVIO)



  • di cromagno data: 12/07/2015 19:18:06

    Ciao,
    probabilmente a te interessava risolvere con VBA, comunque ti propongo una soluzione con una colonna di appoggio (per esempio la colonna C)...
    Dalla cella C7 scriverai:
    =SE(B7>=0;0;C6+1)

    e poi copierai la C7 in giù fin dove serve (in questo caso fino alla C47).
    Nella cella D7 (dove vuoi il risultato) scriverai semplicemente:
    =MAX(C7:C47)

    Ti allego il tuo file con questa modifica...
    __________________________

    Pardon ninai,
    ho visto la tua risposta solo quando ho inviato la mia...



  • di Giorgum data: 12/07/2015 21:39:05

    Ciao, grazie per le risposte, in realtà si cercavo qualcosa con vba però questa soluzione mi è sicuramente d'aiuto.
    ho visto l'allegato cromagno, grazie. pensi che sia molto più complicato replicare le funzioni che hai utilizzato in vba automatizzando il tutto?



  • di Vecchio Frac data: 13/07/2015 00:09:24

    Secondo me una ricerca in storico non l'hai fatta.
    Ho trovato qualcosa di febbraio e l'ho adattato.
    Restituisce il maggior numero di elementi negativi consecutivi nel range dato.
    Si può migliorare ovviamente anche per adattarlo a un vettore qualsiasi e non a un range di Excel.
     
    Option Explicit
    
    Function count_sequences_of_negatives(r As Range) As Long
    Dim cell As Range, val_cell As Integer, tot As Long, maximum As Long
    
        For Each cell In r.Resize(r.Rows.Count - 1)
            val_cell = Val(cell)
            If val_cell < 0 Then
                tot = tot + 1
                If tot > maximum Then maximum = tot
            Else
                tot = 0
            End If
        Next
        
        count_sequences_of_negatives = maximum
        
    End Function






  • di Giorgum data: 13/07/2015 09:06:03

    grazie mille Vecchio Frac, funziona perfettamente, ho solo un dubbio riguardo a questa istruzione :
    "If tot > maximum Then maximum = tot "
    la funzione come trova maximum?




  • di Vecchio Frac data: 13/07/2015 09:30:17

    Una variante, con le regex, più carina da vedere e capire ^_^
     
    Option Explicit
    
    Function count_negative_sequences(r As Range) As Long
    Dim regexp As Object, s As String, matches As Object, match As Object
    Dim cnt As Integer, cnt_max As Integer
        
        Set regexp = CreateObject("VBScript.Regexp")
        
         With regexp
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = "(-d *)*"
        End With
        
        s = Join(Application.Transpose(r))
        If regexp.Test(s) Then
            Set matches = regexp.Execute(s)
            For Each match In matches
                If match <> "" Then
                    cnt = Len(match & " ")  3
                    If cnt > cnt_max Then cnt_max = cnt
                End If
            Next
        End If
        
        count_negative_sequences = cnt_max
    End Function






  • di Vecchio Frac data: 13/07/2015 09:33:42

    cit. "la funzione come trova maximum? "
    ---> Bè dipende sempre dal conteggio memorizzato in "tot":
    tot = tot + 1
    If tot > maximum Then maximum = tot

    Quando tot è più alto di maximum allora a questo ultimo viene assegnato il valore di tot. Se ciò non si verifica mai (tot è zero perchè non ci sono numeri negativi) allora maximum è inizializzato al suo valore di default, che è zero.

    Nella seconda versione, con la regex, il ragionamento è uguale solo che si fa sulla lunghezza dei gruppi (cnt è il conteggio dei gruppi che soddisfano la condizione data in pattern, cioè "trova gruppi di cifre precedute da segno meno e seguite eventualmente da spazio").