MACRO connaitre le nombre de fois ou toutes les lignes d'une commande

PASCAL84810

XLDnaute Junior
Bonjour,

je cherche à connaitre le nombre de bon de préparation de commande dont tous les articles ont été prélevé dans le même magasin donné. je peux le faire avec un TDC, mais je voudrais une macro,en précisant le nom du magasin, qui me donne directement le nombre. J'ai 3 colonnes avec des milliers d'articles, des centaines d'emplacements magasin,
et des milliers de bon de préparation, j'ai besoin de connaitre le nombre de bp dont tous les prélèvements d'articles sont dans le même magasin exemple le magasin X
exemple
ART N° BP magasin
A 01 X
B 02 Y
C 03 Z
D 02 Z
E 02 Z
F 01 X
merci pour votre retour
 

PASCAL84810

XLDnaute Junior
Re : MACRO connaitre le nombre de fois ou toutes les lignes d'une commande

bonjour,

merci pour tout.
je sais pas si'l faut ouvrir un nouveau sujet et si vous aurez le temps de regarder mais vu vos capacités a réduire les temps de fonctionnement voici la macro qui prend le plus de temps à tourner et qui a pourtant déjà été optimisé sur le forum,
il s'agit de copie les lignes d'une feuille "base" dont les cellules de la colonne L contient "livraison" vers une feuille "livraison",
la dernière utilisation sur 400 000 lignes il y avais 88 000 lignes de concerné : temps d’exécution : 2764


Code:
Sub COPY_LIVRAISON()
start = Timer
 Application.ScreenUpdating = False
Sheets("LIVRAISON").Select
Cells.Select
    Selection.Delete Shift:=xlUp
 Application.ScreenUpdating = False

    Dim plage As Range, cel As Range
    
   
    'valeur a chercher
    valcherch = Sheets("FEUIL1").Range("A3")
    With Worksheets("BASE")
        'derniere cellule colonne L
        Derlig = .Range("L" & Rows.Count).End(xlUp).Row
        'defintion plage a tester en memoire
        Set plage = .Range("L2:L" & Derlig)
    End With
    
    Derlig = 0
    With Worksheets("LIVRAISON")
        'test plage
        For Each cel In plage
            If cel = valcherch Then
                'premiere cellule vide apres derniere non vide colonne L
                Derlig = .Range("L" & Rows.Count).End(xlUp).Row + 1
                'premier lancement
                If Derlig = 2 Then
                    Derlig = 3
                End If
                'copy ligne entiere
                cel.EntireRow.Copy .Range("A" & Derlig)
 End If
        Next cel
    End With
    'rafraichissement ecran
    
     
    
    Application.ScreenUpdating = True
   
 

MsgBox "durée du traitement: " & Timer - start & " secondes"
    
End Sub


Cordialement

Pascal
 

laetitia90

XLDnaute Barbatruc
Re : MACRO connaitre le nombre de fois ou toutes les lignes d'une commande

bonjour tous :)
essai deja en utilisant un tablo.... je considere que tu as que 12 colonnes adapte

code brut a optimiser

Code:
Option Compare Text
Sub es()
Dim t(), t1(), i As Long, c As Byte, z As String
 t = Feuil1.Range("a2:l" & Feuil1.Cells.Find("*", , , , , xlPrevious).Row)
 ReDim t1(1 To UBound(t), 1 To 12)
 z = "livraison"
 For i = 1 To UBound(t)
 If t(i, 12) = z Then
 x = x + 1
 For c = 1 To 12: t1(x, c) = t(i, c): Next c
 End If
 Next i
 Feuil2.[a2].Resize(x, 12) = t1
End Sub
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : MACRO connaitre le nombre de fois ou toutes les lignes d'une commande

Bonjour PASCAL84810, PAF, laetitia90, à tous,

Pour le FUN...

J'avais commencé à travailler sur le premier problème avec une méthode différente de PAF basé sur le tri du tableau et sans dictionary.

Il y a trois cellules qui sont nommées sur la feuille pour lire le magasin à traiter et afficher les deux totaux (unique et tous).
Quel_Magasin=Feuil1!$E$5Total_Unique=Feuil1!$F$5Total_Total=Feuil1!$G$5

Pour plus-value, j'ai remis la version V2 de PAF (que je salue :)) pour comparer les performances.

Il y a deux possibilité : avec ou sans tableau préalablement trié (tableau de 500 000 lignes)

La version de PAF présente un avantage indéniable car elle fonctionne avec de bonnes performances que le tableau soit trié ou non, alors que personnellement, j'ai une macro pour un tableau non trié et une autre macro pour un tableau préalablement trié. On n'est pas à quelques secondes près :p vu les différentes durées affichées.

Le cas le plus défavorable est l’utilisation de ma macro qui conserve l'ordre des lignes avec un tableau déjà trié en entrée.

nota 1: il faut d'abord initialiser le tableau par le bouton rouge.
 

Pièces jointes

  • PASCAL84810-BONS dans MAG avec ou sansTRI-v1.xlsm
    37.9 KB · Affichages: 34

Paf

XLDnaute Barbatruc
Re : MACRO connaitre le nombre de fois ou toutes les lignes d'une commande

Bonjour mapomme

La version tableau trié n'affiche pas les mêmes résultats que les autres ?

J'ai regardé le code mais ça commence à fumer...

A+
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : MACRO connaitre le nombre de fois ou toutes les lignes d'une commande

Bonjour PAF :),
Bonjour mapomme

La version tableau trié n'affiche pas les mêmes résultats que les autres ?

J'ai regardé le code mais ça commence à fumer...

Re
ben oui ...

le code est prévu pour un tableau trié, et si on ne le trie pas, ça ne marche pas bien.
A+

