Reset variabili



  • Reset variabili
    di beppexile data: 15/07/2016 11:42:45

    Salve ragazzi, ho un quesito.

    Esiste un modo per settare a fine lavoro tutte le variabili di un progetto a Nothing (per scaricarle dalla memoria), con un'unico comando?
    Se si, quale?

    Grazie a tutti per gli interventi

    P.s.: ecco un'esempio di come faccio io attualmente 
     
    Set x1 = Nothing
    Set x2 = Nothing
    Set rigA = Nothing
    Set rigB = Nothing
    Set rigC = Nothing
    Set psSCA = Nothing
    Set pzSCA = Nothing
    Set cpSCA = Nothing
    Set pscSCA = Nothing
    



  • di scossa data: 15/07/2016 11:55:43

    cit.: "... ecco un'esempio di come faccio io attualmente ....."


    La domanda non è chiara: parli di "tutte le variabili" ma il Set a Nothing riguarda solo le variabili istanza di oggetti.

    P.S.. Ovviamente nei tuoi moduli usi Option Explicit, vero?


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di Vecchio Frac data: 15/07/2016 13:54:40

    All'osservazione di scossa aggiungo per completezza che, limitatamente alle istanze degli oggetti create con Set, non mi risulta che ci sia un comando unico per spazzare via queste istanze dalla memoria... operazione anche che lascerebbe in memoria tracce degli oggetti non chiusi correttamente, cioè se avvio un'istanza di Word e la anniento prima di averla chiusa con il suo metodo Quit, rimane comunque "appesa" in memoria, il che non è bene.
    Nei vecchi basic c'era il comando New per spazzare via le variabili e avviare il garbage collector, qui però mi sa tanto che non c'è qualcosa del genere (fermo restando che non serve annientare gli oggetti tipo Range e Worksheet se li usi dentro Excel per dire, perchè se ne occupa Excel all'uscita).

    Ovviamente la campagna a favore di "Option Explicit" è sempre aperta :)





  • di scossa data: 15/07/2016 14:09:10

    cit.: "fermo restando che non serve annientare gli oggetti tipo Range e Worksheet se li usi dentro Excel per dire, perchè se ne occupa Excel all'uscita"

    Il mio pensiero è diverso, ma ne abbiamo già parlato più volte


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee.
    (George Bernard Shaw)



  • di Vecchio Frac data: 15/07/2016 14:21:53

    Lo so lo so... ho molta fiducia nei meccanismi interni di Excel :)
    Per beppe: anche quando dichiari per esempio un range o un foglio dentro una procedura che nasce e muore in Excel, a essere rigorosi la dovresti annientare all'uscita. Nota comunque come diceva scossa che si tratta di istanze di oggetti, non di variabili di tipo per esempio string o integer.
     
    sub test
    dim r as range, ws as worksheet
    
        set r = range("A1")
        set ws = Activesheet
        .
        .
        .
        set r = nothing
        set ws = nothing
    end sub






  • di patel data: 15/07/2016 14:27:01

    secondo me occorrebbe capire cosa vale la pena di resettare e cosa no, probabilmente è ininfluente liberare le variabili usate ma potrebbe valer la pena resettare grosse matrici. Esiste un comando che calcola la memoria disponibile ? utilizzando questo ciascuno potrebbe fare delle prove e capire cosa resettare e cosa no ammesso che lo si possa fare, ancora nessuno ha risposto a parte settare a northing gli oggetti.





  • di beppexile data: 15/07/2016 14:27:14

    cit. scossa: "P.S.. Ovviamente nei tuoi moduli usi Option Explicit, vero? "

    si, è un'abitudine che mi avete fatto prendere voi.

    Per quanto riguarda le variabili, parlo di tutte, non solo di quelle a oggetti menzionate nel mio esempio.

    Volevo aggiungere anche, che non ho un vero è proprio problema riguardo la mia domanda, era più una curiosità (sicuramente espressa male per un'autodidatta come me), ma, visto che in passato Excel si è pronunciato con "Memoria insufficiente", ho preso l'abitudine di cercare di vuotare la memoria ad ogni Sub.

    Tuttavia ho l'impressione che la soluzione non sia solo quello del Nothing, ma che ci sia anche qualche altra cosa che mi sfugge.

    Quindi riformulo la domanda: quali sono i metodi per vuotare la memoria di excel?

    p.s.: magari ho comunque dimenticato qualcosa, ma vi giuro che non lo faccio apposta!



  • di beppexile data: 15/07/2016 14:31:30

    quoto patel, bella idea.

    tempo fa avevo trovato questo, che però non mi funziona, e non ho mai indagato il perchè:
     
    Sub MisuraMe()
    'la lettura viene eseguita in byte e quindi la convertiamo in kb
    Y = Application.MemoryUsed
    X = Val(Y / 1024)
    MsgBox "Microsoft Excel sta usando " & X & " Kb di meoria."
    End Sub



  • di beppexile data: 15/07/2016 14:35:32

    cit. Vecchio Frac: "anche quando dichiari per esempio un range o un foglio dentro una procedura che nasce e muore in Excel, a essere rigorosi la dovresti annientare all'uscita. Nota comunque come diceva scossa che si tratta di istanze di oggetti, non di variabili di tipo per esempio string o integer."

    Infatti non so come togliere dalla memoria le variabili String e Integer

    Se ad esempio setto le seguenti variali publiche:

    Public A as Integer
    Public msg As String

    Come faccio a rimuoverle dalla memoria quando non mi servono più??



  • di Vecchio Frac data: 15/07/2016 15:24:49

    Non ti serve farlo, davvero.
    Esiste un meccanismo chiamato garbage collection che tiene traccia delle variabili create e quando la variabile non è più utilizzata, rilascia la memoria. Tipicamente accade quando la variabile perde la visibilità, cioè quando termina la routine in cui è dichiarata.
    Questo è anche uno dei motivi per cui si dovrebbero limitare le variabili pubbliche allo stretto indispensabile e utilizzare solo variabili locali. Quando una routine termina, tutte le variabili utilizzate al suo interno e dichiarate con Dim vengono dereferenziate (cioè il compilatore sa che non vengono più usate oltre End Sub o End Function) e la relativa zona di memoria viene liberata.
    Sarebbe pazzesco se dovessimo alla fine di ogni routine dichiarare per esempio
    myString = vbNullString
    myArray = Empty
    myLong = 0

    Quindi su questo punto sta' tranquillo, non sono lì i problemi di memoria che riscontri.
    Piuttosto vanno verificate altre cose (se il foglio usa molte formule, se ci sono fogli non usati, se ci sono molte celle coinvolte in operazioni di formattazione condizionale, se ci sono connessioni a database, se le righe utilizzate sono davvero tante (oltre diecimila per esempio). Ma anche se ci sono altri Workbooks aperti, altre istanze di altre applicazioni che consumano memoria, vai a sapere.