conserver des lignes selon criteres

daniel_c

XLDnaute Nouveau
Bonjour le forum

je voudrais savoir s'il est possible de réaliser une macro qui supprime des lignes selon deux criteres. je m'explique:

en colonne A des articles
en colonne D les mouvements d'entrée
en colonne E les mouvements de sortie
en colonne F la date et l'heure du mouvement
en colonne G le depot

je voudrais concerver dans une seconde feuille, pour chaque article, uniquement les lignes du dernier mouvement d'entrée (cellule colonne D > 0) et du dernier mouvement de sortie (cellule colonne E > 0). Et cela pour chaque depot. (cette etape n'est pas indispensable, je l'ai ajoute pour plus de clarte)

puis reporter ce resultat dans une troisieme feuille avec
en colonne A les articles
en colonne D la date de derniere entree
en colonne E la date de derniere sortie
en colonne F le depot

les feuilles 2 et 3 n'existent pas dans le fichier initial, seul la feuille "sheet0" est présente dans l'import

je joint un fichier exemple avec le resultat pour 3 articles
j'ai colore les lignes pour plus de clarte

Si cela est realisable vous me soulageriez d'une tache ingrate. Je realise en effet cette procedure par tri et copier/coller tout les mois



Merci pour votre aide
 

Pièces jointes

  • mvt_T11.zip
    15.8 KB · Affichages: 24

Excel-lent

XLDnaute Barbatruc
Re : conserver des lignes selon criteres

Bonsoir Daniel_c,

Oui, ce que tu demande est assez facilement réalisable à l'aide d'une macro.

Mais avant, j'aurais besoin de bien comprendre ta question.

Tu as besoin du résultat de la feuille 2? Ou c'est juste une étape intermédiaire dont on peut se passer? A priori on peut l'éviter?

daniel_c à dit:
cette etape n'est pas indispensable, je l'ai ajoute pour plus de clarte

Tu veux conserver sur ta 2nd feuille pour chaque article le dernier mouvement d'entrée? Alors pourquoi pour l'article 4408672480 Référence 43020049 (ligne 30 à 33 de la feuille 1) tu as retenu plusieurs lignes? On devrait en avoir qu'une?

Et pourquoi pour les sac d'aspirateurs, tu n'as pas retenu la ligne 4? C'est pourtant la ligne comportant le dernier mouvement d'entrée!

Tu veux également le dernier mouvement de sortie? Donc on devrait au maximum avoir deux lignes par référence! Non? Pourtant ligne 30 à 33, ça fait 4 lignes!

A te lire.

PS. : le but premier des macros, c'est d'éviter les opérations répétitives! Donc si tu fais la même chose tout les mois, OUI, une macro peut t'éviter cette tâche ingrate!
 

daniel_c

XLDnaute Nouveau
Re : conserver des lignes selon criteres

Bonsoir Excel-lent, le forum

je vois qu'il y a des couche-tard, désolé de n'avoir pas repondu plus vite

Malgrès l'heure tardive, je vais essayer d'être clair:

En effet, la feuille 2 n'est pas nécessaire, je l'ai placé uniquement pour décomposer le traitement

Je n'ai traité que 3 articles à titre d'exemple, sur 1 seul "dépôt"

En réalité, je voudrais obtenir sur la même ligne, pour chaque article, la date des derniers mouvements d'entrée et de sortie, comme sur la feuille 3.

Les colonnes entrée et sortie de stock de la feuille "sheet0", donne la quantité utilisée de l'article à la date du mouvement:
-si la quantité = 0, la date n'est pas retournée
-si la quantité > 0, la date la plus récente, pour l'article concerné est retournée

Ces articles constituent le stock voiture de techniciens sav, le but est de repèrer les pièces qui "dorment" en remontant, pour chaque article les dates de dernière entrée et sortie. Une case vide signifie "pas de mouvement" sur la période remonté par le fichier brut (en principe 3 mois)

Un autre fichier, déjà opérationnel, récupére ces données pour déterminer le montant du stock actif et du stock agé.



