Qualche tempo fa stavo parlando con un collega e lui ha descritto un problema che aveva con una macro in esecuzione su un sistema informatico molto potente.

Sembra che la macro andrebbe sempre in crash e congelerebbe la macchina, sempre con un errore di memoria insufficiente. Il mio collega pensava che se la macro potesse essere eseguita in background, non avrebbe utilizzato così tante risorse e non si sarebbe bloccata.

Sapevo che la soluzione proposta non avrebbe necessariamente risolto il problema, comunque. Sebbene possa liberare alcune risorse, il sistema finirebbe comunque per esaurire la memoria. Perché? Perché i problemi di memoria insufficiente sono in genere dovuti a problemi di codifica nella macro originale.

Le “perdite di memoria” (che portano alla condizione di memoria insufficiente) possono essere causate da un numero qualsiasi di problemi nel codice macro.

La soluzione migliore è un giro di debug a tarda notte, passare attraverso il codice macro e analizzare dove si sta insinuando il problema. Cerca prima i problemi più ovvi (ma facilmente trascurati), come i loop infiniti. Se la macro sta eseguendo molte elaborazioni ripetitive (scorrendo i fogli di lavoro), assicurati di rilasciare tutta la memoria dichiarata per la tua macro. Ad esempio, per ogni istruzione SET che usi, dovresti avere un’istruzione corrispondente che imposti l’oggetto su NIENTE, e quelle istruzioni dovrebbero essere all’interno del ciclo.

Se riesci a scorrere le macro senza che falliscano, allora c’è una buona probabilità che il problema risieda in una sorta di problema di temporizzazione nei thread, un problema di temporizzazione che si presenta, ovviamente, solo quando la macro è in esecuzione a tutto tondo su proprio. Se sospetti che questo sia il problema, forse una nuova sequenza degli eventi nella macro può aggirarlo.

Se la macro utilizza DDE, è necessario tenere presente che Microsoft consiglia l’utilizzo dell’automazione OLE invece di DDE. I problemi di tempistica sono abbastanza comuni con DDE e Microsoft ora lo considera obsoleto e troppo instabile da risolvere (il che significa che non lo supporteranno). In VBA, più chiamate a una subroutine possono anche causare perdite di memoria e tali subroutine devono essere riscritte come funzioni definite dall’utente.

Dovresti anche assicurarti che tutti i riferimenti alle variabili siano completamente dichiarati. Ho visto alcuni rapporti di macro che vengono “confusi” tra i fogli di lavoro e anche se si utilizza Alt + Tab per rimuovere lo stato attivo da Excel.

_Nota: _

Se desideri sapere come utilizzare le macro descritte in questa pagina (o in qualsiasi altra pagina dei siti ExcelTips), ho preparato una pagina speciale che include informazioni utili.

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

Questo suggerimento (2579) si applica a Microsoft Excel 97, 2000, 2002 e 2003.