Jeff ha una sofisticata cartella di lavoro Excel che utilizza VBA per generare numerosi report in formato PDF. Funziona alla grande su Excel 2013 a 32 bit su più PC. Al contrario, su più altri PC che eseguono Office 365, a metà dell’output Jeff riceve un errore “Memoria esaurita”.

Pertanto, le macro funzionano perfettamente sulla versione precedente di Excel, ma non sulla versione più recente. (Anche in questo caso, Jeff lo ha testato su più PC in modo che i risultati siano ripetibili.) Jeff si chiede se esistono perdite di memoria note o differenze macro in Office 365 che potrebbero causare questo problema.

In genere, l’utilizzo della memoria ha a che fare con un problema principale: le variabili e il modo in cui vengono utilizzate nella macro. Entra in gioco specificamente con gli array di variabili. È sempre una buona idea assicurarsi di dichiarare tutte le variabili (utilizzare la direttiva Option Explicit per aiutare in questo senso) e controllare il dimensionamento dell’array per assicurarsi che non si stia cercando di dichiarare un array follemente enorme.

Le variabili oggetto possono anche utilizzare molta memoria. Se utilizzi la parola chiave Set per assegnare un oggetto a una variabile, assicurati di impostare la variabile oggetto su Nothing quando hai finito. Questo è particolarmente importante all’interno dei cicli: se ogni passaggio attraverso il ciclo risulta nella dichiarazione di un’altra variabile oggetto, se non si cancella quella variabile durante ogni iterazione del ciclo, è possibile utilizzare la memoria molto rapidamente.

C’è anche un punto da fare per disattivare l’aggiornamento dello schermo mentre la tua macro sta eseguendo le sue rotazioni. Se la tua macro tenta di aggiornare continuamente lo schermo, ciò utilizza risorse e rallenta la tua macro.

Si potrebbe pensare che nella situazione di Jeff, però, l’utilizzo della memoria non sarebbe un grosso problema. Dopotutto, sta passando da una versione a 32 bit di Excel a (più che probabile) una versione a 64 bit. Ciò consente a Excel di utilizzare uno spazio di memoria più ampio che mai. Quindi, si potrebbe pensare che gli errori “Memoria insufficiente” sarebbero meno probabili piuttosto che più probabili.

Sfortunatamente, qui c’è una chiave inglese da gettare nel mix. Quando si riceve un errore “Memoria insufficiente”, potrebbe non essere la memoria a essere il colpevole.

Microsoft ha documentato, nel corso degli anni, che questa particolare memoria è di natura generica e può essere causata da qualsiasi cosa. (Nel mio libro, questo rende inutile il messaggio di errore, ma chi sono io per mettere in discussione Microsoft. Frustrante!)

L’altra cosa che prenderei in considerazione di fare (non aver visto il codice di Jeff) è assicurarmi di non programmare in modo lineare. In altre parole, suddividere il codice in singole subroutine che eseguono attività piccole e discrete. È quindi possibile chiamare ciascuna subroutine da una routine di controllo principale. Il vantaggio di ciò è la gestione della memoria dovuta all’ambito.

Le variabili hanno ambito solo all’interno della procedura in cui vengono utilizzate.

(Bene, questo è vero a meno che non le dichiari come aventi scope globale, ma questo è un altro paio di maniche.) Ciò significa che le variabili utilizzate all’interno di una procedura vengono distrutte e la loro memoria liberata, automaticamente, quando la procedura viene chiusa.

Se la macro, tuttavia, è scritta linearmente in modo che non ci siano subroutine, tutte le variabili vengono mantenute nel sistema per tutto il tempo in cui la macro è in esecuzione. È meglio, dal punto di vista della gestione della memoria, suddividere il codice in procedure in modo da ridurre al minimo l’utilizzo della memoria.

L’altro vantaggio di modularizzare il tuo codice in questo modo è che se incontri un errore, anche il generalmente inutile “Memoria esaurita”

errore: è probabile che si verifichi all’interno di una procedura specifica e quindi si possono avere maggiori possibilità di individuare dove si sta verificando l’errore effettivo. A mio avviso, questa capacità di rintracciare in modo più efficiente il potenziale punto di errore è un grande vantaggio.

Se questo ancora non risolve il problema, ho visto alcuni rapporti che quando salvi la cartella di lavoro forza VBA a eseguire la raccolta dei rifiuti sullo spazio di memoria. Per questo motivo, alcune persone suggeriscono che la tua macro salvi la cartella di lavoro ogni tanto, piuttosto che solo alla fine della macro. Non so quanto sia accurato questo rapporto, ma se stai già utilizzando la tua macro per salvare la cartella di lavoro, non può far male salvarla più spesso piuttosto che meno.

C’è un’ultima cosa che dovrebbe essere menzionata. Se ora usi Office 365 Business Premium, include SharePoint Online ed Excel Web App. Queste versioni, quindi, limitano la dimensione di un file Excel a 10 MB. Se il tuo file è abbastanza grande, potrebbe aver funzionato bene con Excel 2013, ma fallire in Office 365 Business Premium a causa di questa limitazione delle dimensioni del file.

ExcelTips è la tua fonte di formazione economica su Microsoft Excel.

Questo suggerimento (13619) si applica a Microsoft Excel 2007, 2010, 2013, 2016, 2019 e Excel in Office 365.