Plantage interface graphique macro si je fais autre chose

Bonjour

Je suis confronte a un probleme :

J ai cree une grosse macro avec une interface graphique qui fait de l extraction de base de donne spour mise en forme jourlaiere avec des indicateurs journaliers , enfin bref un truc assez massif ...

Le probleme est que si j ai le malheur d effectuer autre chose ( du simple bloc note a l ouverture d un navigateur internet ) en meme temps que l' execution de ma macro , elle plante et sa embete tout le monde . la macro met 3 minutes par jour pour tourner .

J aimerais bien savoir quels pourrait en etre les causes ?

J avais pense a une solution , a vous de me dire si c est viable ou non :

Descactiver le clavier partiellement ( toutes les touches sauf CTRL ALT SUPPR pour pouvoir fermer la macro en cas de force majeur avec le gestionnaires de taches ) et descativer totalement la souris au debut de la macro , et reactiver le tout a la fin de la macro.

Soit je met en place la derniere solution ( preventif ) , mais je ne sais pas comment faire , peut etre utiliser une librairie system32 mais j ai un peu peur pour etre franc...

Ou soit je resoud le probleme ( curatif ) pour faire en sorte que la macro tourne meme si l operateur fait eutre chose en meme temps ..

En attente de vos reponses !

Cordialement

Adrien

hello, 8)

ou autre solution tu passe par un bouton interrupteur, tu clic sur le bouton ça met en pause. 8)

https://www.excel-pratique.com/fr/telechargements/utilitaires/zaz-stopmacro-no213.php

https://forum.excel-pratique.com/applications/zaz-stopmacro-bouton-interrupteur-externe-t68644.html

L'idée de ce bouton en .net c'est de stopper une boucle sur demande de l'user, mais tu peux bien la mettre en pause à la place de End tu change par un application.wait()

Après faudrait voir le jeux des boucles, peut être qu'en désactivant l'affichage :

application.screenupdating = false

Ou en rendant invisible Excel pendant son travail :

application.visible = false

Et en plaçant à des endroits judicieux des doevents, méthode qui rends la main à l'user à chaque passage de cette ligne ça peux résoudre le problème.

Tu peux aller dans le gestionnaire des tâches aussi, au niveau des programmes lancée, tu clic droit sur excel, tu lui définit la priorité sur supérieur à la normal, ce qui doit de mémoire dire à l'ordinateur qu'il doit privilégier excel quand il doit transiger dans les allocations de ressources matériel et aussi dans affinité voir si excel gère bien l'ensemble des processeurs

A voir aussi quand la macro tourne, le niveau de performance utilisé par ton fichier, car si la ram et le processeur tourne à 95%, soit ton code est mal optimisé, soit c'est l'ordinateur qui n'est pas assez puissant.

merci de votre reponse

J ai deja desactive l affichage lors de toute l execution de la macro , ca de moins a gerer pour excel .... avec screenupdating.

Possible en vba d ecrire une ligne en debut de mecro pour faire en sorte que la macro soit en ordre d execuution superieure dans les taches du PC ?

Sa fait deux mois que je bosses sur ce fichier , j ai optimise au maximum mon fichier ( en tout cas avec mes connaisances ...)

je pense difficilement pouvoir faire mieux ..

Je regarderais si l ordi sature a l execution ....

Si y en as qui ont des solutions concernant mes premieres demandes ..

Merci

bonjour,

On peut voir le truc massif ? (juste la macro...)

A+

adrienc45 a écrit :

Possible en vba d ecrire une ligne en debut de mecro pour faire en sorte que la macro soit en ordre d execuution superieure dans les taches du PC ?

Voilà le code en vbs avec le WMI il est possible de changer la priorité des processus :

Sub Code_WMI_Modifs_prio_processus()
'Code WMI / Au besoin activer dans outils > référence > la référence WMICntl
'------------------------------------------------------------------------------------------------------------
'Index des Constantes pour SetPriority / 'Code hexadécimale
Const NORMAL = 32 ' ou &H20
Const LOW = 64 ' ou &H40
Const HIGH = 128 ' ou &H80
Const REALTIME = 256 ' &H100
Const BELOW_NORMAL = 16384 ' &H4000
Const ABOVE_NORMAL = 32768 ' &H8000
'------------------------------------------------------------------------------------------------------------
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process Where Name = 'excel.exe'") 'Bien indiquer le nom du processus à impacter : 'excel.exe'
      For Each objProcess In colProcesses 'Boucle pour parcourir les processus actifs
         If LCase(objProcess.Name) = "excel.exe" Then 'double sécurité, si nom processus actif est bien excel alors ok modification priorité
          objProcess.SetPriority (HIGH) 'Objet processus prend la valeur de la constante ici priorité haute
         End If
      Next
End Sub

Dans l'aide VBA d'Excel, il y'a un article sur la méthode application.interactive qui peut répondre au problème concernant la souris et le clavier, à voir :

Application.Interactive, propriété

Cette propriété a la valeur True si Microsoft Excel est en mode interactif. Cette propriété a généralement la valeur True.Si vous lui attribuez la valeur False, Microsoft Excel bloque toute saisie à partir du clavier et de la souris (à l'exception de la saisie dans les boîtes de dialogue affichées par votre code). Type de données Boolean en lecture-écriture.

Syntaxe

Remarques

Le blocage de la saisie utilisateur empêche l'utilisateur d'entraver l'exécution de la macro lorsqu'il déplace ou active des objets Microsoft Excel.

Cette propriété est utile si vous recourez à l'échange dynamique de données (DDE, Dynamic Data Exchange) ou à OLE Automation pour communiquer avec Microsoft Excel à partir d'une autre application.

Si vous affectez la valeur False à cette propriété, n'oubliez pas de rétablir la valeur True. Microsoft Excel ne lui affectera pas automatiquement de nouveau la valeur True au terme de l'exécution de votre macro.

Exemple

Cet exemple montre comment affecter la valeur False à la propriété Interactive pendant qu'elle utilise l'échange dynamique de données sous Windows, puis lui affecter de nouveau la valeur True une fois que l'échange est terminé. L'utilisateur ne risque ainsi pas d'entraver l'exécution de la macro.

Visual Basic pour Applications

Application.Interactive = False

Application.DisplayAlerts = False

channelNumber = Application.DDEInitiate( _

app:="WinWord", _

topic:="C:\WINWORD\FORMLETR.DOC")

Application.DDEExecute channelNumber, "[FILEPRINT]"

Application.DDETerminate channelNumber

Application.DisplayAlerts = True

Application.Interactive = True

bonjour,

Application.Interactive n'intervient que sur Excel et l'exécution du processus en cours.

ça n'empêche nullement d'aller sur internet, dans une autre appli, ou de débrancher l'ordi !

A+

Rechercher des sujets similaires à "plantage interface graphique macro fais chose"