web-dev-qa-db-fra.com

Limiter l'utilisation du processeur Excel

Existe-t-il un moyen de limiter le volume d'utilisation du processeur auquel Excel a accès lors de l'exécution? J'ai un script VBA qui calcule un tas de formules de tableau géant. Le calcul complet prend peut-être 20 minutes avec 100% de mon processeur, mais je ne peux pas utiliser ma machine pendant tout ce temps. Je préférerais qu'il fonctionne en arrière-plan avec une utilisation du processeur de l'ordre de 50% pour pouvoir continuer à faire autre chose. Aucune suggestion?

Mon système d'exploitation est Windows 7 Entreprise 64 bits et la version Excel est 2007-32 bits.

31
learningAsIGo

Si une fonction VBA est appelée à partir de plusieurs formules ou si votre script génère ou force le recalcul de plusieurs formules, vous devez utiliser la fonctionnalité de calcul multithread d'Excel (===) . Respectivement, cela exécuterait plusieurs instances de votre fonction VBA pour chaque formule ou recalculerait plusieurs cellules simultanément pendant que votre script vba s'exécute sur un seul thread.

Vous pouvez limiter le nombre de threads utilisés par Excel pour recalculer les formules dans Options Excel ... onglet Avancé ... section Formules.

enter image description here

54
mtone

Au lieu de réduire la priorité, essayez de modifier l'affinité dans le Gestionnaire des tâches. Si vous avez plus d'un processeur, vous pouvez limiter le nombre de processeurs utilisés par Excel. Cela permettra aux autres processeurs de travailler sur d’autres tâches.

Cliquez avec le bouton droit sur Excel dans l'onglet Processus et sélectionnez Définir l'affinité. Choisissez le (s) processeur (s) sur lequel/lesquels vous souhaitez exécuter Excel.

27
B540Glenn

Vous pouvez essayer de réduire la priorité du processus Excel en ouvrant le gestionnaire de tâches, en basculant sur l’onglet "Détails" ou "Processus" (selon votre version de Windows), en cliquant avec le bouton droit de la souris sur le processus Excel.exe, puis en sélectionnant une option. priorité inférieure. Cela devrait donner plus de temps processeur aux autres processus.

7
Slithy Toves

Des fonctions de veille et d'attente sont disponibles dans VBA ou via une déclaration. Cependant, la "règle empirique trop simpliste" est de ne jamais utiliser Sleep (). (google '"ne jamais utiliser sleep ()" programmation ")

Page de document pour Application.Wait ( https://msdn.Microsoft.com/en-us/library/office/ff822851.aspx ). Notez que les fonctions Veille et Attente empêchent Excel de répondre pendant la durée spécifiée, ce qui peut provoquer des "épaves de trains" par tranches de temps.

Si votre calcul implique une boucle, alors une façon de la gérer pour votre but spécifique (durée de calcul perdue pour la disponibilité de la CPU) est de créer une fonction d'attente spéciale qui, par exemple, boucle DoEvents () pendant 1 seconde et puis revient.

DoEvents indique essentiellement à votre code/interprète de laisser du temps pour le système d’exploitation, etc. Cela allongera définitivement la durée de votre code. Cela peut également vous permettre de modifier la feuille de calcul pendant le calcul, de sorte que votre kilométrage peut varier. Tester.

Voir, par exemple, https://stackoverflow.com/questions/469347/is-there-an-equivalent-to-thread-sleep-in-vba

3
Yorik

Une question similaire a été posée il y a quelques années avec une solution: Existe-t-il des solutions permettant de limiter l'utilisation du processeur par un processus?

Processus Tamer fonctionne pour Windows 7. http://www.donationcoder.com/Software/Mouser/proctamer/

2
Ryan

Ajoutez les 2 lignes suivantes quelque part près du début de votre macro:

'Turn off screen updating

 Application.ScreenUpdating = False

Et ces 2 lignes vers la fin:

'Turn screen updating back on

 Application.ScreenUpdating = True

Il aura alors moins de travail à faire pendant que vous faites autre chose.

0
Loppy

J'ai eu le même problème lorsque mon ordinateur portable avait 4 Go de mémoire. Dès que je l'ai mis à niveau à 16 Go, le problème s'est arrêté. Juste une autre solution possible.

0
RPh_Coder