Excel Forum Per condividere esperienze su Microsoft Excel

Seleziona Area e calcola Ritardi

  • Messaggi
  • OFFLINE
    gattodimarmo1980
    Post: 150
    Registrato il: 03/10/2015
    Città: ALBAREDO PER SAN MARCO
    Età: 44
    Utente Junior
    2003
    00 20/05/2019 19:40
    Buona sera mi servirebbe una macro che mi calcola i ritardi.Inserisco i 90 numeri nelle colonne nominate "contatore",ho compilato le prime 5 righe manualmente.Come vedete dalla riga 6 l'anno è diverso ,si potrebbe inserire una userform che dice "Seleziona area";in questo esempio (le 5 righe evidenziate in rosso),una volta selezionate la
    macro mi riporta i valori nelle colonne nominate (ritarda).Il foglio sarà poi esteso fino alla riga 1.048.576.
    Accetto anche formule.Grazie anticipatamente Matteo
  • OFFLINE
    tanimon
    Post: 1.255
    Registrato il: 27/06/2011
    Utente Veteran
    excel 2007
    00 20/05/2019 21:51
    ciao a tutti [SM=x423028]

    ciao Matteo,
    lo ammetto: dal tuo file, non ho capito cosa vuoi fare!

    nel tuo esempio, i numeri che hai messo nelle colonne "ritarda",
    gli hai messi a capocchia, o hanno un citerio?

    quale se ce l'hanno?

    Con quale criterio le celle rosse dovrebbero essere riportate
    nelle colonne "ritarda"?

    Devono essere trasposte?

    Se sì, non sarebbe meglio fare entrambe le tabelle nello stesso
    verso ed evitare la trasposizione?
    (orizzontale-orizzontale o verticale-verticale)

    Spiega meglio ed allega un file con esempio a mano, ma reale.

    ciao
    Frank
    [Modificato da tanimon 20/05/2019 21:52]







    Stretta la foglia, larga la via, dite la vostra che ho detto la mia.
    Excel 2007 forse anche 2013 ... 2021 ... 365 e future...
  • OFFLINE
    GiuseppeMN
    Post: 3.384
    Registrato il: 03/04/2013
    Utente Master
    Excel 2000 - 2013
    00 20/05/2019 23:10
    Buona sera a tutti;
    a mio modesto parere il vero problema é:

    @gattodimarmo1980, scrive:

    ... Il foglio sarà poi esteso fino alla riga 1.048.576 ...



    Matteo, considera che dopo i 1.500 ÷ 2.000 Record, senza esitare, scelgo ACCESS; oltre questo limite i tempi di esecuzione sono una sofferenza.

    Voglio dire, utilizzare Excel con una tale mole di Dati sarebbe come pretendere di arare un campo con una Macchina di F1 o di partecipare ad un GP di F1 con ... un trattore.

    Ogni applicazione ha i propri limiti; è importante scegliere l'applicazione più idonea per gestire la quantità di Dati da valutare.

    Poi, ovviamente vedi tu come procedere.



    Buona serata.

    Giuseppe

    Windows XP - Excel 2000
    Windows 10 - Excel 2013
  • OFFLINE
    gattodimarmo1980
    Post: 150
    Registrato il: 03/10/2015
    Città: ALBAREDO PER SAN MARCO
    Età: 44
    Utente Junior
    2003
    00 21/05/2019 07:37
    Ciao Tanimon i numeri che ha messo nelle colonne "ritarda"hanno un criterio.Ciao Giuseppe va bene anche 1.500 ÷ 2.000 Record,riallego il foglio,ho compilato manualmente il contatore per tutti i numeri che ho nelle prime tre righe.Esempio ;Riga 2 il numero 42 manca da 1 estrazione perciò 1,il numero 11 manca da 1 estrazione perciò 1 il numero 80 manca da 1 estrazione perciò 1il numero 35 manca da 1 estrazione.Numero 63 valore 0 siccome è uscito nella riga 1.Riallego il foglio spero di essere stato chiaro ,va bene anche una formula.A disposione Matteo.Buona giornata
  • OFFLINE
    GiuseppeMN
    Post: 3.388
    Registrato il: 03/04/2013
    Utente Master
    Excel 2000 - 2013
    00 22/05/2019 07:31
    Buona giornata, Matteo;
    se hai dei numeri che si ripetono come ti comporti?

    Voglio dire in una ipotetica situazione del tipo riportata nell'immagine in allegato, considerando di analizzare solo il numeri 45 e 71, la risposta che ti aspetteresti è quella riportata in "Risultati attesi"?



    Buon Lavoro.

    Giuseppe

    Windows XP - Excel 2000
    Windows 10 - Excel 2013
  • OFFLINE
    by sal
    Post: 5.678
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    00 22/05/2019 08:05
    Ritardi
    Ciao Giuseppe, si tratta del Lotto, per ritardo e ce ne sono 2 indica da quante estrazioni non esce un numero da 1 a 90 e sarebbe quello "Ritardo attuale" cioè esempio il 15 non esce da 5 estrazioni, il "Ritardo storico" si intende qual'è stato il massimo ritardo dell'uscita del numero, cioè in 1000 estrazioni il massimo ritardo del numero 15 sarà stato 22 estrazioni che non è uscito.

    l'ho detto per farti capire il concetto, nella tua tabella il 71 ha un ritardo di 3 colpi, il 45 di 4 colpi(estrazioni), vedendo le date ordine decrescente

    mentre il ritardo storico sempre riferito alla tabella del 71 e di 4 colpi dal 17/1 al 27/1, mi sono fatto ingannare dalle date che sono in ordine decrescente, l'altra dal 13/1 al 17/1 e soltanto di 1 colpo.

    Ciao By Sal [SM=x423051]

    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
  • OFFLINE
    GiuseppeMN
    Post: 3.389
    Registrato il: 03/04/2013
    Utente Master
    Excel 2000 - 2013
    00 22/05/2019 08:38
    Buona giornata, Sal;
    grazie della tua attenzione.

    In realtà avevo provato ad analizzare i ritardi nelle varie Date, vedi immagine in allegato; mi auguravo non fosse quello che desiderava ottenere Matteo, già ci vuole una vita per analizzare i ritardi del valore dell'ultima estrazione rispetto alla penultima estrazione, poi, se si vogliono analizzare tutti i ritardi credo sia improponibile l'analisi.



    A disposizione.

    Giuseppe

    Windows XP - Excel 2000
    Windows 10 - Excel 2013
  • OFFLINE
    by sal
    Post: 5.679
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    00 22/05/2019 08:52
    Ritardi
    Ciao Giuseppe, non è cosi improponibile, in tutto sono 2 cicli for, visto che le estrazioni possono essere di 5 o più numeri dipende dal gioco tipo 10elotto che sono 20 numeri estratti ed ogni numero è presente 1 sola volta nell'estrazione.

    il primo ciclo di 90 numeri confronta nel secondo ciclo Estrazioni con un Conta.se se è presente il numero e passa alla successiva estrazione, alla fine delle estrazioni contando le uscite ed i ritardi si ha il risultato di quel numero e si passa al successivo numero fino a 90.

    vedo se riesco a trovare una macro per i ritardi

    Ciao By Sal [SM=x423051]



    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
  • OFFLINE
    GiuseppeMN
    Post: 3.390
    Registrato il: 03/04/2013
    Utente Master
    Excel 2000 - 2013
    00 22/05/2019 09:11
    Buona giornata, Sal;
    molto probabilmente mi sono "incartato io".
    Ho previsto più Cicli For Next che analizzano il numeo estratto con lo stesso numero estratto precedentemente ma non necessariamente nella stessa Colonna e, visti i tempi di elaborazione su 300 Record, ho preferito desistere; ripeto, molto probabilmente ho impostato il Codice VBA in modo errato.


    A disposizione.

    Giuseppe

    Windows XP - Excel 2000
    Windows 10 - Excel 2013
  • OFFLINE
    by sal
    Post: 5.680
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    00 22/05/2019 10:18
    Ritardi
    Ciao Giuseppe ecco la macro

    Sub RitardiSA()
    Dim Rs, Ra, r, c, rng, x, y, d, n
    
    Range("Z2:AA37").ClearContents
    For x = 1 To 36
        For y = 1 To Cells(Rows.Count, 1).End(xlUp).Row
            Set rng = Range(Cells(y, 3), Cells(y, 7))
            n = WorksheetFunction.CountIf(rng, x)
            If n >= 1 Then
                Ra = 0
            Else
                Ra = Ra + 1
            End If
            If Rs < Ra Then Rs = Ra
        Next y
        Cells(x + 1, 26) = Rs
        Cells(x + 1, 27) = Ra
        Ra = 0
        Rs = 0
    Next x
    End Sub


    questa è una vecchia macro ma per 36 numeri basta mettere 90 al posto di 36, è un altro tipo di lotteria a 36 numeri.

    come vedi esamina un estrazione alla volta con

    Set rng = Range(Cells(y, 3), Cells(y, 7))

    e sotto fa il conta.se, rs = ritardo storico, ra = ritardo attuale.

    Ciao By Sal [SM=x423051]

    [Modificato da by sal 22/05/2019 10:20]
    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
  • OFFLINE
    GiuseppeMN
    Post: 3.391
    Registrato il: 03/04/2013
    Utente Master
    Excel 2000 - 2013
    00 22/05/2019 12:11
    Buon pomeriggio, Sal;
    mi rendo conto che io e il lotto non abbiamo un buon rapporto.

    Mi auguro che Matteo possa apprezzare il tuo supporto; io non sarei mai stato in grado di pensare ad una soluzione analoga alla tua.




    A disposizione.

    Giuseppe

    Windows XP - Excel 2000
    Windows 10 - Excel 2013
  • OFFLINE
    gattodimarmo1980
    Post: 151
    Registrato il: 03/10/2015
    Città: ALBAREDO PER SAN MARCO
    Età: 44
    Utente Junior
    2003
    00 22/05/2019 23:09

    Ciao Giuseppe, ciao Sal vi ringrazio subito ma non ho risolto la discussione, per GiuseppeMn interessante il tuo quinto e settimo post
    "Risultati attesi"aprirò brevemente un altra discussione simile,la logica più o meno è quella dopo spiegherò il perchè non posso farlo ora.Per Sal allego il foglio con dati nuovi,ho ordinato le righe in modo crescente per le date,ho ordinato i numeri per ordine in modo crescente,ho modificato il range, ho eliminato il contatore ecc. ecc.
    ho modificato il codice da 36 a 90 ma quando digito la macro ho sbagliato sicuramente io qualcosa.Le macro non le so leggere come voi,sto imparando piano piano ci vogliono secoli per arrivare ai vostri livelli,potete correggermi l'errore.A disposizione Matteo
  • OFFLINE
    tanimon
    Post: 1.257
    Registrato il: 27/06/2011
    Utente Veteran
    excel 2007
    10 23/05/2019 00:44
    ciao a tutti [SM=x423028]

    ciao Sal, Giuseppe e Matteo,
    azz, sono arrivato tardi e Matteo ha cambiato la struttura del file.

    Credo che quello che cercasse con il suo file al post #4,
    sia nel file che allego.

    Di seguito la macro.
    Spero di non avere lasciato dei refusi.

    ciao
    Frank

    vb
    Option Explicit
    Sub ritardi()
    Dim rng_estrazione As Range, rng_tabellone As Range
    Dim rng_ritardi As Range, cella As Range, rng_risultati As Range
    
    Dim c_estrazione As Object, tabellone As Object
    Dim ritardo As Integer
    Dim ur As Long, c As Long, r As Long
     
    ur = Cells(Rows.Count, "d").End(xlUp).Row
    
    Set rng_tabellone = Uni0n(Range("i2:i21"), Range("k2:k21"), _
        Range("m2:m21"), Range("o2:o21"), Range("q2:q21"))
    Set rng_risultati = Uni0n(Range("j2:j21"), Range("l2:l21"), _
        Range("n2:n21"), Range("p2:p21"), Range("r2:r21"))
        
    Set rng_ritardi = Range("c2:h" & ur)
    Set rng_estrazione = Range("d1:h1")
    
    Application.ScreenUpdating = False
    
    rng_risultati.ClearContents
    
    For Each cella In rng_ritardi
        If IsNumeric(cella.Value) = False Then
        Else
            Set c_estrazione = rng_estrazione.Find(cella.Value, LookIn:=xlValues, lookat:=xlWhole)
            If Not c_estrazione Is Nothing Then
                ritardo = 0
            Else
                ritardo = cella.Row - 1
            End If
           
        
            Set tabellone = rng_tabellone.Find(cella.Value, LookIn:=xlValues, lookat:=xlWhole)
            r = tabellone.Row
            c = tabellone.Column
            If Cells(r, c + 1).Value <> "" Then
            Else
                Cells(r, c + 1).Value = ritardo
            End If
        End If
    Next cella
    Application.ScreenUpdating = True
    
    Set c_estrazione = Nothing
    Set tabellone = Nothing
    Set rng_ritardi = Nothing
    Set rng_estrazione = Nothing
    Set rng_tabellone = Nothing
    Set rng_risultati = Nothing
    End Sub
    
    
    
    [Modificato da tanimon 23/05/2019 01:14]







    Stretta la foglia, larga la via, dite la vostra che ho detto la mia.
    Excel 2007 forse anche 2013 ... 2021 ... 365 e future...
  • OFFLINE
    GiuseppeMN
    Post: 3.392
    Registrato il: 03/04/2013
    Utente Master
    Excel 2000 - 2013
    00 23/05/2019 07:30
    Buona giornata, a Tutti.

    Matteo, mi sembra che i risultati attesi siano quelli proposti da @tanimon; o mi sbaglio?

    Sal, ho provato a testare il tuo Codice VBA ma, sicuramente a causa dei miei limiti, non sono riuscito a comprendere la logica del risultato dell'elaborazione

    Frank, devo studiarmi il tuo Codice VBA, l'elaborazione mi sembra molto veloce e il risulato conforme a quello che mi sarei apettato; l'unica cosa, avrei preferito avere le "estrazioni" in ordine decrescente in modo da poter aggiungere le prossime estrazioni senza difficoltà, ma questo è solo un dettaglio.



    A disposizione.

    Giuseppe

    Windows XP - Excel 2000
    Windows 10 - Excel 2013
  • OFFLINE
    by sal
    Post: 5.681
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    10 23/05/2019 08:23
    Ritardi
    Ciao Matteo, ecco il file, per non farti scorrere tutto l'elenco dei 90 numeri li ho raggruppati per 10, all'elenco delle estrazioni puoi inserirne quante ne vuoi, ma ricorda che i dati vanno in ordine di data l'ultima è in basso, altrimenti devo far funzionare la macro al contrario, perche non porterebbe i dati corretti.

    Noti subito che i numeri dell'ultima estrazione come Rit.Attuale è 0zero.

    la freccia rossa pulisce e quella verde pulisce e ti da i risultati.

    Ciao Giuseppe, la logica per i ritardi è questa ed è quello che fa la macro.

    il primo ciclo la x prende da 1 a 90 questo è assodato
    il secondo ciclo scorre le estrazioni mette in un range tutti i 5 numeri per usare il Conta.se(), ora se il numero di x è presente nei 5 numeri, n diventa 1.
    La parte importante è proprio questa

            If n >= 1 Then
                Ra = 0
            Else
                Ra = Ra + 1
            End If
            If Rs < Ra Then Rs = Ra


    che dice se n>0 allora il numero è uscito e quindi il Ra=Ritardo attuale è uguale a 0zero se non è uscito allora Ra si incrementa di 1 fino a trovare una nuova uscita, scorrendo le estrazioni, quindi Ra torna a 0zero

    dopo endif ogni volta controlla se Rs=Ritardo storico e minore di Ra al primo passaggio quindi Ra che è a 0 prende 1 se è uscito il numero e cosi di seguito ammettendo che Ra sia superiore a Rs allora vuole dire che è aumentato il Ritardo storico e quindi Rs diventa Ra

    il prossimo passo scrive i ritardi nelle 2 celle.

    essendo pochi i dati la risposta è quasi immediata, ho l'archivio dal 1945 e sono circa 5800 estrazioni, ma ci sono archivi dalla fine dell'800

    quando l'archivio è grande, uso gli Array e faccio tutto il lavoro in memoria trascrivendo solo i risultati finali, il tempo in questo caso si riduce notevolmente.

    allego il file

    Ciao By Sal [SM=x423051]

    [Modificato da by sal 23/05/2019 08:28]
    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
  • OFFLINE
    GiuseppeMN
    Post: 3.394
    Registrato il: 03/04/2013
    Utente Master
    Excel 2000 - 2013
    00 23/05/2019 09:12
    Buona giornata, Sal.

    Grazie della tua spiegazione, adesso è più chiaro il risultato del tuo Codice VBA.

    Adesso devo solo studiare per bene il tuo Codice VBA.




    A disposizione.

    Giuseppe

    Windows XP - Excel 2000
    Windows 10 - Excel 2013
  • OFFLINE
    gattodimarmo1980
    Post: 152
    Registrato il: 03/10/2015
    Città: ALBAREDO PER SAN MARCO
    Età: 44
    Utente Junior
    2003
    10 23/05/2019 22:47
    Riscontro perfetto
    Ringrazio tre professionisti del Vba .Bellissimi tutte due i codici.
    La macro di Tanimon permette di mettere le righe sia in ordine crescente che decrescente ottenendo lo stesso risultato.Grazie buona serata
  • OFFLINE
    tanimon
    Post: 1.258
    Registrato il: 27/06/2011
    Utente Veteran
    excel 2007
    00 23/05/2019 23:22
    Re: Riscontro perfetto
    Ciao a tutti [SM=x423028]

    ciao Sal, Giuseppe e Matteo.


    Grazie del riscontro positivo ed alla prossima.

    Ciao
    Frank
    [Modificato da tanimon 23/05/2019 23:38]







    Stretta la foglia, larga la via, dite la vostra che ho detto la mia.
    Excel 2007 forse anche 2013 ... 2021 ... 365 e future...
  • OFFLINE
    GiuseppeMN
    Post: 3.395
    Registrato il: 03/04/2013
    Utente Master
    Excel 2000 - 2013
    00 24/05/2019 06:48
    Buona giornata a Tutti;

    @gattodimarmo1980

    ... La macro di Tanimon permette di mettere le righe sia in ordine crescente che decrescente ottenendo lo stesso risultato. ...


    Perdonami Matteo ma temo non sia proprio così; le ottime soluzioni proposte da Sal e Frank funzionano egregiamente con l'ordinamento delle date in forma decrescente; con l'ordinamento crescente credo proprio si debba pensare ad una soluzione diversa.

    Sinceramente non ho condotto test approfonditi, sai che il mio interesse per il lotto, in una scala da 1 a 100, è uguale a 0 (Zero).

    Solo per curiosità proverò a pensare ad un Codice VBA per la serie di date con ordinamento decrescente (dalla meno recente alla più recente che consentirebbe di aggiungere nuove estrazioni senza dover eseguire tutte le volte un nuovo ordinamento), non credo sia una cosa molto semplice.
    Voglio dire, nei Codice VBA proposti, mi sembra di capire che il Range di ricerca sia determinato da:

     Set Rng_ritardi = Range("C2:H" & Ur) 

    nel Codice VBA proposto da @tanimon oppure da:

     Set rng = Range(Cells(y, 4), Cells(y, 8)) 

    nel Codice VBA proposto da @by sal

    Nel Codice VBA a cui posso pensare la presenza di ogni numero estratto, partendo dall'ultima cinquina, escludendo i numeri già valutati, dovrà essere verificato con i numeri estratti nella cinquina precedente fino al riscontro della corrispondenza.

    Quindi, la verifica della corrispondenza dovrebbere essere esguita su;

     Range(Cells(w -1, 4), Cells(w -1, 8)) 

    dove "w" è un Ciclo definito da.

     For w = Ur - 1 To 1 Step -1 

    Questo ciclo andrebbe eseguito tante volte fino alla verifica di un riscontro valido; numero da valutare presente nella cinquina selezionata.
    Ovviamente il tempo di elaborazione si allungherebbe in modo esponenziale in funzione del numero di estrazioni da valutare.
    Magari ci sarà una verifica meno impegnativa in termini di tempo di elaborazione ma, in questo momento, mi sfugge.

    Magari mi sbaglio, ma questo è quanto ho ritenuto di dover partecipare a beneficio degli Utenti di Forum interessati a questa Discussione.



    A disposizione.

    Giuseppe

    Windows XP - Excel 2000
    Windows 10 - Excel 2013
  • OFFLINE
    by sal
    Post: 5.683
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    00 24/05/2019 07:23
    Ritardi
    Ciao a tutti, con le date invertite, bisogna solo invertire il secondo ciclo delle estrazioni come ha proposto Giuseppe qui

    For w = Ur To 1 Step -1


    ho tolto il "-1" dopo Ur in quanto deve considerare anche l'ultima riga delle estrazioni

    si potrebbe anche fare un automatismo che riconosca le date se sono in ordine crescente o decrescente del tipo

    if cells(1,1) > cells(2,1) then 
        For w = Ur To 1 Step -1
    else
        For w = 1 To Ur
    endif


    scritta al volo dovrebbe funzionare.

    Ciao By Sal [SM=x423051]

    [Modificato da by sal 24/05/2019 07:24]
    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
  • OFFLINE
    by sal
    Post: 5.684
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    10 24/05/2019 07:45
    Ritardi
    Ciao mi è venuto un dubbio sul codice proposto, ed infatti non funziona, in quanto si blocca su "Else", per cui si deve duplicare il secondo ciclo di ricerca sulle estrazioni, ecco la macro modificata funzionante in base alle 2 date iniziali, se la prima data è minore della seconda vuol dire che le date sono in ordine crescente altrimenti il contrario.

    Sub RitardiSA()
    Dim Rs, Ra, ur, r, c, rng, x, y, d, n
     
    Range("Ritardi").ClearContents
    r = 2: c = 27
    For x = 1 To 90
        If x = 41 Then
            x = x
        End If
        ur = Cells(Rows.Count, 4).End(xlUp).Row
        If Cells(1, 1) > Cells(2, 1) Then
            For y = ur To 1 Step -1
                Set rng = Range(Cells(y, 4), Cells(y, 8))
                n = WorksheetFunction.CountIf(rng, x)
                If n >= 1 Then
                    Ra = 0
                Else
                    Ra = Ra + 1
                End If
                If Rs < Ra Then Rs = Ra
            Next y
        Else
            For y = 1 To ur
                Set rng = Range(Cells(y, 4), Cells(y, 8))
                n = WorksheetFunction.CountIf(rng, x)
                If n >= 1 Then
                    Ra = 0
                Else
                    Ra = Ra + 1
                End If
                If Rs < Ra Then Rs = Ra
            Next y
        End If
        Cells(r, c) = Rs
        Cells(r + 1, c) = Ra
        c = c + 1
        If c = 37 Then r = r + 3: c = 27
        Ra = 0
        Rs = 0
    Next x
    End Sub


    Ciao By Sal [SM=x423051]

    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
  • OFFLINE
    tanimon
    Post: 1.259
    Registrato il: 27/06/2011
    Utente Veteran
    excel 2007
    00 24/05/2019 08:06
    ciao a tutti,

    ciao Sal, Giuseppe e Matteo.

    Concordo pienamente con Giuseppe:
    dalla riga 2 le estrazioni DEVONO essere riportate dalla data più
    recente alla meno recente, altrimenti il ritardo non sarà il più
    recente ma il più vecchio.


    Ciao
    Frank







    Stretta la foglia, larga la via, dite la vostra che ho detto la mia.
    Excel 2007 forse anche 2013 ... 2021 ... 365 e future...
  • OFFLINE
    GiuseppeMN
    Post: 3.398
    Registrato il: 03/04/2013
    Utente Master
    Excel 2000 - 2013
    00 24/05/2019 12:38
    Buona giornata a Tutti.

    Matteo, dopo aver preso buona nota dei Codici VBA forniti da @by sal e @tanimon, un saluto ad Entrambi, potresti dare uno sguardo al File in allegato.

    Alcune premesse; sono partito con il concetto di analizzare solo i numeri riportati nel Range A1:H14 ma non c'è un limite se non quello definito dal tempo di elaborazione.
    Voglio dire, per 14 estrazioni il Tempo di elaborazione direi che è accettabile; un paio di secondi.

    - il Codice VBA:

    Option Explicit
    
    Sub Ritardi()
    Application.ScreenUpdating = False
    Dim NDR As Range, Rng As Range
    Dim Ur As Long, x As Long, z As Long, RgP As Long, Rtd As Long, Est As Long
    Dim y As Byte, NRc As Byte
    
        Ur = Cells(Rows.Count, "D").End(xlUp).Row
            Range(Cells(2, 24), Cells(91, 24)).ClearContents
        RgP = Ur - 1
            For x = Ur To 2 Step -1
                For y = 4 To 8
                    Rtd = 0
                    NRc = Cells(x, y).Value
                    Set NDR = Cells(x, y)
                        For z = RgP To 1 Step -1
                            Set Rng = Range(Cells(z, 4), Cells(z, 8))
                        Est = WorksheetFunction.CountIf(Rng, NRc)
                            If Est = 0 Then
                                Rtd = Rtd + 1
                                    If z = 1 And Cells(NRc + 1, 24).Value = "" Then Cells(NRc + 1, 24).Value = "Oltre " & Rtd
                            Else
                                If Cells(NRc + 1, 24).Value = "" Then Cells(NRc + 1, 24).Value = Rtd
                                    Exit For
                            End If
                        Next z
                Next y
                    RgP = RgP - 1
            Next x
    Application.ScreenUpdating = True
    End Sub
    

    analizza tutte le estrazioni ordinate in modo decrescente, in Cella "A1" estrazione della Data meno recente, in Cella "A14 " estrazione della Data più recente.
    I numeri estratti sono 70 (5 x 14) ma i numeri univoci sono solo 41; è sui numeri univoci che ho strutturato il Codice VBA sopra riportato.

    Alcune precisazioni, per agevolare l'analisi di tutti i numeri estratti ho utilizzato la Funzione "Formattazione condizionale" legata alla corrispondenza con il Valore inserito in Cella "Z1"; una volta completati i Test potrà essere eliminata la "Formattazione condizionale" che richiede inutili risorse.

    Credo che aumentando in modo considerevole il numero delle "estrazioni" si potrebbero verificare seri problemi sui tempi di elaborazione, ma avendo tempo d'attendere ... 😏



    A disposizione.

    Giuseppe

    P.s. Vorrei ringraziare @by sal che ha proposto questa soluzione:

     Set Rng = Range(Cells(y, 4), Cells(y, 8))
                n = WorksheetFunction.CountIf(Rng, x)
    

    Soluzione molto intere che non avevo mai utilizzato.

    Windows XP - Excel 2000
    Windows 10 - Excel 2013
  • OFFLINE
    tanimon
    Post: 1.260
    Registrato il: 27/06/2011
    Utente Veteran
    excel 2007
    00 24/05/2019 21:04
    ciao a tutti [SM=x423028]
    ciao Sal Giuseppe e Matteo.

    riallego il file del post #13 al quale ho aggiunto il foglio2
    con le date dalla più vecchia alla più recente ed il range dell'ultima estrazione su questo foglio è l'ultima riga:

    si possono di conseguenza inserire le estrazioni in fondo al foglio
    ed è sicuramente più comodo.

    Ho creato una nuova macro fondamentalmente simile a quella per il Foglio1, ed ora il ritardo più recente si trova partendo dal basso.

    Con 2100 righe sul mio computer, impiega 2,17 secondi.
    Ecco la macro:

    vb
    Option Explicit
    Sub ritardi_date_crescenti()
    Dim rng_estrazione As Range, rng_tabellone As Range
    Dim rng_ritardi As Range, cella As Range, rng_risultati As Range
    
    Dim c_estrazione As Object, tabellone As Object
    Dim ritardo As Integer
    Dim ur As Long, c As Long, r As Long
    
    Sheets("Foglio2").Activate
    
    ur = Cells(Rows.Count, "d").End(xlUp).Row
    
    Set rng_tabellone = Uni0n(Range("i2:i21"), Range("k2:k21"), _
        Range("m2:m21"), Range("o2:o21"), Range("q2:q21"))
    Set rng_risultati = Uni0n(Range("j2:j21"), Range("l2:l21"), _
        Range("n2:n21"), Range("p2:p21"), Range("r2:r21"))
        
    Set rng_ritardi = Range("c1:h" & ur)
    Set rng_estrazione = Range("d" & ur & ":" & "h" & ur)
    
    Application.ScreenUpdating = False
    
    rng_risultati.ClearContents
    
    For Each cella In rng_ritardi
        If IsNumeric(cella.Value) = False Then
        Else
            Set c_estrazione = rng_estrazione.Find(cella.Value, LookIn:=xlValues, lookat:=xlWhole)
            If Not c_estrazione Is Nothing Then
                ritardo = 0
            Else
                ritardo = ur - cella.Row
            End If
           
        
            Set tabellone = rng_tabellone.Find(cella.Value, LookIn:=xlValues, lookat:=xlWhole)
            r = tabellone.Row
            c = tabellone.Column
            Cells(r, c + 1).Value = ritardo
            
        End If
    Next cella
    Application.ScreenUpdating = True
    
    Set c_estrazione = Nothing
    Set tabellone = Nothing
    Set rng_ritardi = Nothing
    Set rng_estrazione = Nothing
    Set rng_tabellone = Nothing
    Set rng_risultati = Nothing
    End Sub
    


    ciao
    Frank
    [Modificato da tanimon 24/05/2019 21:26]







    Stretta la foglia, larga la via, dite la vostra che ho detto la mia.
    Excel 2007 forse anche 2013 ... 2021 ... 365 e future...
  • OFFLINE
    tanimon
    Post: 1.261
    Registrato il: 27/06/2011
    Utente Veteran
    excel 2007
    00 25/05/2019 12:08
    sostituzione file
    ciao a tutti [SM=x423028]

    il file del post precedente non è quello corretto.

    riallego e ringrazio Giuseppe per la segnalazione


    ciao
    Frank

    edit:
    con l'occasione segnalo che la richiesta di Mattero da lui formulata
    al post #4 con relativo allegato,
    è CONCETTUALMENTE errata in quanto i ritardi devono essere calcolati per ogni singolo numero da 1 a 90,
    e NON su singolo numero delle estrazioni precedenti.

    Mi sono limitato a quanto da lui richiesto.
    [Modificato da tanimon 25/05/2019 13:01]







    Stretta la foglia, larga la via, dite la vostra che ho detto la mia.
    Excel 2007 forse anche 2013 ... 2021 ... 365 e future...
  • OFFLINE
    GiuseppeMN
    Post: 3.399
    Registrato il: 03/04/2013
    Utente Master
    Excel 2000 - 2013
    00 25/05/2019 17:56
    Buona sera a Tutti.
    per quanto mi riguarda vorrei concludere la mia partecipazione a questa Discussione con una considerazione.

    Dopo una lunga conversazione privata con @tanimon, mi sono convinto che la soluzione più logica sia quella dell'analisi di tutti i novanta numeri possibili, non solo quelli già estratti.

    Credo quindi che l'interpretazione di @by sal sia quella più corretta.

    Potrei facilmente adattare il Codice VBA che ho proposto a questa nuova interpretazione ma ritengo sia solo una perdita di tempo; @by sal ha già brillantemente risolto questo aspetto.

    Un grazie di cuore a Frank con il quale mi sono confrontato telefonicamente, Frank mi ha fatto capire quale sia il vero spirito dei "ritardi" che, ad un profano del lotto come il sottoscritto, era sfuggito.



    Buona serata e buon fine settimana a Tutti.

    Giuseppe

    Windows XP - Excel 2000
    Windows 10 - Excel 2013
  • OFFLINE
    gattodimarmo1980
    Post: 290
    Registrato il: 03/10/2015
    Città: ALBAREDO PER SAN MARCO
    Età: 44
    Utente Junior
    2003
    00 30/06/2020 17:52
    Buona sera ho inserito tutte le macro della discussione nel foglio e l'estrazione del 27/06/2020 come data selezionata.
    Facendo finta che io voglio analizzare questi 55 numeri cioè 11x55 tutte + RNz non avrei i dati corretti perchè le macro analizzano i ritardi dall 11°riga.Dovrei avere come Ritardo Attuale a 0 tutti i 55 numeri che vediamo .E'possibile modificare il codice?.E'possibile inoltre calcolarmi con una macro le Frequenze dei 90 numeri.Partendo dal numero 1 (AM2) finendo col numero 90 (AV18).Grazie Anticipatamente Matteo
  • OFFLINE
    gattodimarmo1980
    Post: 291
    Registrato il: 03/10/2015
    Città: ALBAREDO PER SAN MARCO
    Età: 44
    Utente Junior
    2003
    00 05/07/2020 12:12
    Buon Domenica allego ancora il Foglio solo con le due macro di SAl per non fare confusione,
    ho inserito le ultime due estrazioni, i risultati
    non sono corretti la macro è già lanciata per esempio per il numero 1 perchè ho ritardo attuale 2 il numero 1 è presente due volte dovrebbe avere ritardo attuale 0.Il ciclo non deve partire dall'ultima riga ma deve partire in questo caso dalla data del 4-7-2020 . Ciao Matteo e buona week end a tutti.



  • 15MediaObject5,00428 4