Macro excel

Bonjour,

J'utilise Excel 2003. Pour plus de logique sur ma page Menu, j'ai la macro suivante :

Sub Masquer_Afficher_Lignes()
Application.ScreenUpdating = False
If Sheets(1).Range("D16") = "" Then
Rows("20:50").EntireRow.Hidden = True
End If

If Sheets(1).Range("D16") = "Contrôle Aléatoire" Then
Rows("16:18").EntireRow.Hidden = True
Rows("19:29").EntireRow.Hidden = False
Rows("30:50").EntireRow.Hidden = True
Sheets(1).Range("D22").Select
End If

If Sheets(1).Range("D16") = "Audit CSO" Then
Rows("16:29").EntireRow.Hidden = True
Rows("30:37").EntireRow.Hidden = False
Rows("38:50").EntireRow.Hidden = True
Sheets(1).Range("D32").Select
End If

If Sheets(1).Range("D16") = "Audit Prestation" Then
Rows("16:37").EntireRow.Hidden = True
Rows("38:50").EntireRow.Hidden = False
Sheets(1).Range("D40").Select
End If
Application.ScreenUpdating = True
End Sub

Mais ma feuille Excel surbrille beaucoup lors de l'exécution de la macro.
Sauriez vous ce comment je pourrai modifier cette macro afin d'éviter cela.

Merci d'avance.

Laure

