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 Sub

bonjour,

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 Userform

Bonjour 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 Sub

Bonjour BsAlv

J'ai eu un peu de mal à implémenter votre code mais cela fonctionne parfaitement.

Merci beaucoup pour votre aide.

Rechercher des sujets similaires à "optimisation code"