Macro excel

Utilisateur anonyme -  
Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   -
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

  1. Mytå Messages postés 4246 Date d'inscription   Statut Contributeur Dernière intervention   958
     
    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å
    0
  2. Utilisateur anonyme
     
    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
    0
  3. Mytå Messages postés 4246 Date d'inscription   Statut Contributeur Dernière intervention   958
     
    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å
    0
    1. Utilisateur anonyme
       
      Re,

      pas de changement, ça surbrille toujours autant.
      0
  4. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
     
    Bonjour,

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

    Patrice

    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Utilisateur anonyme
     
    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
    0
  7. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
     
    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.
    0
    1. Utilisateur anonyme
       
      Bonjour,

      Merci.

      J'ai modifié mes macros comme vous me l'avez indiqué, mais cela ne change rien.
      Ma feuille surbrille toujours autant.
      0
  8. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
     
    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 ! »
    0
  9. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
     
    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
    ...
    


    0
    1. Utilisateur anonyme
       
      avec DoEvents pas de changement.

      Oui j'ai des espèce de clignotements.
      0
  10. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
     
    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
    0