[Résolu] optimisation d'une boucle conditionnelle

racoune

XLDnaute Nouveau
Bonjour mesdames et messieurs.

Cela fait bien longtemps que nous ne nous sommes pas vu (une histoire de quelques semaine à peine hum hum) et, étant donné la vivacité des esprits des membres du forum (et cela n'est pas une boutade), je me permets de (re)venir vers vous.

Mais cette fois c'est plus dans l'optique d'une amélioration/optimisation d'un code afin de gagner du temps.

En fait, j'utilise une macro me permettant de cacher certaines lignes d'un tableau (les dites lignes sont masquées en fonction du remplissage ou non d'une cellule présente dans chaque ligne, bref). Cela uniquement sur 37 lignes. Ça ne parait pas énorme et pourtant, en fonction des ordinateurs (plusieurs postes, pas tous avec la même configuration mais en général pas une config exceptionnelle), l'action peut soit prendre plusieurs minutes, soit faire planter la machine.

Voici l'objet du délit:

Code:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim ligne As Integer

If Range("E3") = "" Then
Exit Sub
End If

MsgBox ("le planning s'initialise, cela peut prendre quelques minutes. Veuillez patienter")
majuscule

If Not Intersect(Target, Range("E3")) Is Nothing Then

For ligne = 7 To 37
    If Cells(ligne, 4) = "m" Then
        Rows(ligne & ":" & ligne).EntireRow.Hidden = True
    End If
Next

End If

End Sub

Il s'avère que le problème semble lié à l'emplacement de la macro "majuscule" (qui permet uniquement que le texte de la cellule passe obligatoirement en majuscule) et de la msgbox.
En effet, lorsque je les supprime, la macro se lance quasi instantanément.

Comment les placer convenablement pour éviter les latences?

[EDIT] le message initial a été modifié suite à la découverte citée au-dessus. Merveilleux!
 
Dernière édition:

pierrejean

XLDnaute Barbatruc
Re : optimisation d'une boucle conditionnelle

Bonjour racoune

Edit : Salur Roland_M

A tester:

Code:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim ligne As Integer

If Range("E3") = "" Then
Exit Sub
End If

Application.EnableEvents = False

MsgBox ("le planning s'initialise, cela peut prendre quelques minutes. Veuillez patienter")
majuscule

If Not Intersect(Target, Range("E3")) Is Nothing Then

For ligne = 7 To 37
    If Cells(ligne, 4) = "m" Then
        Rows(ligne & ":" & ligne).EntireRow.Hidden = True
    End If
Next

End If
Application.EnableEvents = True
End Sub
 

racoune

XLDnaute Nouveau
Re : optimisation d'une boucle conditionnelle

Bonjour à vous et désolé pour ce délai de réponse (surtout que vous avez été super rapides à répondre).

Pour commencer, Roland_M, la macro majuscule se trouve dans le même classeur et ce n'est pas une "privatesub".
Pour continuer, merci à toi pierrejean car ta proposition fonctionne vraiment à merveille.

Et une dernière petite question pour compléter mon manque de connaissance: pourriez-vous m'expliquer comment fonctionne la fonction "Application.EnableEvents" s'il vous plait? Parce que je ne comprends pas comment elle agit à vrai dire (je comprends que ça met fin à une boucle sans fin si on peut dire mais dans ce cas pourquoi ma macro pouvait entrainer une telle boucle?)

Encore merci à vous.

[EDIT] toutes mes excuses car c'est du question-réponse. Donc sauf erreur, Application.EnableEvents=False va permettre de casser la condition "si la cellule E3 n'est pas vide" pour lancer la boite de message, la macro majuscule et le masquage des lignes et tout autre macro évènementielle puis Application.EnableEvents=True permet de relancer toutes les macro évènementielles, c'est bien ça?
En gros, auparavant la condition "si la cellule E3 n'est pas vide" était vérifiée X fois avec un retour au point de départ à chaque fois, c'est bien ça aussi?
 
Dernière édition:

pierrejean

XLDnaute Barbatruc
Re : optimisation d'une boucle conditionnelle

Re
Effectivement:
La macro majuscule modifiait la cellule E3 ce qui relançait la macro Change qui relançait la macro majuscule qui ......
En interdisant les macros événementielles par Application.EnableEvents = False on casse ce processus
NB: Surtout ne pas oublier de re-autoriser avant la fin de la macro
 

Statistiques des forums

Discussions
312 193
Messages
2 086 059
Membres
103 110
dernier inscrit
Privé