J'ai réussi à transformer (voir pièce jointe), par macros récupérées sur le forum, le fichier brut afin de récupérer les dates de mouvement en lieu et place des quantités mouvementées.
Mais mes connaissances en VBA sont trop limitées pour la dernière étape...
A savoir, pour chaque article récupérer (si elles existent) les dates d'entrée / sortie les plus récentes.


Un petit coup de pouce serait le bien venu!!!


P.S. mon code peut-il étre simplifié?


Bonne nuit à toutes et à tous



Daniel
 

Excel-lent

XLDnaute Barbatruc
Re : conserver des lignes selon criteres

Bonjour Daniel_c, BrunoM45,

Daniel_c, voici ci-dessous ta macro raccourci
Code:
Sub mouvements_de_stock()
[COLOR="Green"]' Macro raccourci par Excel-lent[/COLOR]
Application.ScreenUpdating = False
[COLOR="Green"]'suppression des colonnes inutiles et formatage des colonnes[/COLOR]
    Range("D:D,H:J,L:AA").Delete
    Columns("D:D").Cut
    Columns("H:H").Insert
    Columns("D:E").NumberFormat = "0_ ;[Red]-0 "
    Range("F:F,H:I").NumberFormat = "m/d/yyyy h:mm"
[COLOR="Green"]'création colonne date d'entrée, date de sortie, dépôt, technicien[/COLOR]
[H1] = "Date entrée"
[I1] = "Date sortie"
[J1] = "Dépôt"
[K1] = "Technicien"
Dim e
    e = [A65536].End(xlUp).Row
    For i = 1 To e
        Application.DisplayAlerts = False
        Range("H2:H" & e) = "=IF(RC[-4]=0,"""",RC[-2])"  [COLOR="Green"]'Date d'entrée[/COLOR]
        Range("I2:I" & e) = "=IF(RC[-4]=0,"""",RC[-3])"  [COLOR="Green"]'Date de sortie[/COLOR]
        Range("J2:J" & e) = "=LEFT(RC[-3],4)"            [COLOR="Green"]'Dépôt[/COLOR]
        Range("K2:K" & e) = "=TRIM(RC[-1])"              [COLOR="Green"]'Technicien[/COLOR]
        Application.DisplayAlerts = True
    Next i
[COLOR="Green"]'mise en page[/COLOR]
    Cells.Select
        Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    Cells.Select
        Application.CutCopyMode = False
        With Selection.Font
            .Name = "Arial"
            .Size = 8
            .Strikethrough = False
            .Superscript = False
            .Subscript = False
            .OutlineFont = False
            .Shadow = False
            .Underline = xlUnderlineStyleNone
        End With
    Range("D:G,J:J").Delete
    With Rows("1:1")
        .Font.Bold = True
        For x = 5 To 12
            Selection.Borders(x).LineStyle = xlNone
        Next x
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlBottom
    End With
    Columns("F:F").Select
        With Selection
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlBottom
        End With
    Columns("A:B").ColumnWidth = 13.57
    Columns("C:C").ColumnWidth = 42.14
    Columns("D:E").ColumnWidth = 16.43
    Columns("F:F").ColumnWidth = 10.71
    [A1].Select
End Sub

Le résultat obtenu par la macro ci-dessus est identique à ta macro.

Concernant cette partie du code :
Code:
    Columns("A:B").ColumnWidth = 13.57
    Columns("C:C").ColumnWidth = 42.14
    Columns("D:E").ColumnWidth = 16.43
    Columns("F:F").ColumnWidth = 10.71
On peut le raccourcir encore plus en remplacant les 4 lignes ci-dessus par la ligne ci-dessous :
Code:
    Columns("A:F").Columns.AutoFit

Mais cela change un peu la philosophie de ton code.

Le code ayant 4 lignes donne une longueur fixe à tes colonnes (comme dans ta macro initiale).

Le code proposé (en 1 ligne), dit que la largeur des colonnes... est "ajustement automatique"

C'est à dire que pour la colonne ... il cherche la cellule la plus grande et donne à la colonne cette largeur, et fait de même pour chaque colonne.

