web-dev-qa-db-fra.com

Comment effacer la mémoire pour éviter les "erreurs de mémoire insuffisante" dans Excel vba?

J'utilise le code VBA sur une grande feuille de calcul. Comment effacer la mémoire entre les procédures/appels pour éviter un problème de "mémoire insuffisante"?

Merci

24
Marc L

Le meilleur moyen d'aider la mémoire à être libérée consiste à annuler les objets volumineux:

Sub Whatever()
    Dim someLargeObject as SomeObject

    'expensive computation

    Set someLargeObject = Nothing
End Sub

Notez également que les variables globales restent allouées d'un appel à un autre. Par conséquent, si vous n'avez pas besoin de persistance, vous ne devez pas utiliser de variables globales ou les annuler si vous n'en avez plus besoin.

Cependant, cela ne vous aidera pas si:

  • vous avez besoin de l'objet après la procédure (évidemment)
  • votre objet ne rentre pas dans la mémoire

Une autre possibilité consiste à basculer vers une version 64 bits d'Excel qui devrait pouvoir utiliser davantage RAM avant le crash (les versions 32 bits sont généralement limitées à environ 1,3 Go).

13
assylias

J'ai trouvé une solution de contournement. Au début, il semblait que cela prendrait plus de temps, mais cela rend tout le travail plus fluide et plus rapide grâce à moins de permutation et à plus de mémoire disponible. Ce n'est pas une approche scientifique et il faut quelques tests avant que cela fonctionne.

Dans le code, assurez-vous que Excel enregistre le classeur de temps en temps. J'ai dû faire une boucle dans une feuille de 360 ​​000 lignes, qui s'est étouffée. Toutes les 10 000, le code était sauvegardé dans le code et il fonctionne maintenant comme un charme, même sur un Excel 32 bits.

Si vous démarrez le Gestionnaire des tâches en même temps, vous pouvez voir que la mémoire utilisée diminue considérablement après chaque sauvegarde.

12
Arne Larsson

La réponse est que vous ne pouvez pas explicitement, mais que vous devriez libérer de la mémoire dans vos routines.

Quelques astuces cependant pour aider la mémoire

  • Assurez-vous que l'objet est défini sur null avant de quitter votre routine.
  • Assurez-vous d'appeler Close sur les objets s'ils en ont besoin.
  • N'utilisez pas de variables globales sauf en cas d'absolue nécessité

Je recommanderais de vérifier l'utilisation de la mémoire après avoir exécuté la routine encore et encore, vous pourriez avoir une fuite de mémoire.

4
Dreamwalker

Si vous travaillez sur un grand ensemble de données, il est fort possible que des tableaux soient utilisés. Pour moi, créer quelques tableaux à partir de 500 000 lignes et 30 colonnes a causé cette erreur. Je l'ai résolu simplement en utilisant la ligne ci-dessous pour supprimer le tableau qui n'est plus nécessaire pour moi, avant d'en créer un autre:

Erase vArray

De même, si vous n'utilisez que 2 colonnes sur 30, il est judicieux de créer deux tableaux de 1 colonne au lieu d'un tableau de 30 colonnes. Cela n'affecte pas la vitesse, mais il y aura une différence dans l'utilisation de la mémoire.

1
Ryszard Jędraszyk

Trouvé ce fil à la recherche d'une solution à mon problème. Le mien nécessitait une solution différente que je pensais pouvoir être utile à d’autres. Ma macro supprimait des lignes, remontait et copiait des lignes dans une autre feuille de calcul. L'utilisation de la mémoire explosait pour plusieurs concerts et causait un manque de mémoire après avoir traité environ 4000 enregistrements. Qu'est-ce que ça a résolu pour moi?

application.screenupdating = false

Ajoutant qu'au début de mon code (assurez-vous de le rendre vrai à la fin), je savais que cela le ferait courir plus vite, ce qui était le cas .. mais je n'avais aucune idée de la mémoire.

Après avoir effectué cette petite modification, l’utilisation de la mémoire n’a pas dépassé 135 mb. Pourquoi cela a-t-il fonctionné? Aucune idée vraiment. Mais cela vaut le coup d'essayer et pourrait s'appliquer à vous.

0
Stevetb77