XL 2010 Macro trop lente avec 650 000 lignes

grotsblues

XLDnaute Junior
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 Accro
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:

dysorthographie

XLDnaute Occasionnel
Bonjour,
VB:
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
 

soan

XLDnaute Accro
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
Bonsoir à tous,

Par formule, sur 600 000 lignes, c'est immédiat. Il suffit de l'écrire en VBA.
Formule en colonne AK puis copier/coller valeur sur la colonne AK.
 

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
 

Fichiers joints

Dernière édition:

grotsblues

XLDnaute Junior
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:

fanch55

XLDnaute Impliqué
Bonsoir,
Une base de données de 650000 lignes !!!!
Il vaudrait mieux se tourner vers une solution de SGBD type access ou mysql ....
Surtout qu'Excel travaille avec la RAM, je n'ose même pas penser au temps que prend une sauvegarde automatique ...
 

Jacky67

XLDnaute Accro
@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é.
 

soan

XLDnaute Accro
eh ben, t'as un super PC, dis-donc !!! :)

ça vaut drôlement l'coup, un PC avec une RAM de 16 Go
et un processeur AMD Ryzen 7 3700X à 3,6 GHz !!! :D

(comment t'as fait pour l'acheter ? t'as dévalisé une banque ? :p)


soan
 

laurent950

XLDnaute Accro
Bonsoir,
Pour test avec ce code, et cette modification combien de temps vous avez @mapomme
VB:
Sub statutEetMbis2()
Dim t1, t2, i&, deb#
   deb = Timer
   t1 = Range("af2:af" & Cells(Rows.Count, "a").End(xlUp).Row).Value
   ReDim t2(LBound(t1, 1) To UBound(t1, 1), LBound(t1, 2) To UBound(t1, 2))
   For i = LBound(t1, 1) To UBound(t1, 1)
       If t1(i, 1) = "M" Or t1(i, 1) = "E" Then t2(i, 1) = "Non" Else t2(i, 1) = "oui"
    Next i
  Cells(2, 37).Resize(UBound(t2, 1), UBound(t2, 2)) = t2
  MsgBox "remplissage colonne AK en " & Format(Timer - deb, "0.00\ sec")
End Sub
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
(comment t'as fait pour l'acheter ? t'as dévalisé une banque ? :p)
Mon précédent PC datait de 2007 (entièrement monté par ma pomme). Je l'ai remplacé fin juin (acheté tout monté, OS installé - je m'embourgeoise :(). En 13 ans, j'ai eu le temps d'économiser (et très peu par an puisque sur 13 ans). Mon prochain nouveau PC (ou la chose qui le remplacera) devrait être en 2033. Je commence à épargner.
 

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas