Optimisation code
Bonjour,
Pourriez vous svp m'aider à optimiser le code ci dessous afin de le rendre plus rapide.
Ce code est affecté à un bouton bascule et lorsque je l'utilise, le temps de traitement est de l'ordre de 30 à 40 secondes pour afficher ou masquer certaines lignes.
Merci pour votre aide.
'Filtre avec switch
Private Sub ToggleButton1_Click()
Dim K As Integer
Dim J As Long
Worksheets("Synthese").Unprotect "toto"
USFWait.Show 0 'Charge le userform d'attente
USFWait.Repaint
Application.ScreenUpdating = False
For I = 11 To 30 'Nb de ligne ? traiter
If ToggleButton1.Value = True Then
If Range("C" & I) = 0 Then Rows(I).EntireRow.Hidden = True 'masque les lignes
Else:
Rows(I).EntireRow.Hidden = False
End If
Next I
Unload USFWait 'decharge le Userform
MsgBox (" Traitement termine ")
Application.ScreenUpdating = True
Worksheets("Synthese").Protect "toto"
End Subbonjour,
je ne vois pas un motif pour ce delai de 30-40 secondes (2 secondes par ligne à cacher = impossible), donc ce n'est peut-être pas dans cette partie, c'est peut-être l'userform ...
USFWait.Repaint
Application.ScreenUpdating = False
If ToggleButton1.Value = True Then
For I = 11 To 30 'Nb de ligne ? traiter
b1 = Rows(I).EntireRow.Hidden 'boolean, is that row hidden ?
b2 = (Range("C" & I) = 0) 'boolean, that row has to be hidden !
If b1 <> b2 Then Rows(I).EntireRow.Hidden = b2 'seulement si les 2 booleans sont pas egal, changer le masque de cette ligne
Next
Else:
Range("A11:A30").EntireRow.Hidden = False
End If
Unload USFWait 'decharge le UserformBonjour BsAlv
A l'aide de votre code, lors du 1ier clic sur le bouton bascule, le délai de masquage des lignes est quasi immédiat (Parfait), seulement lors d'un second clic sur le btn bascule le ré affichage des lignes prend de nouveau 30s.
En clair, seul le masquage est rapide. Avez vous une idée ?
PS : Les lenteurs étaient déjà présentes avant la mise en place du userform.
Merci pour votre aide.
boucle de 100 lignes, la moité (les pairs) sera hidden et reste pas.
On crée 2 plages et à la fin du boucle, on cache ou montre en une fois ces plages
Chez moi, 0.030 sec (< marge d'erreur du chronometre)
Sub teste()
Dim cHidden As Range, cNotHidden As Range '>>> 2 plages pour collectionner les cellules de la colonne A des lignes qui doivent etre hidden or not
t = Timer 'demarrer le chronomètre
Set cHidden = Range("B1") 'une cellule dehors la colonne A (pour commencer)
Set cNotHidden = Range("B1")
For i = 1 To 100 'boucle de 100 lignes, les lignes paires = hidden, unpair = not hidden
If i Mod 2 Then
Set cHidden = Union(cHidden, Range("A" & i)) 'collectionner ces cellules A
Else
Set cNotHidden = Union(cNotHidden, Range("A" & i))
End If
Next
Set cHidden = Intersect(cHidden, Columns("A")) 'eliminer ce dummy cellule B1
If Not cHidden Is Nothing Then cHidden.EntireRow.Hidden = True 'si l'il y a encore des cellules, cacher ces lignes
Set cNotHidden = Intersect(cNotHidden, Columns("A")) 'eliminer ce dummy cellule B1
If Not cNotHidden Is Nothing Then cNotHidden.EntireRow.Hidden = False 'montrer ces lignes
MsgBox Timer - t 'temps
End SubBonjour BsAlv
J'ai eu un peu de mal à implémenter votre code mais cela fonctionne parfaitement.
Merci beaucoup pour votre aide.