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
 

Arpette

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

Staple, voici les fichiers
1) fichier où il y a le code et sans données
2) fichier 5-9-12 à coller dans l'onglet cidessus
3) fichier 5-17 à coller idem
4) ficher TradeCard à coller idem (lui, il est gros le bougre).

Cijoint.fr - Service gratuit de dépôt de fichiers
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


Heureusement que j'avais précisé allégé

Ca y est je suis énervé

Pourquoi avoir fourgué un fichier contenant 39641 lignes ???

1000 auraient suffi pour faire des tests
(ensuite on extrapole)

T'as plus qu'aller illico presto reposter un fichier Tradecard de 1000 lignes.

En attendant, je vais faire ma vaisselle.

PS: si tu continues à être aussi peu attentif à ce que j'écris dans mes messages, je cesse de perdre mon temps dans ce fil.
 

Arpette

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

Oui Staple, je sais qu'il est énorme, mais je voulais que tu sois dans la même configuration que moi.J'extrais ces fichiers de différents ERP et ils m'arrivent comme çà. C'était pour que tu vois que la macro est assez efficace. Mais tu peux supprimer des lignes dans le fichier TradeCard.
Merci de ton aide, là c'est moi qui vais sous la couette..demain je me lève de bonne heure. Pour la vaisselle, soit la fenêtre, soit la machine. J'ai opté pour la machine, sinon, après il faut ramasser et racheter, c'est nul.
@+
 

Arpette

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

Bonsoir Staple, j'ai allégé mais j'obtients pas le résultat souhaité. J'ai viré le gros onglet "Trade_Card" et je l'ai remplacé par "Product_line". Je souhaite avoir sur "5-9-12" en colonne "Product_Line" la valeur B qui ce trouve dans l'onglet qui porte le même nom. Avant j'utilisai une seule variable (c) en "5-9-12" mais maintenant c'est plus la même, j'ai essayé de la renommer mais çà coince.
Merci ton aide.
@+
 

Staple1600

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

Bonsoir


Désolé mais je passe la main
Dans ton dernier fichier, je ne retrouve pas le code proposé ici
(Ce qui laisses supposer que tu l'as pas testé)

Tu as allégé le fichier certes mais tu changes le nom des onglets.

De plus, tu as un second post (que tu n'évoques pas ici) relatif à la même procédure.

Donc pour la suite , ce sera sans moi.
 
Dernière édition:

Arpette

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

Oui Staple, mais on n'a pas le droit de ce faire aider par plusieurs personnes. La solution que m'avait apportée Softmama répondait à mes attentes. Ensuite je demande d'accélérer la procédure, à laquelle tu as trouvé la solution (bravo), puis tu fais rrrrrrrrr,bbbbbbb, donc je me dis, il a raison, il faut que j'allège. J'ai donc construit une table, où le nom de l'onglet a changé (ce n'est plus Trade_Card mais Product_Line), j'aime bien appeler un chat, un chat. Mais bon !!! j'ai bien l'impression que je t'ai énervé:), mais c'est dans cet état que tu es très fort.
@+
 

Staple1600

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

Re

mais on n'a pas le droit de ce faire aider par plusieurs personnes
Quand ai-je dis cela ?

Mais cela je le dis et le redis jusqu'à plus soif
On a le droit de lire la charte et de la respecter si possible.

Je n'ai jamais dit que l'aide apportée devait être singulière mais que citer l'autre fil m'aurait permis de savoir :
1) qu'il y avait déjà un fil de discussion concernant ce fichier
2) donc de pouvoir voir les réponses des autres forumeurs pour ne pas proposer de réponses redondantes.

Ensuite:
3) changer les paramètres d'un problème en cours de route oblige le répondeur à refondre son code
(donc de perdre du temps)
4) s'apercevoir qu'au fil du post, les PJ jointes n'incluent pas les codes VBA proposés par tel ou tel sonne pour moi comme un manque de respect et laisse supposer que le demandeur ne prends pas la peine de tester ou comprendre le code proposé
et sa persistance à poster un code VBA qui est identique à celui de son premier message finit à me convaincre que je perds mon temps.
5) Je n'ai jamais été énervé, ce n'était que de l'humour (que je semble être le seul à comprendre)

6) Je passe la main à Softmama puisqu'il intervint dans ton premier fil.
 
Dernière édition:

Softmama

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

Bonjour Arpette et Staple1600,

