Application.ScreenUpdating et Application.EnableEvents

Bonjour,

J'ai un problème lié à Application.ScreenUpdating. Je l'utilise au début de toutes mes macros sur un fichier, je le paramètre sur False et ça marche très bien.

Dans les versions précédentes de mon fichier, tout fonctionnait bien sur mon ordinateur de travail, mais pas sur celui de mes collègues, ni mon ordinateur personnel. Pour information, mes collègues et moi sommes sur Excel 2010, et mon ordinateur personnel sur Excel 2016.

Aujourd'hui, dans la dernière version de mon fichier, le problème s'est résolu sur l'ordinateur de mes collègues, pour je ne sais quelle raison Néanmoins, il persiste sur mon ordinateur personnel qui est une bête de course à comparer avec les ordinateurs du travail.

1) La ligne Application.ScreenUpdating ne fait plus son travail ! Mais alors pourquoi uniquement sur mon ordinateur perso ?

Hypothèse : La macro en question fait appel plusieurs fois à une macro événementielle que je ne peux contourner qui fait elle-même appel à un userform, c'est lui qu'on voit apparaître et disparaître 2 ou 3 fois.

2) Est-ce que la ligne Application.EnableEvents aurait son intérêt ?

Cordialement.

UP !

Bonjour,

Un fichier qui reproduit ton problème... et on pourra avancer !

Voilà la macro qui pose ce problème. A quatre reprise, un userform est appelé alors que je ne le souhaite pas, d'où les quatre lignes de code "Unload". Et donc c'est le userform qu'on aperçoit quatre fois quand la macro ne se fait pas de façon instantanée (voir message précédent).

Sub RESET_Général() 'Remise à zéro des données d'entrée sur les 8 onglets (4 x Valorisation et 4 x Transport)

    Application.ScreenUpdating = False 'Supprime la mise à jour de l'affichage entre chaque opération, et diminue considérablement le temps de la macro

    ActiveWorkbook.Unprotect Password:="MFerrand" 'Déprotège le classeur pour afficher/masquer les feuilles
    Sheets("Transport CSF-CV").Visible = True
    Sheets("Transport CSF-CV").Select
    Range("Transport_CSF_CV_Clear").Select
    Selection.ClearContents
    Range("Transport_CSF_CV_Faites_votre_choix").Select
    Selection.Value = "Faites votre choix"
    Range("E6").Select
    Sheets("Transport CSF-CV").Visible = False
    Sheets("Valorisation CSF-CV").Visible = True
    Sheets("Valorisation CSF-CV").Select
    Range("Valorisation_CSF_CV_Clear").Select
    Selection.ClearContents
    Range("Valorisation_CSF_CV_Faites_votre_choix").Select
    Selection.Value = "Faites votre choix"
    Unload Valorisation_des_cendres
    Range("E3").Select

    ActiveWorkbook.Unprotect Password:="MFerrand" 'Déprotège le classeur pour afficher/masquer les feuilles
    Sheets("Transport CSFCVMC-CVEFFAM").Visible = True
    Sheets("Transport CSFCVMC-CVEFFAM").Select
    Range("Transport_CSFCVMC_CVEFFAM_Clear").Select
    Selection.ClearContents
    Range("Transport_CSFCVMC_CVEFFAM_Faites_votre_choix").Select
    Selection.Value = "Faites votre choix"
    Range("E6").Select
    Sheets("Transport CSFCVMC-CVEFFAM").Visible = False
    Sheets("Valorisation CSFCVMC-CVEFFAM").Visible = True
    Sheets("Valorisation CSFCVMC-CVEFFAM").Select
    Range("Valorisation_CSFCVMC_CVEFFAM_Clear").Select
    Selection.ClearContents
    Range("Valorisation_CSFCVMC_CVEFFAM_Faites_votre_choix").Select
    Selection.Value = "Faites votre choix"
    Unload Valorisation_des_cendres
    Range("E3").Select

    ActiveWorkbook.Unprotect Password:="MFerrand" 'Déprotège le classeur pour afficher/masquer les feuilles
    Sheets("Transport CSF-CVMC-CVEFFAM").Visible = True
    Sheets("Transport CSF-CVMC-CVEFFAM").Select
    Range("Transport_CSF_CVMC_CVEFFAM_Clear").Select
    Selection.ClearContents
    Range("Transport_CSF_CVMC_CVEFFAM_Faites_votre_choix").Select
    Selection.Value = "Faites votre choix"
    Range("E6").Select
    Sheets("Transport CSF-CVMC-CVEFFAM").Visible = False
    Sheets("Valorisation CSF-CVMC-CVEFFAM").Visible = True
    Sheets("Valorisation CSF-CVMC-CVEFFAM").Select
    Range("Valorisation_CSF_CVMC_CVEFFAM_Clear").Select
    Selection.ClearContents
    Range("Valorisation_CSF_CVMC_CVEFFAM_Faites_votre_choix").Select
    Selection.Value = "Faites votre choix"
    Unload Valorisation_des_cendres
    Range("E3").Select

    ActiveWorkbook.Unprotect Password:="MFerrand" 'Déprotège le classeur pour afficher/masquer les feuilles
    Sheets("Transport").Visible = True
    Sheets("Transport").Select
    Range("Transport_Clear").Select
    Selection.ClearContents
    Range("Transport_Faites_votre_choix").Select
    Selection.Value = "Faites votre choix"
    Range("E6").Select
    Sheets("Transport").Visible = False
    Sheets("Valorisation").Visible = True
    Sheets("Valorisation").Select
    Range("Valorisation_Clear").Select
    Selection.ClearContents
    Range("Valorisation_Faites_votre_choix").Select
    Selection.Value = "Faites votre choix"
    Unload Valorisation_des_cendres
    Range("E3").Select

    ActiveWorkbook.Unprotect Password:="MFerrand" 'Déprotège le classeur pour afficher/masquer les feuilles
    Sheets("Valorisation CSF-CV").Visible = False
    Sheets("Valorisation CSFCVMC-CVEFFAM").Visible = False
    Sheets("Valorisation CSF-CVMC-CVEFFAM").Visible = False

    ActiveWorkbook.Protect Password:="MFerrand" 'Reprotège le classeur

    ActiveWindow.ScrollWorkbookTabs Position:=xlFirst 'Défile les onglets dans la barre en bas à gauche, vers la gauche jusqu'au premier