Je suis confus si je t'ai fait fumer :(. Pourtant je l'avais mentionné dans mon message et c'est pourquoi j'avais précisé que ta macro avait un avantage indéniable :rolleyes:. J'espère que tu n'as pas fumé trop longtemps. Si tu tousses trop, je participerai aux frais médicaux :D.

A bientôt,
 
Dernière édition:

PASCAL84810

XLDnaute Junior
Re : MACRO connaitre le nombre de fois ou toutes les lignes d'une commande

Bonsoir à tous et merci
merci laetitia90 je vais tester ton code.

voici le lien vers la discussion de février 2014 avec un fichier exemple, je ne sais pas comment récupérer juste le fichier (j'avais enlevé les données confidentiels) :
https://www.excel-downloads.com/thr...rs-feuilles-fonctionne-mais-trop-long.216533/

cordialement
pascal
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : MACRO connaitre le nombre de fois ou toutes les lignes d'une commande

Bonjour PASCAL84810, à tous,

(...) il s'agit de copie les lignes d'une feuille "base" dont les cellules de la colonne L contient "livraison" vers une feuille "livraison", la dernière utilisation sur 400 000 lignes il y avais 88 000 lignes de concerné : temps d’exécution : 2764

Voici un essai (basé sur mon fichier test - c'est pourquoi on ne recherche pas le mot livraison mais MAG). Pour 400 000 lignes, env 8 à 10 secondes (en fait le temps dépend du nombre de ligne correspondant aux critères)

nota : j'ai considéré qu'une ligne s’étendait de la colonne A à la colonne N au max.( à adapter bien sûr)
 

Pièces jointes

  • PASCAL84810-copie ligne-v1.xlsm
    28.2 KB · Affichages: 27
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : MACRO connaitre le nombre de fois ou toutes les lignes d'une commande

Re,

Une version qui corrige un bogue. Quand le mot recherché n'était pas dans Base, alors on copiait toute la Base au lieu de ne rien copier.
 

Pièces jointes

  • PASCAL84810-copie ligne-v1a.xlsm
    29.6 KB · Affichages: 29

Paf

XLDnaute Barbatruc
Re : MACRO connaitre le nombre de fois ou toutes les lignes d'une commande

re à tous,

concernant la copie des lignes Livraison, une autre version par filtre automatique

testé sur le classeur en lien dans le post #23 (4000 lignes) : +/- 0.05 seconde

Code:
Sub COPY_LIVRAISON()
 Start = Timer
 Application.ScreenUpdating = False
 Dim DerLig as long, WS1 As Worksheet, WS2 As Worksheet
 
 Set WS1 = Worksheets("BASE")
 Set WS2 = Worksheets("LIVRAISON")
 
 WS2.Cells.Delete Shift:=xlUp
 DerLig = WS1.Range("A" & Rows.Count).End(xlUp).Row

 WS1.Range("A2").AutoFilter Field:=12, Criteria1:="Livraison"
 
 If Application.Subtotal(3, Columns("A")) > 1 Then
    WS1.Range("A1:T" & DerLig).SpecialCells(xlCellTypeVisible).Copy WS2.Range("A1")
 Else
    MsgBox "Aucune ligne ne correspond au critère Livraison"
 End If
 
 WS1.Range("A2").AutoFilter Field:=12
    
 Application.ScreenUpdating = True
 MsgBox "durée du traitement: " & Timer - Start & " secondes"
End Sub

A+
 

PASCAL84810

XLDnaute Junior
Re : MACRO connaitre le nombre de fois ou toutes les lignes d'une commande

Bonjour à tous,
Paf, j'ai transformé votre version avec filtre pour trier les bons de préparation (8chiffres) des factures magasin (7chiffres)
les deux 1er chiffre c'est l'année. ensuite je supprime les lignes facture de la feuille LIVRAISON cela fonctionne très bien.
par contre dans les deux versions le filtre se fait sur la ligne 2, je n'arrive pas à trouver pourquoi il ne se met pas sur la ligne 1
pouvez vous me dire ?

cordialement
Pascal

Code:
Sub COPY_FACTURE()
 Start = Timer
 
 Dim DerLig As Long, WS1 As Worksheet, WS2 As Worksheet
 
 Set WS1 = Worksheets("LIVRAISON")
 Set WS2 = Worksheets("FACTURE MAG")
 
 WS2.Cells.Delete Shift:=xlUp
 DerLig = WS1.Range("A" & Rows.Count).End(xlUp).Row


 
      WS1.Range("E1").AutoFilter Field:=5, Criteria1:= _
        "<13000000", Operator:=xlAnd
 
 
 
 If Application.Subtotal(3, Columns("A")) > 1 Then
    WS1.Range("A1:T" & DerLig).SpecialCells(xlCellTypeVisible).Copy WS2.Range("A1")
 Else
    MsgBox "Aucune ligne ne correspond au critère Livraison"
 End If
 
 WS1.Range("A1").AutoFilter Field:=12
  
 
  Rows("1:1").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Delete Shift:=xlUp
    ActiveSheet.Range("$A$1:$N$99000").AutoFilter Field:=5
 MsgBox "durée du traitement: " & Timer - Start & " secondes"
End Sub
 

Paf

XLDnaute Barbatruc
Re : MACRO connaitre le nombre de fois ou toutes les lignes d'une commande

Bonjour,

mettez un classeur de la version utilisée, que je regarde. Mais comme ça, je ne vois pas...

Par ailleurs la ligne WS1.Range("A1").AutoFilter Field:=12 permettait d'annuler le filtre de la colonne 12, désormais vous filtrez sur la colonne 5, dons à modifier ou supprimer.

A+
 

Discussions similaires

Statistiques des forums

Discussions
312 304
Messages
2 087 059
Membres
103 444
dernier inscrit
Aeggie78