Ce code équivaut à la manipulation suivante (sans VBA) :
-> sélectionner les colonnes...
-> cliquer sur "format" / "colonne" / "ajustement automatique".

Bon Dimanche

PS. : pour information, il ne s'agit pas du code le plus court! Il y a encore moyen de le réduire d'avantage.
 

daniel_c

XLDnaute Nouveau
Re : conserver des lignes selon criteres

Bonjour à tous

Merci de vous être penché sur mon probleme, et excusez moi pour le delais de réponse, je reprends ce fil maintenant (dimanche en famille et beaucoup de travail ce matin), je teste vos propositions et vous tiens informé.

Daniel
 

ChTi160

XLDnaute Barbatruc
Re : conserver des lignes selon criteres

Salut
Bonjour le Fil

arff je me suis posé la question , Pourquoi cette boucle
Code:
e = [A65536].End(xlUp).Row
    [COLOR=Red]For i = 1 To e[/COLOR]
        Application.DisplayAlerts = False
        Range("H2:H" & e) = "=IF(RC[-4]=0,"""",RC[-2])"  'Date d'entrée
        Range("I2:I" & e) = "=IF(RC[-4]=0,"""",RC[-3])"  'Date de sortie
        Range("J2:J" & e) = "=LEFT(RC[-3],4)"            'Dépôt
        Range("K2:K" & e) = "=TRIM(RC[-1])"              'Technicien
        Application.DisplayAlerts = True
    [COLOR=Red]Next i[/COLOR]
Pourquoi ne pas mettre directement ,puisque la formule
est recopiée dans la plage entière

Code:
e = [A65536].End(xlUp).Row
     Application.DisplayAlerts = False
        Range("H2:H" & e) = "=IF(RC[-4]=0,"""",RC[-2])"  'Date d'entrée
        Range("I2:I" & e) = "=IF(RC[-4]=0,"""",RC[-3])"  'Date de sortie
        Range("J2:J" & e) = "=LEFT(RC[-3],4)"            'Dépôt
        Range("K2:K" & e) = "=TRIM(RC[-1])"              'Technicien
     Application.DisplayAlerts = True
il faudrait aussi penser à déclarer les variables
et faire en sorte que les feuilles auxquelles s'adressent
les macros soient déterminées
Exemple
Code:
  Dim e As long
  Dim Ws_Source As worksheet
  Dim Ws_Cible As worksheet
  Set Ws_Source=Worksheets("fichier brut")
  Set Ws_Cible= Worksheets("Feuil3")
pour obtenir
Code:
With W_Source
    e = .Cells(.Rows.count,1).End(xlUp).Row
     Application.DisplayAlerts = False
        .Range("H2:H" & e) = "=IF(RC[-4]=0,"""",RC[-2])"  'Date d'entrée
        .Range("I2:I" & e) = "=IF(RC[-4]=0,"""",RC[-3])"  'Date de sortie
        .Range("J2:J" & e) = "=LEFT(RC[-3],4)"            'Dépôt
        .Range("K2:K" & e) = "=TRIM(RC[-1])"              'Technicien
     Application.DisplayAlerts = True
   End With
En espérant avoir fait avancer le Chimilimblic
Bonne fin de Journée
 
Dernière édition:

daniel_c

XLDnaute Nouveau
Re : conserver des lignes selon criteres

Bonjour le forum, BrunoM45, Excel-lent

Merci BrunoM45, j'ai testé ton code, c'est exactement ce que je voulais obtenir, avec cerise sur le gateau: les infomations en cas d'absence de mouvement.

Pour Excel-lent, merci pour la simplification du code, je vois que l'enregistreur de macro ne fait pas dans la simplicité. j'ai en vue quelques macros que je vais simplifier en me basant sur tes corrections

Bonne journée à tous et au plaisir de vous lire

Daniel
 

Discussions similaires

Réponses
22
Affichages
874

Statistiques des forums

Discussions
312 488
Messages
2 088 862
Membres
103 979
dernier inscrit
imed