End Sub

Bonjour,

A quatre reprise, un userform est appelé alors que je ne le souhaite pas

C'est ça qu'il faut chercher.

Surtout que depuis 2013 et la gestion des fenêtres en MDI il y a de gros problème de feuille active qui ne l'est qu'à moitié dans certains cas (elle est active dans le sens où c'est celle qui est sélectionnée, mais tu écris dans une autre) si un userform est présent.

ils sont sans doute affichés sur l'événement Change lors de

    Range("Valorisation_CSF_CVMC_CVEFFAM_Faites_votre_choix").Select
    Selection.Value = "Faites votre choix"

à remplacer par :

Application.EnableEvents = False
Range("Valorisation_CSF_CVMC_CVEFFAM_Faites_votre_choix").Value = "Faites votre choix"
Application.EnableEvents = True

et enlève tous tes .select comme j'ai fait, inutiles dans 99% des cas

Par curiosité tes userform modaux ou non modaux ? (.Show ou .Show vbModeless ?)

eric

Ca fonctionne très bien

L'userform est en affichage non modal. J'aurais préféré qu'il soit en affichage modal mais j'ai une erreur quand je le passe en modal, même après ce dernier correctif :

Erreur d'exécution '400':

Feuille déjà affichée ; affichage modal impossible

Je m'en doutais un peu. A-priori c'est en non modal qu'il y a de gros soucis.

Méfie-toi en, surtout que tu joues avec la visibilité des onglets.

Je ne retrouve pas le fil mais, de mémoire, dans le même contexte la personne faisait une saisie manuelle sur la feuille (active par la force des choses), ça restait vide pour s'inscrire sur une feuille masquée...

Alors, je reconfirme, en non modal, mon problème est résolu !

Maintenant ma question est : pourquoi ça ne passe pas en modal ?

Et autre question, mes macros sont supers lentes sur mon ordi perso (qui est une bête) sous Office 2016, pourquoi ? De plus, l'userform n'a pas tout à fait la même dimension, il est coupé un peu en bas et un peu à droite, pourquoi ?

Bonjour,

Maintenant ma question est : pourquoi ça ne passe pas en modal ?

gros bug

Pour le reste tu n'es pas le 1er à te plaindre de lenteurs sur 2016. Fouine sur google, tu trouveras peut-être la cause.

Pour les dimensions des UF, il n'y a pas un changement d'OS en plus ? W10 au lieu de W7 ? De toute façon il faudra faire avec...

eric

eriiic a écrit :

Bonjour,

Maintenant ma question est : pourquoi ça ne passe pas en modal ?

gros bug

Arf...

eriiic a écrit :

Pour le reste tu n'es pas le 1er à te plaindre de lenteurs sur 2016. Fouine sur google, tu trouveras peut-être la cause.

Pour les dimensions des UF, il n'y a pas un changement d'OS en plus ? W10 au lieu de W7 ? De toute façon il faudra faire avec...

eric

Effectivement, j'ai omis de dire que je passe de W7 (à mon travail) à W10 (sur mon ordi perso), en plus de passer de Office 2010 à 2016. Microsoft, ça marche du tonnerre...

En tout cas merci eric

Bonjour, Salut Eric !

J'ai repris, avec un petit temps de retard, ta citation de code initiale .

Outre qu'en éliminant tous les Select on commencerait à y voir plus clair, si je considère le premier bloc de code, on y trouve 2 effacements de plages nommées, et 2 inscriptions sur des plages nommées, tout le reste est donc logiquement parasite !

Comme rien ne montre ce qui charge le Userform qu'on décharge, commencer par le commencement consisterait à voir ce qui fait se charger un Userform 4 fois (tout seul !?)

Pourquoi aussi on déprotège le classeur à répétition ? Très bizarre !

Bref ! Je veux bien croire à l'existence d'un problème, mais alors il y manque l'essentiel pour permettre de le cerner...

Tout ce que je peux dire de logique est qu'il conviendrait de réduire le code cité aux 5 à 10% (vraiment un max !!) utile mais pour le faire correctement la production des éléments manquants s'impose !

Cordialement.

Bonjour MFerrand,

J'avoue que je n'ai pas approfondi le code. Juste vu le niveau 'ceinture blanche' et qu'il avait encore à apprendre.

Je me suis limité à l'explication du problème et indiquer par où passer pour s'en affranchir tant que faire se peut, pour ne pas trop le noyer.

Pour le reste, j'ai l'impression qu'il y a du potentiel et de la volonté, il apprendra vite

eric

Salut Eric !

J'ai admiré ta façon de "cibler" un problème, et qui semble être en prise... Dans le contexte c'est de l'intuition géniale...

Mais à l'instar de Saint-Thomas ( ) j'aimerais bien toucher les tenants et aboutissants...

Bonne journée.

Bah, ça devient un réflexe Dès que >=2013 et selon le problème je pense tout de suite MDI

D'ailleurs je n'ai pas prêté attention sur le coup mais je me demande s'il n'a pas inversé sa réponse : pb si non modal (vbmodeless)

eriiic a écrit :

Bonjour MFerrand,

J'avoue que je n'ai pas approfondi le code. Juste vu le niveau 'ceinture blanche' et qu'il avait encore à apprendre.

Je me suis limité à l'explication du problème et indiquer par où passer pour s'en affranchir tant que faire se peut, pour ne pas trop le noyer.

Pour le reste, j'ai l'impression qu'il y a du potentiel et de la volonté, il apprendra vite

eric

Hahahahahah Bon merci en tout cas ! Là je me lance dans du superficiel, comme j'ai un peu de temps devant moi, avec les animations pour agrémenter mes fichiers

eriiic a écrit :

D'ailleurs je n'ai pas prêté attention sur le coup mais je me demande s'il n'a pas inversé sa réponse : pb si non modal (vbmodeless)

J'ai bien le problème en modal, quand on n'a pas accès à la feuille de calcul, en non modal ça passe (même si je préférerai en modal mais ça reste mineur comme problème).

Mon avis est que ce système est bancal ! Bien conçu, il ne devrait pas générer de problème !

Si un Userform s'ouvre alors qu'il ne devrait pas, c'est que la programmation de son lancement est défectueuse.

Mais c'est toi que cela regarde !

Je me demanderai toujours où réside l'intérêt de soulever un problème en masquant soigneusement toutes les informations qui permettraient de l'identifier et de le résoudre... Logique très particulière !

Rechercher des sujets similaires à "application screenupdating enableevents"