Jeff tiene un libro de Excel sofisticado que usa VBA para generar numerosos informes en formato PDF. Funciona muy bien en Excel 2013 de 32 bits en varias PC. Por el contrario, en varias otras PC que ejecutan Office 365, a la mitad de la salida, Jeff recibe un error de «Memoria insuficiente».

Por lo tanto, las macros funcionan perfectamente en la versión anterior de Excel, pero no en la versión más reciente. (Nuevamente, Jeff probó esto en varias PC para que los resultados sean repetibles). Jeff se pregunta si existen fugas de memoria conocidas o diferencias macro en Office 365 que podrían estar causando este problema.

Generalmente, el uso de la memoria tiene que ver con un problema principal: las variables y cómo se usan en su macro. Específicamente entra en juego con matrices de variables. Siempre es una buena idea asegurarse de declarar todas sus variables (use la directiva Option Explicit para ayudar en este sentido) y verifique el dimensionamiento de su matriz para asegurarse de que no está tratando de declarar una matriz increíblemente enorme.

Las variables de objeto también pueden usar mucha memoria. Si usa la palabra clave Set para asignar un objeto a una variable, asegúrese de establecer la variable de objeto en Nothing cuando haya terminado. Esto es especialmente importante dentro de los bucles: si cada paso a través del bucle da como resultado la declaración de otra variable de objeto, si no borra esa variable durante cada iteración del bucle, puede utilizar la memoria muy rápidamente.

También se debe tener en cuenta que debe desactivar la actualización de la pantalla mientras la macro realiza sus giros. Si su macro intenta actualizar continuamente la pantalla, eso usa recursos y ralentiza su macro.

Uno pensaría que en la situación de Jeff, sin embargo, el uso de la memoria no sería un gran problema. Después de todo, está pasando de una versión de 32 bits de Excel a (lo más probable) una versión de 64 bits. Esto permite que Excel utilice un espacio de memoria más grande que nunca. Por lo tanto, uno pensaría que los errores de «memoria insuficiente» serían menos probables que más probables.

Desafortunadamente, hay una llave inglesa para agregar a la mezcla aquí. Cuando aparece un error de «Memoria insuficiente», es posible que no sea la memoria la culpable.

Microsoft ha documentado, a lo largo de los años, que esta memoria en particular es de naturaleza genérica y puede ser causada por casi cualquier cosa. (En mi libro, eso hace que el mensaje de error sea inútil, pero quién soy yo para cuestionar a Microsoft. ¡Frustrante!)

La otra cosa que consideraría hacer (no haber visto el código de Jeff) es asegurarme de que no está programando linealmente. En otras palabras, divida su código en subrutinas individuales que realicen tareas pequeñas y discretas. A continuación, puede llamar a cada subrutina desde una rutina principal de control. El beneficio de esto es la gestión de la memoria debido al alcance.

Las variables tienen alcance solo dentro del procedimiento en el que se utilizan.

(Bueno, esto es cierto a menos que declare que tienen un alcance global, pero eso es una olla de pescado diferente). Esto significa que las variables utilizadas dentro de un procedimiento se destruyen y su memoria se libera, automáticamente, cuando se sale del procedimiento.

Sin embargo, si su macro se escribe linealmente de modo que no haya subrutinas, todas las variables se mantienen en su sistema durante todo el tiempo que se ejecuta la macro. Es mejor, desde el punto de vista de la gestión de la memoria, dividir el código en procedimientos para minimizar el uso de la memoria.

La otra ventaja de modularizar su código de esta manera es que si encuentra un error, incluso el generalmente inútil «Memoria insuficiente»

error: probablemente ocurrirá dentro de un procedimiento específico y, por lo tanto, puede tener una mejor oportunidad de identificar dónde está ocurriendo el error real. En mi opinión, esta capacidad para rastrear de manera más eficiente el punto potencial de falla es un gran beneficio.

Si esto aún no resuelve el problema, he visto algunos informes de que cuando guarda su libro de trabajo, obliga a VBA a realizar una recolección de basura en su espacio de memoria. Debido a esto, algunas personas sugieren que su macro guarde el libro de trabajo de vez en cuando, en lugar de solo al final de la macro. No sé qué tan precisos son estos informes, pero si ya está utilizando su macro para guardar el libro de trabajo, no está de más que guarde con más frecuencia que menos.

Hay una última cosa que debería mencionarse. Si ahora usa Office 365 Business Premium, incluye SharePoint Online y Excel Web App. Por lo tanto, estas versiones limitan el tamaño de un archivo de Excel a 10 MB. Si su archivo es bastante grande, es posible que haya funcionado bien en Excel 2013, pero fallará en Office 365 Business Premium debido a esta limitación de tamaño de archivo.

ExcelTips es su fuente de formación rentable en Microsoft Excel.

Este consejo (13619) se aplica a Microsoft Excel 2007, 2010, 2013, 2016, 2019 y Excel en Office 365.