XL 2010 Macro trop lente avec 650 000 lignes

grotsblues

XLDnaute Occasionnel
Bonsoir le forum
J'ai écrit ce code que je dois exécuter sur une feuille qui contient plus de 650 000 lignes et celui-ci est très lent. Pouvez-vous m'aider car je ne comprend pas pourquoi ?
Merci pour vos réponses

Sub statutEetM()

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim derligne As Long
derligne = range("A2").End(xlDown).Row + 1
For ligne = 3 To derligne

If range("AF" & ligne).Value = "E" Or range("AF" & ligne).Value = "M" Then
range("AK" & ligne).Value = "NON"
Else: range("AK" & ligne).Value = "OUI"

End If
Next ligne

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
 

Jacky67

XLDnaute Barbatruc
Bonsoir le forum
J'ai écrit ce code que je dois exécuter sur une feuille qui contient plus de 650 000 lignes et celui-ci est très lent. Pouvez-vous m'aider car je ne comprend pas pourquoi ?
Merci pour vos réponses
Bonjour,
C'est que, une boucle sur plus de 650 000 lignes, c'est forcement long
Une proposition en passant par un filtre devrait être pratiquement instantané
VB:
Sub statutEetM()
    Dim DerLigne As Long, Plage
    With Feuil1    '********Adapter le codename de la feuille
        DerLigne = .Cells(.Rows.Count, "A").End(xlUp).Row
        If DerLigne < 3 Then Exit Sub
        Application.ScreenUpdating = False: Application.Calculation = xlCalculationManual
        If .FilterMode Then .ShowAllData
        .Range("ak2:ak" & .Rows.Count) = ""
        .Range("ak2:ak" & DerLigne) = "OUI"
        Set Plage = .Range("af1:af" & DerLigne)
    End With
    On Error Resume Next
    Plage.AutoFilter Field:=1, Criteria1:="=E", Operator:=xlOr, Criteria2:="=M"
    Plage.Offset(1, 5).Resize(Plage.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Value = "NON"
    Plage.AutoFilter
    Application.ScreenUpdating = True: Application.Calculation = xlCalculationAutomatic
End Sub
 
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
Bonjour grotsblues, le fil,

Titre du sujet : « Macro trop lente avec 650 000 lignes »

650 000 lignes ! tant que ça !!! :oops:o_Oo_Oo_O:oops:

Bon, une suggestion alors : propose ta candidature à l'équipe de développement de
Microsoft Windows : tu leur seras sûrement très utile pour continuer l'écriture de
la future version de Windows 11 ; et ne t'inquiètes pas si tu fais quelques erreurs
d'encodage : ils en ont pris l'habitude depuis longtemps, et ça leur permet d'offrir
de temps à autres des patchs de mises à jour, via Windows Update. :)


-------------------------------------------------------------------------------------------

Edit : oooooops ! j'ai cru que c'était la macro qui faisait 650 000 lignes !!! :oops::rolleyes:
évidemment, si c'est l'exécution de la macro sur 650 000 lignes qui est lente,
c'est un autre problème ! que @mapomme a réglé en 1,85 sec top chrono (#6)


soan
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Une illustration pour 600 000 lignes dans le fichier joint.
Sur mon PC, le remplissage de la colonne K se fait en 1,85 sec.
Le code est dans module1 :
VB:
Sub statutEetM()
Dim der&, i&, deb#
   deb = Timer
   Application.ScreenUpdating = False
   der = Cells(Rows.Count, "a").End(xlUp).Row
   Range("ak2:ak" & der).Formula = "=IF(OR(RC[-5]=""E"",RC[-5]=""M""),""Non"",""Oui"")"
   Range("ak2:ak" & der) = Range("ak2:ak" & der).Value
  MsgBox "remplissage colonne AK en " & Format(Timer - deb, "0.00\ sec")
End Sub
 

Pièces jointes

  • grotsblues- 600 000 lignes- v1.xlsm
    18.7 KB · Affichages: 30
Dernière édition:

grotsblues

XLDnaute Occasionnel
Bonsoir jacky67

J'ai modifié
.range("ak3:ak" & .Rows.Count) = ""
.range("ak3:ak" & DerLigne) = "OUI"
Set Plage = .range("AF3:AF" & DerLigne)
Si j'ai bien compris le code, elle remplit toutes les cellules avec "OUI" et elle effectue un filtre pour mettre les cellules en "NON", le souci est quelle ne met aucune cellule en "NON".
J'espère avoir été clair.
merci pour votre aide
 

mapomme

XLDnaute Barbatruc
Supporter XLD
@Jacky67 :),

Ta dernière réflexion a fait remonter un vieux souvenir. A partir d'une certaine taille de plage, me semble-t-il, le filtre automatique devenait incohérent. Je ne sais si sur la dernière version, c'est toujours le cas.
Je vais essayer de gogoliser pour confirmer.

En fait, il semblerait le filtre n'ait aucune limite. mais la liste déroulante du filtre automatique a une limite de 10 000 éléments. Donc si le filtre doit afficher plus de 10 000 valeurs différentes, on a un problème d'affichage.
 
Dernière édition:

Jacky67

XLDnaute Barbatruc
@Jacky67 :),

Ta dernière réflexion a fait remonter un vieux souvenir. A partir d'une certaine taille de plage, me semble-t-il, le filtre automatique devenait incohérent. Je ne sais si sur la dernière version, c'est toujours le cas.
Je vais essayer de gogoliser pour confirmer.
Hello mapomme
Perso, sur mon vieux xl2007 j'ai ceci.
1600800215356.png

Mon erreur était de tester seulement sur une centaine de lignes et là, cela fonctionne.
grotsblues, désolé.
 

Discussions similaires

Réponses
28
Affichages
925
Réponses
3
Affichages
550
Réponses
2
Affichages
476

Statistiques des forums

Discussions
311 740
Messages
2 082 047
Membres
101 880
dernier inscrit
Anton_2024