IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Application.ScreenUpdating : comment cela fonctionne ? [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 233
    Points : 462
    Points
    462
    Par défaut Application.ScreenUpdating : comment cela fonctionne ?
    Bonjour,

    je cherche à optimiser l'affichage de l'enchainement des feuilles de mes différents classeurs en essayant d'éviter au maximum la vision du déroulement de l'affichage des feuilles au cours de l'execution des mes macros.

    L'idéal serait d'avoir directement la feuille finale.

    Pour cela j' ai mis au début dans mes macros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = False
    J'ai fait cela sans vraiment en maitriser les effets et sans résultats très satisfaisants

    J'aimerai des éclaircissements sur ce qu'il faut faire pour faire au mieux. Une documentation expliquant le principe entre feuilles et classeurs serait bienvenue également

    merci
    Il ne savait pas que c'était impossible, donc il l' a fait...

  2. #2
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Bonjour,

    Regardes cette réponse :
    https://www.developpez.net/forums/d1.../#post10762285
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  3. #3
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 233
    Points : 462
    Points
    462
    Par défaut
    Merci très intéressant, je vais tester tout cela mais je ne comprends pas tout

    il faut en faire autant qu'il y a de fenêtres ouvertes dans l'application
    Il faut le faire aussi pour les fenêtres ouvertes dans les autres classeurs que le classeur actif ?

    le code à prévoir est comme cela ?:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Sub Test()
        Application.ScreenUpdating = False
        Set w1 = Workbooks.Add(xlWBATWorksheet)
        Set w2 = Workbooks.Add(xlWBATWorksheet)
        Set w3 = Workbooks.Add(xlWBATWorksheet)
     
    ' je mets mon code ici ?
     
        Application.ScreenUpdating = True
     
    ' ou ici ?
     
     Sub  ForEachWinDoEvents
     
    ' dans le meme module ?
     
        w2.Activate
    End Sub
     
    Sub ForEachWinDoEvents()
    Dim win As Window
    Il ne savait pas que c'était impossible, donc il l' a fait...

  4. #4
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Re,
    Citation Envoyé par retraite83 Voir le message
    Il faut le faire aussi pour les fenêtres ouvertes dans les autres classeurs que le classeur actif ?
    C'est exactement ce que démontre cette petite démo !
    Je n'ai pas rencontré ce problème lorsqu'il n'y a qu'un seul classeur ouvert et je n'ai pas testé avec plusieurs fenêtres d'un même classeur.
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  5. #5
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 233
    Points : 462
    Points
    462
    Par défaut
    Ok

    tu parles de démo ? je vois ton code mais en plus tu as un fichier démo ? je ne le vois pas
    Il ne savait pas que c'était impossible, donc il l' a fait...

  6. #6
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    La démo, c'est le(s) code(s) (sans et avec la ligne ForEachWinDoEvents)
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  7. #7
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 233
    Points : 462
    Points
    462
    Par défaut
    Je vais tester et essayer de comprendre tout ça.

    En fait j'ai un classeur lanceur de l'application et ensuite les feuilles et les classeurs s’enchaînent suivant le choix de l'utilisateur

    J'ai l'habitude (peut être mauvaise) de commencer chaque par macro par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = False
    Dois-je mettre ton code dans chaque macro ou seulement sur la première macro du classeur lanceur ou de chaque classeur

    En d'autres termes ton code reste-t-il opérationnel pendant toute la session Excel ?
    Il ne savait pas que c'était impossible, donc il l' a fait...

  8. #8
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Re,
    Citation Envoyé par retraite83 Voir le message
    J'ai l'habitude (peut être mauvaise) de commencer chaque par macro par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = False
    Dois-je mettre ton code dans chaque macro ou seulement sur la première macro du classeur lanceur ou de chaque classeur
    En d'autres termes ton code reste-t-il opérationnel pendant toute la session Excel ?
    En fait c'est pas cette ligne qui pose problème, c'est celle qui rétablit l'affichage (que certains omettent par négligence ou par manque de rigueur) qu'on doit se trouver dans chaque procédure où se trouve ta ligne qui désactive l'affichage :
    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = True
    Lorsque plusieurs classeurs sont ouverts, elle doit être systématiquement suivie de l'appel à la procédure :
    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    Call ForEachWinDoEvents
    pour éviter le problème d'affichage constaté dans la démo.
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  9. #9
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 233
    Points : 462
    Points
    462
    Par défaut
    Oui, je suis très rigoureux et je mets systématiquement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = True
    à la fin de mes macros qui ont cette ligne au début
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = False
    Quel est à ton sens la meilleure méthode ?

    Est-ce la séquence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Application.ScreenUpdating = False
    Application.ScreenUpdating = True
    ou ton code ?
    Il ne savait pas que c'était impossible, donc il l' a fait...

  10. #10
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Re,

    Deux cas se présentent :
    1 Plusieurs classeurs sont ouverts (ou plusieurs fenêtres d'un même classeur) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Sub TaMacro1()
        Application.ScreenUpdating = False
        ' Ici le code de ta première macro
        ' ...
        Application.ScreenUpdating = True
        Call ForEachWinDoEvents
    End Sub
    Sub TaMacro2()
        Application.ScreenUpdating = False
        ' Ici le code de ta seconde macro
        ' ...
        Application.ScreenUpdating = True
        Call ForEachWinDoEvents
    End Sub
    Sub ForEachWinDoEvents()
    Dim win As Window
      For Each win In Application.Windows
        DoEvents
      Next win
    End Sub
    2 un seul classeur (une seule fenêtre) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub TaMacro1()
        Application.ScreenUpdating = False
        ' Ici le code de ta première macro
        ' ...
        Application.ScreenUpdating = True
    End Sub
    Sub TaMacro2()
        Application.ScreenUpdating = False
        ' Ici le code de ta seconde macro
        ' ...
        Application.ScreenUpdating = True
    End Sub
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  11. #11
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 233
    Points : 462
    Points
    462
    Par défaut
    Merci, je vais tester tout ça sur mon appli et reviendrais donner mon résultat

    Mes macros sont chacune dans un module. Il y a plusieurs classeurs ouverts en même temps.

    Je vais donc créer également dans chaque classeur un module :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub ForEachWinDoEvents()
    Dim win As Window
      For Each win In Application.Windows
        DoEvents
      Next win
    End Sub
    meme si je ne vois pas bien ce que fait cette macro : Je me pose une autre question, si on code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = False
    (sans remettre "Application.ScreenUpdating = True")
    dans la 1ere macro, cette ligne n'est-elle pas opérationnelle pour toute la session Excel ?
    Il ne savait pas que c'était impossible, donc il l' a fait...

  12. #12
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Citation Envoyé par retraite83 Voir le message
    Je me pose une autre question, si on code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = False
    (sans remettre "Application.ScreenUpdating = True")
    dans la 1ere macro, cette ligne n'est-elle pas opérationnelle pour toute la session Excel ?
    Non, quand les macros sont terminées, Excel rétablit à l'actualisation de l'écran (i.e à True), c'est pour ça que certains négligent cette remise à True.
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  13. #13
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 233
    Points : 462
    Points
    462
    Par défaut
    Re-merci

    j'ai fait un test pour comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test()
      msgbox "Texte 1"
      DoEvents
      For i = 1 To 1000000: Next
      msgbox "Texte 2"
      DoEvents
      For i = 1 To 1000000: Next
      msgbox "Texte 3"
    End Sub
    avec et sans "DoEvents". Je commence à comprendre

    Il me reste à bien comprendre où je dois mettre ce DoEvents et combien de fois dans mes macros

    et également voir la différence si Application.ScreenUpdating = True ou pas en fin de macro

    Des tests en perspective...
    Il ne savait pas que c'était impossible, donc il l' a fait...

  14. #14
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Salut.

    Ce n'est pas une question de négligence de ne pas remettre le True à la fin, c'est que cela ne sert à rien... L'écran est toujours rafraîchi juste avant de repasser la main à Excel.

    En fait, avec une bonne architecture de code, il n'y a aucun souci pour gérer correctement le ScreenUpdating. si chaque procédure ne fait qu'une chose et qu'une fonction ne modifie pas l'affichage, il suffit de mettre un Application.ScreenUpdating = False au début de la macro déclenchée par l'utilisateur. Cette macro va appeler les autres macros puis, lorsque le code aura été exécuté (pile d'appels vide), le rafraîchissement sera effectué au moment de rendre la main à Excel (donc tout à la fin de la macro déclenchée par l'utilisateur).

    Autrement dit, une procédure qui contient la ligne ScreenUpdating = False ne devrait jamais appeler une autre procédure qui contient la ligne ScreenUpdating = True. Dès lors, tu n'as plus de problème de rafraîchissement intempestif.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  15. #15
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Ce n'est pas une question de négligence de ne pas remettre le True à la fin, c'est que cela ne sert à rien... L'écran est toujours rafraîchi juste avant de repasser la main à Excel.
    Je viens de refaire le test avec Excel 2013 et 2016 (32 bits) sur ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Test()
        Application.ScreenUpdating = False
        Set w1 = Workbooks.Add(xlWBATWorksheet)
        w1.Worksheets(1).Range("A1").Value = "1° Fichier"
        Set w2 = Workbooks.Add(xlWBATWorksheet)
        w2.Worksheets(1).Range("A1").Value = "2° Fichier"
        Set w3 = Workbooks.Add(xlWBATWorksheet)
        w3.Worksheets(1).Range("A1").Value = "3° Fichier"
        w2.Activate
    End Sub
    et c'est pas w2 qui est affiché à la fin (ni Thisworkbook)!
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  16. #16
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Activer un classeur n'est pas le mettre au premier plan, c'est simplement l'activer. Ca fait de lui l'ActiveWorkbook, rien de plus. Activate n'a pas pour mission de faire passer le classeur à l'avant-plan. Ajoute la ligne Application.ScreenUpdating = True à la fin de ton code (après w2.Activate) et tu constateras que le classeur 2 n'est toujours pas le classeur à l'avant-plan. Ton code ne permet donc pas de prouver que ScreenUpdating = True est nécessaire en fin de macro.

    Lorsque l'on n'a pas inhibé le rafraîchissement d'écran, la méthode Activate passe le classeur à l'avant-plan parce que c'est ce qui est attendu par l'utilisateur, mais si le rafraîchissement est inhibé, le processus ne stocke pas ce qui aurait dû être affiché pour l'afficher lorsqu'on permet à nouveau le rafraîchissement. Ca n'aurait du reste pas beaucoup de sens.

    Cela dit, ScreenUpdating est à manipuler avec prudence, car si tu rafraîchis l'écran juste avant d'activer W2 dans ton code, tu constateras que c'est tout de même W1 qui est à l'avant-plan. Les problèmes de mise à l'avant-plan d'une fenêtre Excel viennent encore compliquer le test et fausser ses résultats. Du reste, le code que tu proposes est un cas d'école qui, à mon avis, ne se rencontre jamais dans la vraie vie.

    Dès lors, ScreenUpdating = False ne devrait être mis qu'au début d'une macro évènementielle, une macro évènementielle ne peut normalement jamais en appeler une autre, ni intentionnellement, ni par levée d'évènement, ce qui implique que normalement, surtout dans Excel, il faut un EnableEvents = False et, dans la macro qui l'a mis à False, une gestion d'erreurs pour remettre EnableEvents = True à la fin de la macro. Avec cette architecture, on n'a aucun problème ni avec le rafraîchissement d'écran, ni avec des évènements qui se télescopent.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  17. #17
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Bonjour Pierre,

    Je ne dis pas que Application.ScreenUpdating = True est nécessaire, mais simplement conseillé, parce je pense qu'avec « une bonne architecture de code »,
    lorsqu'une macro commence par Application.ScreenUpdating = False elle devrait se terminer par Application.ScreenUpdating = True .

    Citation Envoyé par Pierre Fauconnier Voir le message
    Activer un classeur n'est pas le mettre au premier plan, c'est simplement l'activer...
    Si j'ai mis mis cet exemple c'est que je l'ai rencontré, dans une de mes applications, lors du passage de Excel 2007 à Excel 2013.
    Il se trouve que, dans ce cas, avec les dernières versions d'Excel, Application.ScreenUpdating = False perturbe le fonctionnement habituel qu'on constatait avant, ou en son absence. Le classeur au premier plan devrait être W3 (le dernier créé) ou Thisworkbook (celui qui était au premier plan avant d'inhiber l'affichage écran), Rien n'explique que ce soit W1.

    En outre, il suffit d'ajouter à la fin ActiveSheet.Range("A1").Activate pour rétablir l'ordre des chose (pas besoin de ScreenUpdating=True),et dans ce cas Activate à bien pour effet de mettre la feuille au premier plan.
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  18. #18
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Salut Patrice,

    Citation Envoyé par Patrice740 Voir le message
    [...]

    En outre, il suffit d'ajouter à la fin ActiveSheet.Range("A1").Activate pour rétablir l'ordre des chose (pas besoin de ScreenUpdating=True),et dans ce cas Activate à bien pour effet de mettre la feuille au premier plan.
    As-tu testé?

    Chez moi, le code suivant montre bien dans la fenêtre d'exécution que c'est bien la première feuille de W2, nommée Test, qui est active, et pourtant, à la fin de la macro lorsque la main est rendue à Excel, c'est toujours le classeur 1 qui est à l'avant-plan.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Test()
      Dim w1 As Workbook, w2 As Workbook, w3 As Workbook
     
      Application.ScreenUpdating = False
      Set w1 = Workbooks.Add()
      Set w2 = Workbooks.Add()
      w2.Worksheets(1).Name = "test"
      Set w3 = Workbooks.Add()
      w2.Activate
      Debug.Print ActiveSheet.Name
      ActiveSheet.Range("a1").Activate
    End Sub
    Du reste, même en rétablissant le rafraîchissement avant l'activation, rien n'y fait et c'est toujours w1 qui est à l'avant-plan. Je suis d'accord avec toi pour dire que ce n'est pas un comportement normal, mais c'est ainsi.

    Tu dis toi-même
    Citation Envoyé par Patrice740 Voir le message
    Non, quand les macros sont terminées, Excel rétablit à l'actualisation de l'écran (i.e à True)
    Dès lors, à moins d'être payé à la ligne de code, à quoi sert de coder des lignes inutiles?

    Cela dit, la solution que tu as proposée dans l'autre discussion fonctionne, avec toutefois un léger clignotement d'écran. Si j'avais ce genre de process à mettre en place, je pense que je mettrais un message en fin de macro, juste avant de rendre la main, et alors, ta proc ForEachWinDoEvents serait inutile car l'affichage du msgbox "rendrait la main" correctement à Excel après, en affichant bien w2. A nouveau, pas besoin de ScreenUpdating = True dans ce cas. Il faut d'ailleurs noter que si, dans le code suivant on plaçait un ScreenUpdating = True avant w2.activate, le msgbox s'afficherait sur le w1 visible, w2 ne devenant visible que lorsque l'on rend effectivement la main à Excel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Test()
      Dim w1 As Workbook, w2 As Workbook, w3 As Workbook
     
      Application.ScreenUpdating = False
      Set w1 = Workbooks.Add()
      Set w2 = Workbooks.Add()
      w2.Worksheets(1).Name = "test"
      Set w3 = Workbooks.Add()
      w2.Activate
      MsgBox "Le traitement est terminé"
    End Sub

    Après, je ne place pas sur le plan d'une architecture de code, bonne ou mauvaise, le fait de placer une ligne de code en fin de macro, qui plus est lorsqu'elle est inutile, puisque je maintiens qu'elle est inutile. Je dis qu'il n'y a pas de problème avec ScreenUpdating dans le cas d'une architecture correcte, et le fait que tu aies trouvé cet exemple quelque part ne prouve pas qu'il soit utile ni qu'il participe à une bonne architecture. Les expériences menées ici tendraient même à prouver qu'il y a un défaut d'architecture derrière puisque w2 n'est pas à l'avant-plan en fin de macro, avec ou sans Screenupdating = True. Je ne vois pas de situation concrète et réelle qui impose d'ouvrir trois classeurs pour activer le deuxième. Ca reste donc pour moi un cas d'école qui n'a aucune réalité tangible

    Cela dit, c'est juste mon avis et n'y vois aucune attaque personnelle.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  19. #19
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 233
    Points : 462
    Points
    462
    Par défaut
    Bonjour,

    pardon de revenir dans la discussion de façon un peu terre à terre, mais je ne saisi pas toujours toutes vos précisions. En terme de précision quand je me suis lancé dans l'aventure en juillet 2017 pour aider la petite entreprise de ma fille je ne savais même pas ce que voulait dire "Sub"

    Ce qui explique que forcément mes 30 classeurs et 150 macros écrites depuis n'ont surement pas une architecture parfaite, mais l'ensemble marche parfaitement bien avec 8 utilisateurs en ligne;

    Forcément j'ai galéré, forcément j'ai posé des questions que je juge idiotes maintenant, le forum m'a sauvé à maintes reprise comme il sauve la masse de gens comme moi (remerciements)

    Pour revenir à mes tentatives d'amélioration, voilà le premier cas concret d'affichage que je constate :

    Mon premier classeur permet à l’utilisateur de s'identifier, ensuite il ouvre le classeur suivant. Et là curieusement (pour moi) juste avant l'affichage de la feuille voulue de ce classeur apparaît de manière furtive à l'écran : le bureau ou l'explorateur ou un word si word est ouvert

    Ce n'est pas dramatique mais je cherche à comprendre
    Il ne savait pas que c'était impossible, donc il l' a fait...

  20. #20
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Salut Retraité83,

    Avec un classeur qui en ouvre potentiellement 30, utilisés potentiellement par 8 utilisateurs, c'est sûr que j'ai envie de soulever un problème d'architecture. Dès lors, il faut accepter les limites de l'architecture que tu as mise en place et en accepter les "faiblesses", notamment en terme de rafraîchissement d'écran. Et à nouveau, pas d'attaque personnelle de ma part ici, mais un simple constat technique. Je pense d'ailleurs que "30 classeurs avec 8 utilisateurs en ligne" met en évidence qu'Excel n'est pas la solution la meilleure à ton besoin , mais tant mieux si ça fonctionne parfaitement.

    La solution proposée plus haut par Patrice pourra probablement fonctionner dans ton cas, mais tu auras de toute façon un certain clignotement d'écran en fin de macro. Mais sans voir le déroulement du processus, au moins schématique, et en supposant que dans ce genre de montage, tu risques fort d'avoir des évènements qui se déclenchent en cascade, reprenant ou donnant potentiellement la main à Excel ou à un autre process en cours (hors Excel), il est difficile de dire exactement où le problème se pose et comment le résoudre.

    Il faut comprendre que DoEvents amène le process VBA à passer la main au processeur pour qu'il traite les évènements qui sont sur la pile d'attente, que ces évènements soient des évènements d'Excel ou d'autres applications. C'est pourquoi les DoEvents amènent souvent des problèmes d'écran, car ScreenUpdating, c'est un truc Excel, pas Windows. Ce n'est que le rafraîchissement des écrans de l'instance d'Excel qui a placé le rafraîchissement à True, les autres modifications d'écran (d'une autre instance d'Excel ou d'une autre appli) ne sont en rien concernées par ce "gel d'écran".
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Comment cela fonctionne ?
    Par AuraHxC dans le forum Bibliographies - Index - Glossaires
    Réponses: 2
    Dernier message: 09/11/2009, 12h01
  2. ouinon comment cela fonctionne ?
    Par chapeau_melon dans le forum WinDev
    Réponses: 5
    Dernier message: 19/02/2008, 11h16
  3. snprintf comment cela fonctionne?
    Par deck_bsd dans le forum C
    Réponses: 3
    Dernier message: 24/11/2006, 15h20
  4. [Berkley DB] Comment cela fonctionne ?
    Par saidus dans le forum Autres SGBD
    Réponses: 1
    Dernier message: 22/02/2006, 17h49
  5. [Caml] Du mal à comprendre comment cela fonctionne...
    Par Sir Caedes dans le forum Caml
    Réponses: 16
    Dernier message: 05/01/2006, 11h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo