Ciclo for vs Overwrite



  • Ciclo for vs Overwrite
    di rambo424 (utente non iscritto) data: 21/02/2014 10:43:24

    Ciao ragazzi!
    vi pongo un quesito teorico legato all'efficienza del codice.
    Sto costruendo un codice che mi riempie una tabella con alcuni dati. A tabella completata, devo riempire 3 colonne che riportano i totali di determinate quantità, già scritte in precedenza.
    La domanda che vi pongo è legata alla performance del codice: posto che i totali non posso farli mentre mi riempie le colonne con le quantità parziali, secondo voi è più performante riempire a ogni giro della sub la colonna della quantità totale, scrivendo la cumulata step by step, ovvero:
    sheet1.cells(1,1) = sheet1.cells(1,1) + quantità_parziale
    oppure riempire tutta la colonna delle quantità parziali e solo dopo aver riempito tutti i parziali calcolarmi tutti i totali con un ciclo for che lavora su di essi?
    in entrambi i casi il codice da implementare è molto semplice, mi interessava avere un parere legato all' efficacia, alla performance e alla correttezza "teorica" del codice da voi che ne capite più di me! :)




  • di rambo424 data: 21/02/2014 10:45:50

    ps.: grazie per il contributo che mi darete, che sono certo sarà utilissimo!



  • di isy data: 21/02/2014 10:52:59

    Cit: La domanda che vi pongo è legata alla performance del codice

    Allega un esempio con le formule utilizzate sicuramente si può evitare il ciclo For Next
    Quale reale necessità hai per chiedere di velocizzare il codice.



  • di Lucas87 data: 21/02/2014 10:56:51

    cit. "posto che i totali non posso farli mentre mi riempie le colonne con le quantità parziali"
    Perchè?
    Puoi anche scrivere e contemporaneamente calcolarti il totale da associare a una variabile (tot=tot+nuovo valore) e alla fine riportare la variabile. Con una passata fai più operazioni.
    Poi dipende da quali dati devi sommare, da come sono disposti, ma magari con qualche if o select case puoi specificarlo.



  • di rambo424 data: 21/02/2014 11:01:46

    Potrei sicuramente valorizzare una variabile di appoggio che me li cumula.. però a quel punto mi servirebbe di dimensionarla come pubblica, perchè i parziali sono calcolati all' interno di sub diverse.

    Però, si hai ragione, un'altra alternativa è una variabile di tipo Public



  • di Zer0Kelvin data: 24/02/2014 10:33:39

    Ciao.
    Premesso che quasi certamente l'utilizzo della variabile rende il codice più veloce, ci sono un paio di cose che puoi fare per rendere le operazioni sul foglio.
    Inserire l'istruzione:

    Application.ScreenUpdating = False

    all'inizio della procedura e

    Application.ScreenUpdating = True

    alla fine.
    Allo stesso modo, se non hai bisogno che excel effettui ricalcoli durante l'esecuzione puoi inserire:

    Application.EnableEvents = False

    all'inizio e

    Application.EnableEvents = True

    alla fine.
    Se il tempo di esecuzione è davvero importante puoi procedere per tentativi, misurando il tempo impiegato. Sotto c'è l'esempio di come si può fare

     
    Option Explicit
    
    Sub temporizza()
    Dim t As Single
        t = Timer
        
        '
        ' metti qui in mezzo le operazioni che vuoi "cronometrare
        '
        MsgBox "Tempo Impiegato = " & Timer - t
    End Sub
    



  • di scossa data: 24/02/2014 14:07:20

    @Zer0Kelvin:
    presumo intendessi
    Application.Calculation = xlCalculationManual




  • di Zer0Kelvin data: 24/02/2014 18:34:30

    Groan! ... episodio demenziale, scusate, sai, l'età