Vitesse d'éxécution...

ccdouble6

XLDnaute Occasionnel
Bonjour le Forum,

Utilisateur d'excel 2000 sur un poste de 480Mo de RAM, je souhaite gagner sur le temps d'éxécution de ma macro de "masquage".
Vu mon niveau c'est plutot du système D, mais ça fonctionne. C'est une macro qui masque toutes les lignes qui n'ont pas un X tapé en colonne A (déclenchement par clic sur un bouton).
Je pense l'appliquer à un futur tableau qui risque de comporter beaucoup, beaucoup de lignes, j'envisage donc la capacité maxi de lignes dans ma macro, laquelle tourne actuellement à 100 lignes masquées par seconde (NOTA : il y a aussi une ligne X vers la 8500e).
Ci-joint le fichier de test.
Y a-t-il un moyen de rendre cette macro plus rapide ? ou puis-je en tout cas espérer qu'avec un poste plus puissant elle gagnera en rapidité ?
Je précise qu'à terme le X pourra se déterminer par asso de formules, et que j'envisage l'utilisation du Filtrage automatique en dernier recours.
Merci par avance pour vos lumières et bonne soirée !!
 

Pièces jointes

  • Test-Masq.zip
    7.1 KB · Affichages: 39

JCGL

XLDnaute Barbatruc
Re : Vitesse d'éxécution...

Bonjour à tous,

Ceci devrait être un peu plus rapide :

Code:
Sub MasqMatch()
Application.ScreenUpdating = False
'Ne garde que les lignes =X
Dim i As Long
    For i = 4 To Range("A65536").End(xlUp).Row
    If Range("A" & i) <> "X" Then Rows(i).Hidden = True
    Next i
Application.ScreenUpdating = True
End Sub
A+

Edition : Salut Kiki ;-)
Réédition : Salut Skoobi ;-)
 
Dernière édition:

skoobi

XLDnaute Barbatruc
Re : Vitesse d'éxécution...

Bonjour,
je ne pense pas qu'un poste plus puissant te fera gagner en rapidité.
Bien souvent, c'est la façon dont le code a été conçu qui joue sur la vitesse d'exécution.
Pour ton cas, je crois que tu ne trouveras pas plus rapide que le filtre automatique.
Pourquoi vouloir créer quelque chose que sait très bien faire excel par défaut?

Edit: oupsss, collision, salut JC, kiki29
 

skoobi

XLDnaute Barbatruc
Re : Vitesse d'éxécution...

Bon, aller, après les paroles, place aux actes:

Code:
Sub MasqMatch2()
Application.ScreenUpdating = False
'Ne garde que les lignes =X
Dim i As Long, plage As Range
    For i = 4 To Range("A65536").End(xlUp).Row
    If Range("A" & i) <> "X" Then
      If plage Is Nothing Then
        Set plage = Rows(i)
      Else
        Set plage = Union(plage, Rows(i))
      End If
    End If
    Next i
    plage.EntireRow.Hidden = True
Application.ScreenUpdating = True
End Sub
 

Spitnolan08

XLDnaute Barbatruc
Re : Vitesse d'éxécution...

Bonsoir le fil,:)

Je vous propose une alternative (hors le filtre auto préconisé par Skoobi) qui devrait être beaucoup plus rapide que la boucle for:D :
Code:
Sub MasqMatch()
Dim c As Range
Dim firstAddress as string
Dim PremLig as long, DerLig as Long
Application.ScreenUpdating = false
DerLig = Range("A65536").End(xlUp).Row
With Range("A3:A" & DerLig)
    Set c = .Find("X", LookIn:=xlValues, lookat:=xlWhole)
    If Not c Is Nothing Then
        firstAddress = c.Address
        PremLig = 4
        Do
            Range("A" & PremLig & ":A" & c.Row - 1).EntireRow.Hidden = True
            PremLig = c.Row + 1
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With
Application.ScreenUpdating = True
End Sub
Cordialement

Edit : Je n'ai pas regardé le fichier mais suis parti de la macro de JCGL:)
Donc j'espère ne pas être à côté de la plaque...
 
Dernière édition:

Spitnolan08

XLDnaute Barbatruc
Re : Vitesse d'éxécution...

Re,

Juste pour le fun et pour valider mes certitudes...
J'ai fait un essai sur 9000 lignes avec un "X" en ligne 9000 et 20 "X" placés au hasard.
La solution JCGL = 8.984375
La Solution Skoobi =0.765625
Mine = 0.078125 donc 10 fois plus rapide que Skoobi's et 100 fois plus rapide que JCGL's:)

Donc tu as raison JCGL, ccdouble6 devra changer de carbu s'il veut suivre...:p

Bonne soirée à tous et bonne semaine
 

Spitnolan08

XLDnaute Barbatruc
Re : Vitesse d'éxécution...

Re,

Pour traiter le cas d'"X" successifs, j'ai du ajouter un test qui amoindrit les performances du code. Sa rapidité dépend de plusieurs paramètres :
- Le nombre de "X"
- Le nombre de blocs de "X" consécutifs
Code:
Sub MasqMatch3()
Dim c As Range
Dim firstAddress As String
Dim PremLig As Long, DerLig As Long
Application.ScreenUpdating = False
DerLig = Range("A65536").End(xlUp).Row
With Range("A3:A" & DerLig)
    Set c = .Find("X", LookIn:=xlValues, lookat:=xlWhole)
    If Not c Is Nothing Then
        firstAddress = c.Address
        If Range("A4") = "X" Then GoTo 1
        PremLig = 4
        Do
            If Cells(c.Row - 1, 1) = "X" Then GoTo 1
            Range("A" & PremLig & ":A" & c.Row - 1).EntireRow.Hidden = True
1           PremLig = c.Row + 1
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With
Application.ScreenUpdating = True
End Sub
S'il y a beaucoup d' "X" consécutifs (J'ai fait un test avec 3 blocs d'un total de 5000 "X" consécutifs plus quelques "X" disséminés dont un en ligne 9000) les procédures MasqMatch2 et MasqMatch3 sont équivalentes.
Par contre si le nombre de "X" est faible ou si les X ne sont pas consécutifs, il n'y a pas photo...

J'espère que ce coup ci je n'aurais pas oublié une disquette dans mon ordi...:p

Cordialement
 
Dernière édition:

Cousinhub

XLDnaute Barbatruc
Re : Vitesse d'éxécution...

Allez, pour le fun


Code:
Sub plus_vite()
t = Timer
[A3] = "a": [L1] = "a": [L2] = "X"
Range("A3:A" & [A65000].End(xlUp).Row).Name = "base"
Range("base").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range( _
        "L1:L2"), Unique:=False
[A3] = "": [L1:L2].ClearContents
MsgBox Timer - t
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 489
Messages
2 088 852
Membres
103 975
dernier inscrit
denry