10 réponses

  • Votes
  • Date
  • Date décroissante
  1. Contributeur
    Salut le forum

    «Mais ma feuille Excel surbrille beaucoup lors de l'exécution de la macro.»

    Je ne rencontre pas ce problème avec ton code.

    Tu l'appelles depuis une autre macro ?

    Mytå
    1. Bonsoir

      oui je l'appele à partir de la macro suivante :

      Sub Worksheet_Change(ByVal Target As Excel.Range)

      Application.ScreenUpdating = False

      If (Target.Column = 4) And (Target.Row = 16 Or Target.Row = 22 Or Target.Row = 34 Or Target.Row = 42) Then
      Masquer_Afficher_Lignes
      Masquer_Bouton
      End If

      If (Target.Column = 4) And (Target.Row = 22 Or Target.Row = 24) Then
      Masquer_Afficher_Feuille
      End If

      Application.ScreenUpdating = True

      End Sub
      1. Contributeur
        Re le forum

        Essaye avec ceci à la place de ta macro
        Sub Worksheet_Change(ByVal Target As Excel.Range)
        
        Application.ScreenUpdating = False
        
        If (Target.Column = 4) And (Target.Row = 16 Or Target.Row = 22 Or Target.Row = 34 Or Target.Row = 42) Then
        Application.EnableEvents = False
        Masquer_Afficher_Lignes
        Masquer_Bouton
        End If
        
        If (Target.Column = 4) And (Target.Row = 22 Or Target.Row = 24) Then
        Application.EnableEvents = False
        Masquer_Afficher_Feuille
        End If
        
        Application.EnableEvents = True
        Application.ScreenUpdating = True
        
        End Sub
        

        Mytå
        1. Re,

          pas de changement, ça surbrille toujours autant.
      2. Bonjour,

        Moi non plus je ne rencontre pas ce problème,
        cela vient peut-être de « Masquer_Bouton »

        Patrice

        1. Bonjour,

          voici la macro Masquer_Bouton

          Sub Masquer_Bouton()

          If Sheets(1).Range("D16") = "" Then
          CommandButton1.Visible = False
          CommandButton2.Visible = False
          CommandButton3.Visible = False
          CommandButton4.Visible = False
          CommandButton5.Visible = False
          CommandButton6.Visible = False
          CommandButton7.Visible = False
          End If

          If Sheets(1).Range("D16") = "Contrôle Aléatoire" And Sheets(1).Range("D22") = "" Then
          CommandButton1.Visible = False
          CommandButton2.Visible = False
          CommandButton3.Visible = False
          CommandButton4.Visible = False
          CommandButton5.Visible = True
          ElseIf Sheets(1).Range("D16") = "Contrôle Aléatoire" And Sheets(1).Range("D22") = "Diffuser les Fichiers" Then
          CommandButton1.Visible = True
          CommandButton2.Visible = False
          CommandButton3.Visible = False
          CommandButton4.Visible = False
          CommandButton5.Visible = True
          ElseIf Sheets(1).Range("D16") = "Contrôle Aléatoire" And Sheets(1).Range("D22") = "Analyser les Résultats" Then
          CommandButton1.Visible = False
          CommandButton2.Visible = False
          CommandButton3.Visible = False
          CommandButton4.Visible = False
          CommandButton5.Visible = True

          End If

          If Sheets(1).Range("D16") = "Audit CSO" Then
          CommandButton1.Visible = False
          CommandButton2.Visible = False
          CommandButton3.Visible = False
          CommandButton4.Visible = False
          CommandButton6.Visible = True
          End If

          If Sheets(1).Range("D16") = "Audit Prestation" And Sheets(1).Range("D42") = "" Then
          CommandButton1.Visible = False
          CommandButton2.Visible = False
          CommandButton3.Visible = False
          CommandButton4.Visible = False
          CommandButton7.Visible = True
          ElseIf Sheets(1).Range("D16") = "Audit Prestation" And Sheets(1).Range("D42") = "Procéder à un Audit Prestation" Then
          CommandButton1.Visible = False
          CommandButton2.Visible = True
          CommandButton3.Visible = True
          CommandButton4.Visible = False
          CommandButton7.Visible = True
          ElseIf Sheets(1).Range("D16") = "Audit Prestation" And Sheets(1).Range("D42") = "Analyser les Résultats Prestation" Then
          CommandButton1.Visible = False
          CommandButton2.Visible = False
          CommandButton3.Visible = False
          CommandButton4.Visible = True
          CommandButton7.Visible = True

          End If

          End Sub
          1. Bonjour,

            Effectivement la première macro (Masquer_Afficher_Lignes) se termine par une réactivation de la mise à jour écran (Application.ScreenUpdating = True) et donc lors de la seconde (Masquer_Bouton) l'écran est mis à jour à chaque modification.

            Dans les deux procédures Masquer_Bouton et Masquer_Afficher_Lignes, modifie la désactivation de la mise à jour écran comme suit :

            au début :

            Dim scr As Boolean
            scr = Application.ScreenUpdating
            Application.ScreenUpdating = False

            et à la fin :

            Application.ScreenUpdating = scr


            De cette manière, lorsque les macros sont appelées par une autre (Worksheet_Change) qui désactive la mise à jour écran, cette désactivation ne sera pas annulée lors de la fin de la macro appelée, la réactivation sera commandée par la macro appelante.

            Cordialement
            Patrice.
            1. Bonjour,

              Merci.

              J'ai modifié mes macros comme vous me l'avez indiqué, mais cela ne change rien.
              Ma feuille surbrille toujours autant.
          2. Re bonjour,

            Met un exemple de ton fichier (après avoir remplacé les informations confidentielles) sur https://www.cjoint.com/ et met le lien sur ton prochain poste

            Nicolas dit toujours : « C'est facile quand on connait la réponse ! »
            1. Je ne rencontre pas de problème avec le fichier.

              Quand : Lors de la sélection du type de contrôle ?

              Que veux-tu dire par : « Mais ma feuille Excel surbrille beaucoup lors de l'exécution de la macro ». Est-ce des clignotements ?

              A tout hasard, essaie d'ajouter un DoEvents au début de la procédure appelante :

              Sub Worksheet_Change(ByVal Target As Excel.Range)
              DoEvents
              Application.ScreenUpdating = False
              ...
              


              1. avec DoEvents pas de changement.

                Oui j'ai des espèce de clignotements.
            2. Re bonjour,

              Effectivement j'ai un clignotement lorsque l'on agit sur un bouton Retour

              Cela vient du fait que la procédure Retour() modifier la feuille et provoque l'évènement change et donc exécuter Worksheet_Change à chaque modification.

              Il faut appliquer dans Retour() la solution proposée par Mytå :

              Au début :
              Sub Retour()
              Application.EnableEvents = False
              ...

              et à la fin :
              Application.EnableEvents = True
              End sub

              Cordialement