È soltanto un Pokémon con le armi o è un qualcosa di più? Vieni a parlarne su Award & Oscar!

Excel Forum Per condividere esperienze su Microsoft Excel

[RISOLTO] Velocizzare elaborazione VBA

  • Messaggi
  • ONLINE
    L2018
    Post: 1.330
    Registrato il: 02/04/2018
    Città: PESCARA
    Età: 75
    Utente Veteran
    EXCEL 2016 - SPREAD32
    00 07/04/2024 12:29
    Ciao a tutti
    la famosa discussione "Velocizzare Elaborazione VBA" del 20 marzo l'abbiamo considerata RISOLTA su richiesta di Marius, ma sappiamo bene che la ricerca non ha limiti, ed allora mi sono preso la briga di fare una verifica, di cui pubblico la foto.
    Ho semplicemente conteggiato tutte le combinazioni dell' Enalotto, senza scriverle nè costruirle in RAM
    Sembra che il metodo più veloce sia quello dei cicli FOR, seguito dal metodo ricorsivo, e infine da quello iterativo.
    Il metodo FOR è molto veloce perchè si sa a priori quanti devono essere i cicli, e quindi non è modificabile al volo.
    Gli altri 2 metodi invece possono scegliere al momento il SET di numeri da elaborare e il K (combinazioni).
    Ricordo che le combinazioni si calcolano con la formula =combinazione(set;classe), cioè combinazione(90;6) per l'Enalotto, mentre
    per il totocalcio le "combinazioni" che in realtà si chiamano Disposizioni con Ripetizione, sono uguali a 3 elevato il numero partite.
    Poi mi è venuto in mente che ho un altro algoritmo, il quale però puo' agire solo con ragionamento "ternario" per elaborare le colonne del vecchio Totocalcio.
    Ternario perchè essendo 3 i simboli del Totocalcio si puo' usare questo fatto per un algoritmo diverso da quello delle combinazioni.
    Ora non vi annoio con altre spiegazioni, ma mi limito a invitare Marius44 ( in questo caso posso citarlo ) ad usare il file che allego, che sviluppa qualsiasi sistema Totocalcio, e ad aggiungere con la sua pazienza quel trucco del DEPOS, che io non ricordo bene, che è in grado poi di scrivere le combinazioni tutte in un sol colpo.
    L'algoritmo puo' (e dovrebbe) rimanere intatto, bisogna solo portare successivamente le combinazioni in DEPOS (vedi Anthony47).
    Marius ricorderà certo il DEPOS. ma tutti possono divertirsi con questo rompicapo domenicale.
    La prova DEPOS l'ho fatta ma mi sono intrecciato poichè in questi giorni non ho calma e pazienza.


    EDIT
    in realtà mi sono accorto che la costruzione delle combinazioni non mette le stesse in RAM ma le scrive direttamente
    il tempo trovato non fa fede, non è quello che impiegherebbe se si costruisse l'Array senza scriverlo
    Quindi il buon Marius, se ha voglia, dovrebbe separatamente PRIMA costruire l'archivio e POI usare il DEPOS.
    Se ce la faccio nel frattempo ci provo io, ma dovevo questa segnalazione
    Scusate

    A DIR LA VERTA' HO PROPOSTO UNA BOIATA CHE RICHIEDE TROPPO TEMPO. ABBANDONIAMO
    [Modificato da L2018 07/04/2024 21:09]

    LEO
    https://t.me/LordBrum
  • OFFLINE
    Marius44
    Post: 1.245
    Registrato il: 24/06/2015
    Città: CATANIA
    Età: 80
    Utente Veteran
    Excel2019
    00 13/04/2024 19:41
    Ciao Leo
    come t'ho detto sono stato impegnato e non ho avuto tempo per "guardare" la tua macro
    Te la rimando (ho evidenziato le variazioni apportate)
    Option Explicit
    Sub pan()
    'Algoritmo alternativo per l'enumerazione di combinazioni, che nel caso del Totocalcio si chiamano Disposizioni con Ripetizione: 3^partite
    Dim a As Long, b As Long, c As Long, i As Long, j As Long, k As Long, p As Long, q As Long, r As Long
    Dim st(2) As String, se(2) As Long, t As Single
    Dim oArr, depos As Range  '<<<<<<<<<<<< aggiunta
    st(0) = "1": st(1) = "X": st(2) = "2"
    se(0) = 1: se(1) = 2: se(2) = 3
    Range("D:F").ClearContents
    r = Range("A3") 'partite richieste
    q = 3 ^ r       'colonne che saranno sviluppate
    p = 0: While 3 ^ p < q: p = p + 1: Wend
    
    'sviluppo ternario
    'algoritmo universale semplice al posto di numerosi cicli FOR
    Application.ScreenUpdating = False
    'ReDim se(0 To q - 1, 0 To 2)'se inserisco questa linea e quello piu sotto si incasina il tutto
    ReDim oArr(0 To q - 1, 0 To p - 1) '<<<<<<<< aggiunta
    Set depos = Range("D1")  '<<<<<<<<<<<<<


    Guarda le aggiunte/eliminazioni e prova. Fai sapere.
    Ciao,
    Mario
  • OFFLINE
    Marius44
    Post: 1.246
    Registrato il: 24/06/2015
    Città: CATANIA
    Età: 80
    Utente Veteran
    Excel2019
    10 13/04/2024 19:43
    Ciao Leo
    Non capisco perchè il codice fra i tagcode ha combinato un pasticcio.
    Ti riallego la macro come testo

    Option Explicit
    Sub pan()
    'Algoritmo alternativo per l'enumerazione di combinazioni, che nel caso del Totocalcio si chiamano Disposizioni con Ripetizione: 3^partite
    Dim a As Long, b As Long, c As Long, i As Long, j As Long, k As Long, p As Long, q As Long, r As Long
    Dim st(2) As String, se(2) As Long, t As Single
    Dim oArr, depos As Range
    st(0) = "1": st(1) = "X": st(2) = "2"
    se(0) = 1: se(1) = 2: se(2) = 3
    Range("D:F").ClearContents
    r = Range("A3") 'partite richieste
    q = 3 ^ r 'colonne che saranno sviluppate
    p = 0: While 3 ^ p < q: p = p + 1: Wend

    'sviluppo ternario
    'algoritmo universale semplice al posto di numerosi cicli FOR
    Application.ScreenUpdating = False
    'ReDim se(0 To q - 1, 0 To 2)'se inserisco questa linea e quello piu sotto si incasina il tutto
    ReDim oArr(0 To q - 1, 0 To p - 1) 'matrice
    Set depos = Range("D1") 'posizione di scrittura
    t = Timer
    For i = 0 To q - 1: k = i
    For j = p - 1 To 0 Step -1
    'Cells(i + 1, j + 4) = st(k Mod 3)
    'Cells(i + 1, j + 4) = se(k Mod 3)
    'se(i, j) = st(k Mod 3)
    oArr(i, j) = st(k Mod 3) 'assegna alla matrice
    k = k \ 3
    Next
    Next
    depos.Resize(27, 3) = oArr
    Application.ScreenUpdating = True
    Range("A1").Value = Timer - t
    Range("A2").Value = q
    Range("A3").Select

    ' sviluppo ternario in RAM
    ' qui mi sono intrecciato e non sono riuscito a mettere in RAM e a fare il giochino del DEPOS

    'ReDim segno(1 To q, 0 To 2)
    't = Timer
    'For i = 0 To q - 1: k = i
    ' For j = 0 To p - 1
    'segno(i + 1, j) = st(k Mod 3)
    'k = k \ 3
    'Next: Next
    'Range("C1").Value = Timer - t
    End Sub

    Fai sapere. Ciao,
    Mario
  • ONLINE
    L2018
    Post: 1.354
    Registrato il: 02/04/2018
    Città: PESCARA
    Età: 75
    Utente Veteran
    EXCEL 2016 - SPREAD32
    00 13/04/2024 20:44
    ciao Mario
    anzitutto grazie per l'impegno profuso
    non capisco l'incasinamento tag-code, ma non ricordo neppure se ti avevo mandato privatamente il file o la macro
    Sta di fatto che il codice appena da te ricevuto, applicato al mio file NON funziona
    ad un certo punto nel codice c'è scritto DEPOS.resize (27,3)
    Bene, quello è certo un grosso errore
    Al posto di 27 dovrebbe andarci il numero delle "colonne" toto, e al posto del 3 la lunghezza della "colonna" toto, in orizzontale
    se 3 partite allora 3^3= 27 = depos(27,3)
    se 5 partite allora 3^5= 243 = depos(243,5)
    eccetera, ma questi valori dipendono proprio dal numero partite, e non so se depos accetta valori variabili
    l'unica cosa che posso fare e rinviarti il mio file, solo perchè tu possa vedere il giusto funzionamento.
    Il concetto di tale file è(ra) duplice
    - costruire in RAM l'integrale delle colonne (3 elevato al numero partite) e misurarne il tempo
    - incolonnare lo sviluppo integrale con depos, e misurarne il tempo
    L'algoritmo che ho proposto è universale, quindi flessibile, volevo misurarne la velocità paragonata a quello dei files precedenti che avevamo realizzato.
    E siccome c'è variabilità di segni e partite ho calcolato che 8 partite (52488 segni) sono circa equivalenti ai 3734 terni di tempo fa, ai fini del confronto velocità.
    Ma ti prego comunque di lasciar perdere, anche perchè, ammesso che l'algo sia migliore
    - per poche partite non serve
    - per oltre 10 partite va fuori del foglio
    - oltre certo numero di partite diventa comunque insostenibile a dispetto del depos
    Quindi se per i giochi a estrazione si possono "avvicinare" (si fa per dire) le prestazioni di Excel a quelle del PowerBasic, nel caso del Toto non c'è match, io scrivo su disco 14 triple in 0,9 secondi (e sulla macchina vecchia).
    Ripeto, lascia perdere, non ne vale la pena.
    -----------
    Colgo l'occasione per ribadire che l'abbinamento di cose che hai chiamato Leo_bis e Leo_ter con la storia dei numeri caldi recenti si conferma vincente, ovviamente anche per il tuo gioco.
    Io sono sempre qui.
    [Modificato da L2018 13/04/2024 20:59]

    LEO
    https://t.me/LordBrum
  • ONLINE
    L2018
    Post: 1.355
    Registrato il: 02/04/2018
    Città: PESCARA
    Età: 75
    Utente Veteran
    EXCEL 2016 - SPREAD32
    00 13/04/2024 21:27
    Mario, ho fatto un discorso inutile
    ho solo corretto la tua svista (verosimilmente tale) che mi era balzata all'occhio
    e
    FUNZIONA !!

    asp qualche minuto, ecco intanto la macro, è stato sufficiente cambiare DEPOS(27,3) in DEPOS (q,p)
    Be' direi che se la cava egregiamente

    Macro
    Option Explicit
    Sub Mario()
    'Algoritmo alternativo per l'enumerazione di combinazioni, che nel caso del Totocalcio si chiamano Disposizioni con Ripetizione: 3^partite
    Dim a As Long, b As Long, c As Long, i As Long, j As Long, k As Long, p As Long, q As Long, r As Long
    Dim st(2) As String, se(2) As Long, t As Single
    Dim oArr, depos As Range, col As Long, segni As Long
    Range("D:P").ClearContents
    st(0) = "1": st(1) = "X": st(2) = "2"
    se(0) = 1: se(1) = 2: se(2) = 3
    Range("D:F").ClearContents
    r = Range("A3") 'partite richieste
    q = 3 ^ r 'colonne che saranno sviluppate
    p = 0: While 3 ^ p < q: p = p + 1: Wend
    
    'sviluppo ternario
    'algoritmo universale semplice al posto di numerosi cicli FOR
    Application.ScreenUpdating = False
    'ReDim se(0 To q - 1, 0 To 2)'se inserisco questa linea e quello piu sotto si incasina il tutto
    ReDim oArr(0 To q - 1, 0 To p - 1) 'matrice
    Set depos = Range("D1") 'posizione di scrittura
    t = Timer
    For i = 0 To q - 1: k = i
    For j = p - 1 To 0 Step -1
    oArr(i, j) = st(k Mod 3) 'assegna alla matrice
    k = k \ 3
    Next
    Next
    depos.Resize(q, p) = oArr
    Application.ScreenUpdating = True
    Range("A1").Value = Timer - t
    Range("A2").Value = q
    Range("A3").Select
    End Sub
    

    11 partite in 1,625 secondi, più che buono per essere Excel
    in effetti sembra che il DEPOS velocizzi la scrittura di 9 o 10 volte, interessante
    Caspita, ma il ringraziamento c'era comunque
    Ti rimando il mio file che contiene sia il NON depos (CTRL+M) che il tuo depos (CTRL+N)
    AD MAIORA !!
    [Modificato da L2018 14/04/2024 11:05]

    LEO
    https://t.me/LordBrum
  • nTdQ231201
    00 13/04/2024 21:29
    Ottima lezione di matematica e statistica.

    Mi ricordano tempi passati sui libri.

    A proposito come si può applicare tutto ciò ad un semplice file di excel?

    Grazie



  • ONLINE
    L2018
    Post: 1.356
    Registrato il: 02/04/2018
    Città: PESCARA
    Età: 75
    Utente Veteran
    EXCEL 2016 - SPREAD32
    00 13/04/2024 21:40
    Re:
    rex88 (nTdQ231201), 13/04/2024 21:29:

    Ottima lezione di matematica e statistica.

    Mi ricordano tempi passati sui libri.
    A proposito come si può applicare tutto ciò ad un semplice file di excel?
    Grazie



    se non è ironia, che significa applicare tutto ciò.....
    non ho capito

    LEO
    https://t.me/LordBrum
  • nTdQ231201
    00 13/04/2024 21:42
    Ho sbagliato a scrivere l'italiano?
  • ONLINE
    L2018
    Post: 1.357
    Registrato il: 02/04/2018
    Città: PESCARA
    Età: 75
    Utente Veteran
    EXCEL 2016 - SPREAD32
    00 13/04/2024 21:45
    Re:
    rex88 (nTdQ231201), 13/04/2024 21:42:

    Ho sbagliato a scrivere l'italiano?



    sempre se non è ironia, le parole sono affilate, è il concetto che non ho capito

    LEO
    https://t.me/LordBrum
  • nTdQ231201
    00 13/04/2024 21:47
    Non è ironia.

    Mi sspiega Lei cosa c'è da capire in questa frase:

    A proposito come si può applicare tutto ciò ad un semplice file di excel?
  • ONLINE
    L2018
    Post: 1.358
    Registrato il: 02/04/2018
    Città: PESCARA
    Età: 75
    Utente Veteran
    EXCEL 2016 - SPREAD32
    00 13/04/2024 21:49
    Re:
    rex88 (nTdQ231201), 13/04/2024 21:47:

    Non è ironia.

    Mi sspiega Lei cosa c'è da capire in questa frase:

    A proposito come si può applicare tutto ciò ad un semplice file di excel?



    è LEI che me lo dovrebbe spiegare, dato che io sono un po' tardino

    LEO
    https://t.me/LordBrum
  • nTdQ231201
    00 13/04/2024 21:52
    Ha ragione.

    Si è fatto tardi e domani ho impegni molto importanti.

    Buonanotte.

    Per me si chiude qui.
  • 15MediaObject4,17672 5
3