Peut on améliorer mon code pour qu'il soit plus rapide

Arpette

XLDnaute Impliqué
Bonjour à toutes et à tous,
j'ai une macro que j'ai faite avec votre aide, elle fonctionne comme je le souhaite, mais elle tourne pendand 1 H environ. J'aimerais savoir si on peut l'améliorer. Elle trourne sur 3 onglets ( 2 de 8000 lignes et 1 de 50000). Je sais çà fait beaucoup.
Merci de votre aide
@+
Code:
Sub Suivi_des_PO()
Dim i%
Dim j As Range
Dim l As Range
Dim c As Range
Dim r As Range
Dim d As Range
Dim e As Range
Dim f As Range
Dim Départ As String
Dim Somme&

With Worksheets("TradeCard")
Application.ScreenUpdating = False
Set l = .Range("D65536").End(xlUp)
Do While l.Row > 1
If InStr(l, "M") <> 1 Then
    l.EntireRow.Delete
    Set l = .Range("D65536").End(xlUp)
Else: Set l = l(0, 1)
End If
Loop
.Columns(5).Insert
.Cells(1, 5) = "PO-LG"
Set f = .Range("E2")
Do While f.Offset(0, -1) <> ""
    f = Split(f(1, 0), "/")(0) & "-" & Mid(.Range("G" & f.Row).Value, 4, 3)
    Set f = f.Offset(1, 0)
Loop

End With

'supprime les colonnes de A,B,D,E,F,G,H,M,S,U,V,W
With Worksheets("5-9-12")
.Range("A:B,D:D,J:K,M:M,S:S,U:W").Delete

'supprime toutes les lignes dont les cellules de C ne commence pas par M
Set l = .Range("C65536").End(xlUp)
Do While l.Row > 1
If InStr(l, "M") <> 1 Then
    l.EntireRow.Delete
    Set l = .Range("C65536").End(xlUp)
Else: Set l = l(0, 1)
End If
Loop

'insertion d'une colonne pour constituer ma valeur
.Columns("D").Insert
.Columns("H").Insert
.Columns("I").Insert
.Columns("J").Insert
.Columns("K").Insert
.Columns("L").Insert
.Columns("M").Insert
.Columns("N").Insert
.Columns("M").Insert
.Columns("N").Insert
.Columns("O").Insert
.Cells(1, 2) = "Fournisseur"
.Cells(1, 4) = "PO-LG"
.Cells(1, 8) = "Qtés RCT-PO"
.Cells(1, 9) = "Qté ASN"
.Cells(1, 10) = "Date RCT-PO"
.Cells(1, 11) = "Qté RCT-C3D"
.Cells(1, 12) = "Date RCT-C3D"
.Cells(1, 13) = "Qté En Transit"
.Cells(1, 14) = "Date Prévue-C3D"
.Cells(1, 15) = "Product Line"
.Cells(1, 16) = "CDC FY"
.Cells(1, 17) = "CDC Period"

'concatène C et "-" et S
    Set c = .Range("D2")
    Do While c.Offset(0, -1) <> ""
        c = c(1, 0) & "-" & Format(c(1, 19), "000")
        Set c = c.Offset(1, 0)
    Loop
End With
'prise en compte de la page "5-17"
'With Sheets("5-17")

'remplace ? par Transit.
With Sheets("5-17").Range("AB:AB")
    Set j = .Find(What:="?", LookIn:=xlValues, lookat:=xlWhole)
    If Not j Is Nothing Then
        Do
            j.Value = "Transit"
            Set j = .FindNext(j)
        Loop While Not j Is Nothing
    End If
'prise en compte de la page "5-17"
With Sheets("5-17")
'insertion d'une colonne
.Columns(6).Insert
.Cells(1, 6) = "PO-LG"

'transforme les cellules texte en nombre. Tester vide
For i = 2 To .Range("K65536").End(xlUp).Row
    .Cells(i, 11) = CDbl(Trim(Replace(Cells(i, 11), ".", ",")))
Next
'supprime toutes les lignes dont les cellules de E ne commence pas par M
Set l = .Range("E65536").End(xlUp)
Do While l.Row > 1
Application.StatusBar = l.Row
If InStr(l, "M") <> 1 Then
    l.EntireRow.Delete
    Set l = .Range("E65536").End(xlUp)
