Fichier Excel lent à cause d'une macro.

Résolu/Fermé
Steeve999 Messages postés 16 Date d'inscription lundi 17 juillet 2017 Statut Membre Dernière intervention 24 avril 2018 - Modifié le 21 août 2017 à 11:11
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 - 23 août 2017 à 12:13
Bonjour,

J'ai un fichier Excel qui devient lent quand je fais exécuter une macro.
Par exemple quand je remplis une case ou j’efface des données d'un case il reste environ 4 ou 5 seconde pour faire l'action et ça à cause du la macro car quand je l'ai effacée le fichier fonctionne parfaitement. (Vous trouverez la macro en dessous).
Je demande est ce qu'il y a une solution ?
Merci d'avance.



Macro
Private Sub Worksheet_Change(ByVal Target As Range)


 Sheets("Fiche_opérateur").Range("a67:a77").EntireRow.Hidden = False


If Range("E25").Value = 5 Then

  Sheets("Fiche_opérateur").Range("a67:a77").EntireRow.Hidden = True
  
   Sheets("Rapport").Range("a132:a142").EntireRow.Hidden = True
  
End If

If Range("E25").Value = 9 Then

  Sheets("Fiche_opérateur").Range("a71:a77").EntireRow.Hidden = True
  
  Sheets("Rapport").Range("a132:a142").EntireRow.Hidden = False
  Sheets("Rapport").Range("a136:a142").EntireRow.Hidden = True
 
End If

If Range("E25").Value = 12 Then

  Sheets("Fiche_opérateur").Range("a74:a77").EntireRow.Hidden = True
  
    Sheets("Rapport").Range("a132:a142").EntireRow.Hidden = False
  Sheets("Rapport").Range("a139:a142").EntireRow.Hidden = True
  
End If

If Range("E25").Value = 14 Then

  Sheets("Fiche_opérateur").Range("a76:a77").EntireRow.Hidden = True
  
    Sheets("Rapport").Range("a132:a142").EntireRow.Hidden = False
  Sheets("Rapport").Range("a141:a142").EntireRow.Hidden = True
  
End If

If Range("E25").Value = 15 Then
 
  Sheets("Fiche_opérateur").Range("a77").EntireRow.Hidden = True
  
     Sheets("Rapport").Range("a132:a142").EntireRow.Hidden = False
    Sheets("Rapport").Range("a142").EntireRow.Hidden = True
  
End If

If Range("E25").Value = 19 Then
  
  Sheets("Fiche_opérateur").Range("a132:a142").EntireRow.Hidden = False
     
End If


If Range("I32") = "Vous pouvez ne pas mesurer K2A" Then
  Sheets("Fiche_opérateur").Range("a61").EntireRow.Hidden = True
  
  Sheets("Rapport").Range("a126").EntireRow.Hidden = True
  
  End If
  
  If Range("I32") = "Il faut mesurer K2A" Then
  Sheets("Fiche_opérateur").Range("a61").EntireRow.Hidden = False
  
    Sheets("Rapport").Range("a126").EntireRow.Hidden = False
    
  End If


 If Range("I32") = "Vous pouvez ne pas mesurer K2A" Then
  Sheets("Fiche_opérateur").Range("a98:a185").EntireRow.Hidden = True
  
  End If
  
   If Range("I32") = "Il faut mesurer K2A" Then
  Sheets("Fiche_opérateur").Range("a98:a185").EntireRow.Hidden = False
  
  End If
  


     If Range("I32") = "Vous pouvez ne pas mesurer K2A" Then
  Sheets("Fiche_opérateur").Range("a98:a185").EntireRow.Hidden = True
  End If
  
  
    If Range("I32") = "Il faut mesurer K2A" Then
  Sheets("Fiche_opérateur").Range("a98:a185").EntireRow.Hidden = False
  
  If Range("N11").Value <= 2 Then
  Sheets("Fiche_opérateur").Range("a124:a185").EntireRow.Hidden = True
  
    If Range("N11").Value < 2 * Range("N12").Value Then
  Sheets("Fiche_opérateur").Range("a124:a185").EntireRow.Hidden = True
  
End If
End If
End If

If Range("I32") = "Il faut mesurer K2A" Then
  If Range("N11").Value > 2 Then
  Sheets("Fiche_opérateur").Range("a124:a185").EntireRow.Hidden = False
 End If
 
If Range("N11").Value > 2 * Range("N12").Value Then
  Sheets("Fiche_opérateur").Range("a124:a185").EntireRow.Hidden = False
End If

End If
 


