Utilizzo memoria variabili



  • Utilizzo memoria variabili
    di Lucas87 data: 06/03/2014 18:57:08

    Ciao a tutti.
    La domanda contorta è: che fine fanno le variabili quando il progetto viene chiuso?
    Tralasciando come vengono memorizzate e richiamate da diverse subroutine, se non sbaglio, quando il nostro foglio di calcolo viene chiuso le variabili vengono "perse/distrutte". Sbaglio?
    Chiedo questo perchè in diversi progetti vedo scritto set variabile=nothing prima di end sub ...perchè?
    Se la macro dovesse essere avviata più volte comunque la variabile verrebbe inizializzata nuovamente; mentre se al termine dell'utilizzo il foglio venisse chiuso, la variabile dovrebbe "svanire" (vuota o piena che sia).
    Un dubbio analogo mi è venuto dopo aver risposto oggi a un quesito su una macro a tempo
    (post "macro a tempo" di michele 1985) dove il codice prosegue mentre una variabile resta =true. In questo caso è meglio portare =false la variabile prima della chiusura e quindi fermare il codice, oppure basta chiudere il file e chi se ne frega della variabile tanto il codice si ferma comunque?
    Forse quanto presupposto non è vero e quindi la memoria si riempie di variabili inutilizzate?



  • di Vecchio Frac data: 06/03/2014 19:09:13

    In linea di massima dovrebbe intervenire qualcosa che si chiama "garbage collector", un meccanismo che provvede a rilasciare le locazioni di memoria utilizzate dal programma al termine dell'esecuzione (generalmente quando si chiude il processo padre, cioè l'ultima istanza di Excel, Word, Access, ecc.). Il meccanismo è automatico ma certe volte non funziona bene (soprattutto quando rimangono appese in memoria le istanze dei programmi principali per i motivi più diversi).
    E' di solito buona norma annientare gli oggetti che vengono istanziati con CreateObject.
    Gli altri sono normalmente distrutti da Excel o Word alla loro chiusura altrimenti avresti il paradosso di dover specificare ad esempio Set Range("A1") = Nothing (cosa che per fortuna non è permessa), essendo ogni cella un oggetto.
    Comunque questo vale per le variabili oggetto, non per i valori (booleani o di altro tipo) che vengono comunque azzerati alla fine della vita della variabile.





  • di patel data: 06/03/2014 19:27:44

    basta fare qualche prova (inserendo uno stop al termine del codice) con il gestore attività in funzione e si vede che al termine dell'esecuzione la memoria viene rilasciata.





  • di scossa data: 07/03/2014 09:08:30

    cit. Vecchio Frac: "E' di solito buona norma annientare gli oggetti che vengono istanziati con CreateObject.
    Gli altri sono normalmente distrutti da Excel o Word alla loro chiusura ....."

    Questo nella teoria, nella pratica e nella realtà sappiamo bene che la grabage-collection di Excel non è del tutto affidabile, quindi meglio un bel Set a Nothing di tutte le istanze create.


    cit. Vecchio Frac: ".....altrimenti avresti il paradosso di dover specificare ad esempio Set Range("A1") = Nothing (cosa che per fortuna non è permessa), essendo ogni cella un oggetto"

    Un momento, senza entrare troppo nel tecnico è evidente, ma se non lo fosse lo preciso, che quando parliamo di disturggere (set a Nothing) gli "oggetti", si parla di distruggere le loro istanze, non l'oggetto cui si riferiscono, ed essendo Range("A1") un oggetto e non una istanza non puoi certo distruggerlo (come giustamente dici anche tu). Altrimenti un bel Set ThisWorkbook = Nothing e facciamo implodere Excel
    Mentre se creiamo una sua istanza con
    Set wb = ThisWorkbook
    alla fine del codice molto meglio prevedere un bel
    Set wb = Nothing




  • di Vecchio Frac data: 07/03/2014 14:09:26

    +1