Else: Set l = l(0, 1)
End If
Loop

'concatène E et "-" et Hf
Set d = .Range("F2")
    Do While d.Offset(0, -1) <> ""
    d = d(1, 0) & "-" & Format(d(1, 3), "000")
    Set d = d.Offset(1, 0)
    Loop
End With


Set c = Worksheets("5-9-12").Range("D" & Worksheets("5-9-12").Range("D65536").End(xlUp).Row)
Do While c.Row > 1
Somme& = 0
With Worksheets("5-17").Range("F2:F" & Worksheets("5-17").Range("F65536").End(xlUp).Row)
    Set d = .Find(c)
        If Not d Is Nothing Then
            Départ = d.Address
            Do
                Somme& = d(1, 6) + Somme&
                c(2, 1).EntireRow.Insert
                c(2, 0) = "N° ASN"
                'n° d'ASN OK
                c(2, 1) = d(1, 26)
                'qt dans l'ASN OK
                c(2, 6) = d(1, 6)
                'date rct-po
                c(2, 7) = d(1, 5)
                'date rct-c3d
                c(2, 9) = d(1, 19)
                If d(1, 24) = "Transit" Then
                    c(2, 8) = 0
                    Else: c(2, 8) = d(1, 6)
                End If
                'Qté réceptionnée C3D
                If d(1, 20) = "?" Then
                    c(2, 8) = 0
                ElseIf d(1, 6) = d(1, 18) Then
                    c(2, 8) = d(1, 6)
                ElseIf d(1, 6) - d(1, 18) <> 0 Then
                c(2, 8) = d(1, 6) - d(1, 18)
                Else
                End If
                'date prévue c3d
                c(2, 11) = d(1, 24)
                If d(1, 24) = "Transit" Then
                    c(2, 11) = d(1, 23)
                    Else: c(2, 10) = d(1, 18)
                End If
                'Qté en transit
                If c(2, 6) = c(2, 8) Then
                    c(2, 10) = 0
                    Else: c(2, 10) = d(1, 18)
                End If
                Set d = .FindNext(d)
        Loop While Not d Is Nothing And d.Address <> Départ
        End If
    End With
    With Worksheets("TradeCard").Range("E2:E" & Worksheets("TradeCard").Range("E65536").End(xlUp).Row)
    Set f = .Find(c)
        If Not f Is Nothing Then
            Départ = f.Address
            Do
                c(1, 12) = f(1, 14)
                c(1, 13) = f(1, 46)
                c(1, 14) = f(1, 47)
        Loop While Not f Is Nothing And f.Address <> Départ
        End If
    End With

'on fait le total de tous les ASN
c(1, 5) = Somme&
Set c = c(0, 1)
Loop
With Worksheets("5-9-12")
.Range("J:J,L:L,N:N").NumberFormat = "dd/mm/yyyy"
.Columns("A:X").Columns.AutoFit
.Columns("A:X").HorizontalAlignment = xlCenter
End With
End With
Application.ScreenUpdating = True
End Sub
 

néné06

XLDnaute Accro
Re : Peut on améliorer mon code pour qu'il soit plus rapide

Bonjour Arpette,Staple1600, et les autres

Essayes cette nodif avec rem dans le module, si cela te conviens.

cordialement.

With Worksheets("TradeCard")
Application.ScreenUpdating = False
'Supprime toutes les lignes de la colonne D si cellule ne commence par M
Set l = .Range("D65536").End(xlUp)
'****************ici 75 boucles au lieu de 669 boucles dans la version precedente*********
a = l.Row
Do While a > 1
If Left(Cells(a, 4), 1) <> "M" Then
Rows(a).EntireRow.Delete
End If
a = a - 1
Loop
'*******************************************************************************
.Columns(5).Insert
.Cells(1, 5) = "PO-LG"
 

Arpette

XLDnaute Impliqué
Re : Peut on améliorer mon code pour qu'il soit plus rapide

Bravo Staple, j'arrive au résultat souhaité en 4,30 minutes au lieu de 1 heure environ, c'est super. Merci également à néné, mais je ne pense pas que l'on arrivera à faire mieux.
Merci encore Staple.
@+
 