If Range("d6") = "Sonomètre" Then
    
    Sheets("Détail résultats Sonomètre").Visible = True
    Sheets("Détail résultats Centrale LANXI").Visible = False
    

    Sheets("Fiche_opérateur").Range("a57:a58").EntireRow.Hidden = True
    Sheets("Fiche_opérateur").Range("a59").EntireRow.Hidden = False
    Sheets("Fiche_opérateur").Range("a190").EntireRow.Hidden = True
    
    Sheets("Rapport").Range("a122:a123").EntireRow.Hidden = True
    Sheets("Rapport").Range("a124").EntireRow.Hidden = False
    
   
End If
    
If Range("d6") = "Centrale d'acquisition" Then
   
    Sheets("Détail résultats Centrale LANXI").Visible = True
    Sheets("Détail résultats Sonomètre").Visible = False
   

    Sheets("Fiche_opérateur").Range("a57:a58").EntireRow.Hidden = False
    Sheets("Fiche_opérateur").Range("a59").EntireRow.Hidden = True
    
      Sheets("Rapport").Range("a122:a123").EntireRow.Hidden = False
    Sheets("Rapport").Range("a124").EntireRow.Hidden = True
    
End If

End Sub


EDIT : Ajout des balises de code (la coloration syntaxique).

Explications disponibles ici :ICI

Merci d'y penser dans tes prochains messages.
Jordane45
A voir également:

2 réponses

jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
21 août 2017 à 11:17
Bonjour,


Première chose pour gagner en rapidité ... désactiver l'affichage pendant la macro.
' A mettre au début de ta macro
Application.ScreenUpdating = False

puis le réactiver à la fin
' A mettre à la fin de ta macro
Application.ScreenUpdating = true


Ensuite... si ta macro doit se lancer uniquement si tu changes certaines cellules (ou plages de cellules de ta feuille), tu peux, au début de ta macro, tester où se situe le 'target'
Par exemple : On veut une action quand on Click sur la Cellule "A1" uniquement
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Application.Intersect(Target, Range("A1")) Is Nothing Then
      ' je suis en A1
      MsgBox "Click on " & Target.Address
    End If
    End Sub



Pour continuer à améliorer ton code...
Au lieu de faire de multiples
 If Range("E25").Value = ...  
oriente toi plutot vers un SELECT CASE
elect Case ValeurAVerifier
    Case "condition 1"
        'Code si la "condition 1" est remplie
    Case "condition 2"
        'Code si la "condition 2" est remplie
    Case "condition 3", "condition 4"
        'Code si la "condition 3" ou la "condition 4" est remplie
    
    '...
    
    Case Else
        'code si aucune condition est remplie
End Select


Voila.. déjà avec ça.. tu devrais gagner de temps....

1
Steeve999 Messages postés 16 Date d'inscription lundi 17 juillet 2017 Statut Membre Dernière intervention 24 avril 2018
23 août 2017 à 11:19
Merci ça bien marché
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 211
23 août 2017 à 01:27
Bonjour,

pour être plus précis quel est l'intérêt de refaire par exemple
If Range("E25").Value = 5 Then
Sheets("Fiche_opérateur").Range("a67:a77").EntireRow.Hidden = True
Sheets("Rapport").Range("a132:a142").EntireRow.Hidden = True
End If

à chaque saisie n'importe où ?
Il n'est intéressant de le faire que si c'est E25 qui a changé.
Idem pour I32 et D6
eric
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
23 août 2017 à 08:05
Bonjour eriiic,
Steeve999 n'a pas repondu a la proposition faite par Jordane45, mais, a fait une autre demande
https://forums.commentcamarche.net/forum/affich-34809091-executer-une-macro-lorsque-la-valeur-d-une-cellule-change
0
Steeve999 Messages postés 16 Date d'inscription lundi 17 juillet 2017 Statut Membre Dernière intervention 24 avril 2018
23 août 2017 à 11:20
Bonjour,

Pour E25 et d6 ils changent chaque fois de condition. Mais pour I32 t'as raison il y a des répétitions qui n'ont pas d’intérêt.
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 211
23 août 2017 à 11:43
Pour E25 et d6 ils changent chaque fois de condition
mais tu ne te sers pas QUE de la cellule E25, je suppose que des fois tu saisis ailleurs...
Ces conditions ne sont à tester et à exécuter que si E25 change. Tu te plains de lenteur et tu fais des actions inutiles.
0
Steeve999 Messages postés 16 Date d'inscription lundi 17 juillet 2017 Statut Membre Dernière intervention 24 avril 2018
23 août 2017 à 11:51
Oui voila c'est ça que j'ai demandé dans le deuxième post comme t'a dit f894009.
Je fais exécuter la macro que quand les cellules E25, D6 ou I32 changent.

et maintenant c'est bon le problème et résolu.
Merci beaucoup :)
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 211
Modifié le 23 août 2017 à 12:13
Evite les doublons la prochaine fois, reste sur le même fil.
Ca permet à chacun de suivre et d'éviter les redites inutiles.
eric
0