Heu désolé, j'ai pas bien tout suivi. Pour ma contribution, pour virer de façon rapide les lignes qui commencent par M, je ferais un truc comme ça : (ici je suppose que c'est la colonne A qui contient les données à contrôler) :
Code:
Sub PlusRapide()
    Columns("B:B").Insert
    Columns("B:B").FormulaR1C1 = "=IF(LEFT(RC[-1],1)=""M"",1,"""")"
    Range("B:B") = Range("B:B").Value
    Range("B:B").SpecialCells(xlCellTypeConstants, 23).EntireRow.Delete
    Columns("B:B").Delete
End Sub
En gros j'ajoute une colonne, y colle une formule qui me sort un 1 qd ca commence par M puis je garde les valeurs et vire toutes les lignes d'un coup. Reste plus qu'à virer ma colonne ajoutée.

Pas sur d'avoir été très clair sur ce coup..
 

Arpette

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

Staple, je sais bien que " tu es énervé, la couette, la corde.. c'est de l'humour; je t'ai même préconnisé de prendre une guirlande. Mais quelque fois les posts se croisent, et comme tu l'as dis je pu "de la G...le" :), je n'avais pas vu ta réponse. Mais bon, je vais me débrouiller.
@+ dans la vie:).
 

Arpette

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

Bonsoir Softmama, merci de prendre le relai de Staple qui m'a beaucoup aidé et qui a trouvé la solution pour supprimer les lignes avec un filtre. Comme il me l'a suggéré, j'ai voulu alléger mon fichier, donc j'ai supprimé la feuille "TradeCard" d'origine et l'ai remplacé par une table feuille "Product_Line". Mon probblème est qu'il me faut une deuxieme variable pour la feuille"5-9-12". Je veux rechercher la valeur de la colonne A de 5-9-12 dans la feuille Product_Line et renvoyer la valeur de la deuixième colonne de cette feuille en colonne O de 5-9-12. C'est en fin de macro
merci de ton aide
@+
Cijoint.fr - Service gratuit de dépôt de fichiers
 

Arpette

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

Bonsoir,
çà doit venir de chez toi, car je n'ai pas de problème pour ouvrir le lien.
As-tu une autre solution, pour que je t'envoi le fichier ou essaies avec ce nouveau lien.
@+
 
Dernière édition:

Softmama

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

Bonsoir,

Alors là ta macro, on n'y comprend plus grand chose. Je te conseille vivement de prendre l'habitude d'utiliser l'indentation dans tes pgmes de sorte à pouvoir t'y retrouver. La macro que j'ai trouvée comportait plusieurs erreurs de structure : des Do sans Loop, des with Range imbriqués, ou redondants. J'ai réindenté le bazar, et au moins ça ne génère plus d'erreur. De là à dire si la macro fait ce que tu souhaites, je ne suis pas bien sur, à toi de tester... :
VB:
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 g As Range
Dim Départ As String
Dim Somme&

Application.ScreenUpdating = False
'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").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
'Remplace ? par Transit.
With Sheets("5-17").Range("W:W")
    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
End With
'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.
    On Error Resume Next
    Set Plage = .Range("K2:K" & Range("K2").End(xlDown).Row).SpecialCells(xlCellTypeConstants, xlTextValues)
    For Each c In Plage
        c = Replace(c, ",", ".")
    Next
    Plage.NumberFormat = "0"

    'Supprime toutes les lignes dont les cellules de E ne commence pas par M
    If Not AutoFilterMode Then AutoFilterMode = True
    .[E1].AutoFilter 5, "<>M*"
    Set d = .Range("_FilterDataBase")
    d.Offset(1, 0).Resize(d.Rows.Count - 1).SpecialCells(12).Delete Shift:=xlUp
    .ShowAllData
    'Concatène E et "-" et H
    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)
                                
                'Qté réceptionnée C3D
                If c(2, 9) = "Transit" Then
                c(2, 8) = 0
                    Else
                    c(2, 8) = d(1, 6)
                End If
                                
                'date prévue c3d
                c(2, 11) = d(1, 36)
                
                'Qté en transit
                c(2, 10) = c(2, 6) - c(2, 8)
                
                Set d = .FindNext(d)
        Loop While Not d Is Nothing And d.Address <> Départ
        End If
  End With
    Set g = Worksheets("5-9-12").Range("A" & Worksheets("5-9-12").Range("A65536").End(xlUp).Row)
    Do While c.Row > 1
        With Worksheets("Product_Line").Range("A2:A" & Worksheets("Product_Line").Range("A65536").End(xlUp).Row)
            Set f = .Find(g)
            If Not f Is Nothing Then
                Départ = f.Address
                Do
                    g(1, 15) = f(1, 2)
                    Set f = .FindNext(f)
                Loop While Not f Is Nothing And f.Address <> Départ
            End If
        End With
        With Sheets("5-9-12") 'C'est ici que çà coince.
            Set g = Worksheets("5-9-12").Range("A" & Worksheets("5-9-12").Range("A65536").End(xlUp).Row)
            Do While c.Row > 1
                With Worksheets("Product_Line").Range("A2:A" & Worksheets("Product_Line").Range("A65536").End(xlUp).Row)
                    Set f = .Find(what:=g, LookIn:=xlValues, lookat:=xlWhole)
                    If Not f Is Nothing Then
                    Départ = f.Address
                        Do
                            g(1, 15) = f(1, 2)
                            Set f = .FindNext(f)
                        Loop While Not f Is Nothing And f.Address <> Départ
                    End If
                End With
                'Fait le total de tous les ASN
                c(1, 5) = Somme&
                Set c = c(0, 1)
            Loop
            .Range("J:J,L:L,N:N").NumberFormat = "dd/mm/yyyy"
            .Columns("A:X").Columns.AutoFit
            .Columns("A:X").HorizontalAlignment = xlCenter
        End With
    Loop
Loop
Application.ScreenUpdating = True
End Sub
 

Arpette

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

Bonjour Softmama et merci d'avoir restructuré mon code, c'est vrai que c'est plus lisible. Donc, j'ai essayé et çà ne fonctionne pas totalement. Cà me renvoi que la ligne de produit (c'éait le code qui me manquait)et ne remonte pas pour aller chercher les n° d'ASN, Qté dans l'ASN etc...Je pense également que le With à partir du commentaire ''C'est ici que çà coince" ne sert à plus rien, puisque tu le fais juste au dessus. Mais bon, je ne suis pas un expert comme tu as pu le constater.

Merci de ton.
@+
 

Discussions similaires

Statistiques des forums

Discussions
315 098
Messages
2 116 200
Membres
112 683
dernier inscrit
Ramo