Staple1600

XLDnaute Barbatruc
Re : Peut on améliorer mon code pour qu'il soit plus rapide

Bonsoir

Bon, je sors de la couette
alors m'énerves plus (en ne joignant plus de pj à tes questions alors que tu demandes aux autres d'envoyer des fichiers exemple !!)

mais je ne pense pas que l'on arrivera à faire mieux.

On doit pouvoir faire mieux

Mais je laisse la place aux pros des Arrays ;)

PS: postes ton code VBA modifié que l'on voit s'il y a des choses à modifier
 

Arpette

XLDnaute Impliqué
Re : Peut on améliorer mon code pour qu'il soit plus rapide

Bonsoir Staple, je ne sais pas si on peut faire mieux, mais vu le nombre de lignes traitées, 4'30 çà semble pas mal, mais je te joints mon fichier avec ta modification.
PS: le résultat souhaité arrive sur page 5-9-12
Merci de ton aide
@+
Cijoint.fr - Service gratuit de dépôt de fichiers
 

Staple1600

XLDnaute Barbatruc
Re : Peut on améliorer mon code pour qu'il soit plus rapide

Re


Dis moi , stp, si cela est plus rapide ainsi ?
Code:
Sub xSuivi_des_PO()
Dim i&
Dim j As Range
Dim l As Range
Dim c As Range
Dim r As Range
Dim d As Range
Dim e As Range
Dim f As Range
Dim Départ As String
Dim Somme&
Application.ScreenUpdating = False
With Worksheets("TradeCard")

'Supprime toutes les lignes dont les cellules de D ne commence pas par M
If Not AutoFilterMode = True Then AutoFilterMode = True
    .[D1].AutoFilter 4, "<>M*"
    Set f = .Range("_FilterDataBase")
    f.Offset(1, 0).Resize(f.Rows.Count - 1).SpecialCells(12).Delete Shift:=xlUp
    .ShowAllData
.Columns(5).Insert
.Cells(1, 5) = "PO-LG"
With .Range("E2").Resize([A65536].End(xlUp).Row - 1)
    .FormulaR1C1 = "=LEFT(RC[-1],SEARCH(""/"",RC[-1])-1)&""-""&MID(RC[2],4,3)"
    .Value = .Value
End With
End With
End Sub

Personnellement je scinderai ton code en plusieurs procédures (une par feuille)
Exemple
Code:
Sub mTradeCard()
'Traitement
End Sub
Code:
Sub m5912()
'Traitement
End Sub

et une proc générale pour lancer le tout
Code:
Sub Main()
Application.Screen.Updating=False
mTradeCard
m5912
Application.Screen.Updating=True
End Sub
 
Dernière édition:

Arpette

XLDnaute Impliqué
Re : Peut on améliorer mon code pour qu'il soit plus rapide

Staple, c'est beaucoup moins rapide avec ce code. Pour ce qui est de séparer les feuilles, j'y avais pensé, mais je ne pense pas que l'on puisse y gagner du temps. Avec ton code je supprime très rapidement tout ce qui ne m'intéresse pas (<> M). Le temps occupé vient des rechercheV et je pense que c'est normal.
@+
 

Staple1600

XLDnaute Barbatruc
Re : Peut on améliorer mon code pour qu'il soit plus rapide

Re


Pourtant chez moi avec ton fichier exemple
c'est immédiat
(je parle de partie filtrage et de la création de la colonne PO_LG)

On ne compare pas la même chose ;)

mais je ne pense pas que l'on puisse y gagner du temps.
Si tu le dis ...:rolleyes:

(Mais nous sommes passés de 1h00 à 4 minutes ...)
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Peut on améliorer mon code pour qu'il soit plus rapide

Re

Je retourne sous la couette (car je m'aperçois que tu n'as modifié le reste de ton code :rolleyes: en suivant la logique que je te proposais)

Avec cette méthode, chez moi, le résultat est instantanné pour cette partie du code et ce sur les 2 feuilles.

Tu m'as de nouveau énervé.
Je vais être obliger d'aller m'abrutir devant TF1 pour me calmer.
Code:
Sub main()
Application.ScreenUpdating = False
a
b
End Sub
Code:
Private Sub a()
Dim i&, f As Range
With Worksheets("TradeCard")
'Supprime toutes les lignes dont les cellules de D ne commence pas par M
If Not AutoFilterMode Then AutoFilterMode = True
    .[D1].AutoFilter 4, "<>M*"
    Set f = .Range("_FilterDataBase")
    f.Offset(1, 0).Resize(f.Rows.Count - 1).SpecialCells(12).Delete Shift:=xlUp
    .ShowAllData
.Columns(5).Insert
.Cells(1, 5) = "PO-LG"
With .Range("E2").Resize([A65536].End(xlUp).Row - 1)
    .FormulaR1C1 = "=LEFT(RC[-1],SEARCH(""/"",RC[-1])-1)&""-""&MID(RC[2],4,3)"
    .Value = .Value
End With
End With
End Sub
Code:
Private Sub b()
Dim t
t = Split("Qtés RCT-PO/Qté ASN/Date RCT-PO/Qté RCT-C3D/Date RCT-C3D/Qté En Transit/Date Prévue-C3D/Product Line/CDC FY/CDC Period", "/")
'Supprime les colonnes de A,B,D,E,F,G,H,M,S,U,V,W
With Worksheets("5-9-12")
.Range("A:B,D:D,J:K,M:M,S:S,U:W").Delete
'Supprime toutes les lignes dont les cellules de C ne commence pas par M
If Not AutoFilterMode Then AutoFilterMode = True
    .[C1].AutoFilter 3, "<>M*"
    Set c = .Range("_FilterDataBase")
    c.Offset(1, 0).Resize(c.Rows.Count - 1).SpecialCells(12).Delete Shift:=xlUp
    .ShowAllData
'Insertion d'une colonne pour constituer ma valeur
    .Columns("D").Insert: .Columns("H:N").Insert
    .Cells(1, 2) = "Fournisseur": .Cells(1, 4) = "PO-LG"
    .Cells(1, 8).Resize(, 8) = t
End With
Application.ScreenUpdating = True
End Sub
 

Arpette

XLDnaute Impliqué
Re : Peut on améliorer mon code pour qu'il soit plus rapide

Oui Staple, je sais que chez toi c'est immédiat, mais mon fichier fait 64 Méga, donc 4'30 je trouve que c'est très bien, vu le nombre de recherchesV que la macro fait. Tu m'as enlevé une grosse épine du pied pour supprimer les infos qui ne m'intéressent pas ( les <> de M).
Merci pour ton aide et à bientôt.
Pascal.
 

Staple1600

XLDnaute Barbatruc
Re : Peut on améliorer mon code pour qu'il soit plus rapide

Arrrrrrrrrrrrrrrrrrrrrrrghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh :eek::eek:

je sais que chez toi c'est immédiat, mais mon fichier fait 64 Méga

C'est de la folie pure un fichier Excel de cette taille !!!

Donnez-moi une corde que j'aille me prendre dans la foulée. (Merde j'ai pas d'arbre sous la main)

Ton fichier est en obésité morbide, je te refile ma corde.
Achèves le tout de suite avant qu'il plante irrémédiablement.

Bon cette fois, je me fous devant la télé
(en pleurant sur ces mégas qui n'auraient jamais du engraisser un si mignon fichier Excel qui devait avoir une taille normale au départ)
 
Dernière édition:

Arpette

XLDnaute Impliqué
Re : Peut on améliorer mon code pour qu'il soit plus rapide

Bonsoir Staple, pour la corde, prends une guirlande, pour l'arbre prends un sapin avec plein de boules (le sapin dans le salon), comme çà je suis certain que tu pourras encore m'aider:). Pour ce qui de la macro elle fonctionne à merveille, dommage que je ne puisses pas t'envoyer le fichier complet, tu pourrais constater le résultat, c'est simplement joli:). Peut-être je pourrais t'envoyer les onglets zippés séparément et tu reconstitues le fichier. Mais je ne voudrais pas que cela t'énerve:(.
Dans tous les cas, merci pour ton aide et ton humour.
@+
 

Statistiques des forums

Discussions
312 211
Messages
2 086 299
Membres
103 173
dernier inscrit
Cerba95