Besoin d'aide sur formule compliquée, voir une macro.. Help please !

Résolu
ludodil62 Messages postés 66 Statut Membre -  
ludodil62 Messages postés 66 Statut Membre -
Bonjour,

J’ai besoin d’un expert en Excel !

Je cherche à travailler sur le groupement de commande chez un client, et on souhaiterait leur donner une estimation du gain potentiel en coût de transport si ils groupaient leurs commandes avant de nous les envoyer.

Pour ça, je travaille sur le fichier en PJ. (extrait du fichier original qui fait 10 Mo.. )

Sur ce fichier, une ligne = une commande, un client.

On se dit que des commandes pourraient être groupées jusqu’à 4 jours après la ère commande (en date glissante). Passé 4 jours, le compteur doit redémarrer à la prochaine commande.

J’essaye d’illustrer un peu l’idée pour être plus clair dans l'onglet "exemple" de mon fichier.

Dans l'onglet données, j’ai numéroté les jours (date d’intégration) pour supprimer le pbl des samedi et dimanche dans le calcul des écarts entre les commandes. Par exemple, j’ai les jours de 1 à 5 pour aller du lundi au vendredi, et le 6ème jour et le lundi suivant, et ainsi de suite..

J’ai ensuite trié les données par code client et par n° de jour croissant.

Je voudrais en colonne N, un résultat qui affiche une valeur commune sur chaque ligne de commande regroupable. « A » et « B » dans mon exemple, et ceci par client (1 client une couleur dans le fichier)..

Comme ça je n’aurai plus qu’à faire une TCD pour additionner les poids et les colis par regroupement, et par client. Ça me permettrait de calculer un nouveau coût de transport, et donc de voir les éventuelles économies..

Mais pbl, je ne vois pas du tout comment avoir ce résultat…

Quelqu'un pour m'aider ?

D'avance merci pour votre aide.

Voici mon fichier : https://mon-partage.fr/f/NIrSqt3U/

17 réponses

  1. danielc0 Messages postés 2192 Date d'inscription   Statut Membre Dernière intervention   287
     
    Bonjour,

    Pourquoi A et pourquoi B ?

    Cordialement.

    Daniel
    1
  2. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    Je n'ai pas envoyé le bon fichier ! le voici
    https://mon-partage.fr/f/Ak2OTOcJ/

    J'ai également traité sur celui ci le cas du dépassement de la lettre Z pour le codage, on passe ensuite à AA, AB ...

    1
  3. PHILOU10120 Messages postés 6463 Date d'inscription   Statut Contributeur Dernière intervention   835
     
    Bonjour ludodil62

    Pourquoi compliquer les choses !

    Utiliser le numéro de semaine pour faire le regroupement

    Mettre cette formule dans une colonne supplémentaire en prenant la date en colonne E ou L

    =NO.SEMAINE(E2;21) ou =NO.SEMAINE(L2;21)

    puis trier par numéro se semaine
    0
  4. ludodil62 Messages postés 66 Statut Membre 11
     
    Bonjour,

    Daniel,

    Ceux sont des exemples A et B. Si c'est plus simple de mettre 1 et 2, pourquoi pas. Et 0 sur les non regroupables par exemple. Le principal est d'avoir une valeur commune sur chacun des regroupement possible, mais une valeur différente par regroupement et par client.

    Philou,

    J'ai proposé de faire une analyse à la semaine, ça serait effectivement plus facile. Mais notre client ne veut pas malheureusement, je dois faire une analyse en jour glissant a partir de la 1ère commande et étendre la recherche sur 4 jours.. Au 5ème jour, le compteur doit repartir à 0.

    Pas simple je te l'accorde !
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    Bonjour

    Avec une macro
    https://mon-partage.fr/f/1AA5VeuG/

    Cdlmnt
    Via
    0
  7. ludodil62 Messages postés 66 Statut Membre 11
     
    Merci beaucoup via55 ! C'est exactement ce qu'il me fallait !

    Je ne pensais pas que c'était possible. Il va falloir que je me mette au VBA, ça multiplie les possibilités !

    Par contre je ne suis pas à l'abri que mon client demande ensuite la même analyse, sur 3 ou 5 jours d'intervalle par exemple.

    Que devrais je changer dans ce code ?

    Sub regrouper()
    Dim Ligne As Long
    Ligne = Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
    Range("N4:N" & Ligne).ClearContents

    For n = 4 To Ligne
    If Range("C" & n) <> Range("C" & n - 1) Then x = Range("C" & n): cod = 64
    If Range("M" & n + 1) - Range("M" & n) < 5 And Range("N" & n) = "" And Range("C" & n) = Range("C" & n + 1) Then
    cod = cod + 1
    Range("N" & n) = Chr(cod)
    Range("N" & n + 1) = Chr(cod)
    For y = 1 To 3
    If Range("M" & n + 1 + y) - Range("M" & n) < 5 And Range("C" & n) = Range("C" & n + 1 + y) Then Range("N" & n + 1 + y) = Chr(cod)
    Next
    End If
    Next

    End Sub

    En tout cas, encore un grand merci ! ça va bien m'aider.
    0
  8. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    Bien

    Satisfait que cela te convienne

    Ce sont d'abord les deux lignes où il y a Range("M" & n) < 5 qu'il faut modifier
    le <5 conditionne une différence maximale de 4 jours, il suffit de le remplacer par 4 ou par 6

    Ensuite le nombre de lignes en dessous de celle avec le 1er A ( ou le 1ere B..) étudiés dépend de la boucle For y = 1 To 3 (ici 3 lignes), si on augmente le nombre de jours il faut augmenter en conséquence le nombre de lignes prises en compte et donc remplacer 3 par 4, 5 ...

    Cdlmnt
    Via

    0
  9. ludodil62 Messages postés 66 Statut Membre 11
     
    Très bien, c'est noté.

    Merci pour cette aide précieuse apportée ! Je vais pourvoir aller plus loin dans mon analyse grâce à toi.

    A une prochaine fois peut-être.

    Bye !
    0
  10. ludodil62 Messages postés 66 Statut Membre 11
     
    Bonjour à tous,

    J'ai de nouveau besoin de votre aide.

    Mon besoin de regroupement de commande à changé, il ne faut plus faire sur 5 jours glissant, mais d'une autre façon.

    Pour faire plus simple, un exemple est plus simple qu'un long discours.

    Voici le fihier que j'avais avant, ca fonctionnait parfaitement avec la maro de via55 que je remercie encore :

    https://mon-partage.fr/f/aTGNRCwb/

    Et voici ce qu'il faudrait faire maintenant :

    https://mon-partage.fr/f/pSebc1JJ/

    Quelqu'un saurait il modifier la macro en ce sens ? Je n'y connais rien en macro, et je ne vois pas comment faire autrement malheureusement..

    Merci d'avance pour votre aide !
    0
  11. ludodil62 Messages postés 66 Statut Membre 11
     
    Désolé, je viens de me rendre compte d'une erreur sur le deuxième lien, voici le bon :

    https://mon-partage.fr/f/q0psssO0/
    0
  12. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    Bonjour Ludovic

    Voir si ça te convient
    https://mon-partage.fr/f/hEQKU7Bp/

    J'ai annoté la macro pour comprendre ce qu'elle fait

    J'ai rajouté une formule dans la colonne V pour différencier un client sur deux ce qui permet par mise en forme conditionnelle de visualiser mieux chaque bloc de commandes par client, j'ai également différencié par MFC les lignes Réassort et Reliquat

    Cdlmnt
    Via

    0
  13. ludodil62 Messages postés 66 Statut Membre 11
     
    Bonjour via55,

    Je viens de regarder le fichier, et c'est une nouvelle fois exactement ce qu'il me fallait ! MERCI !!

    Par contre en exemple je n'ai mis qu'un extrait du fichier original qui doit faire environ 50 000 lignes.

    Pour recalculer tout ça, je n'ai qu'a copier les données à la suite ? Même mise en forme, même tri (par client puis n°jour intégration) ? Et je n'aurai plus qu'à lancer la macro ?

    Cdlt

    Ludovic
    0
  14. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    Re

    Oui exactement, la macro repère la dernière ligne remplie de la colonne 1
    Par contre avec 50 000 lignes ça va ramer un peu je pense !

    Tiens moi au courant
    A plus
    0
  15. ludodil62 Messages postés 66 Statut Membre 11
     
    Bonjour Via 55,

    Bon, effectivement avec 50 000 lignes ça a ramé un peu.. mais après environ 15 minutes de patience sans toucher le PC, ça a fonctionné ! Encore merci pour le travail effectué.

    Par contre ce n'est pas possible de faire en sorte de ne mettre des lettres que sur les commandes groupées ?

    En effet, si je veux identifier les commandes groupées par une lettre, c'est pour pouvoir les isoler du reste et calculer un nouveau volume de commande en fonction de ce critère commun via un TCD.

    Du coup j'ai galéré un peu pour supprimer les lettres sur les commandes non groupées. C'était un peu galère mais j'ai fini par y arriver. C'est complexe de modifier la macro pour avoir ce résultat (cellule vide si pas de groupement possible) ?

    Cdlt.

    Ludovic
    0
    1. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
       
      Bonjour Ludovic

      Pour les reliquats isolés c'est simple il te suffit de supprimer purement et simplement vers la fin de la macro ces lignes :
         Else ' sinon on incremente le code et on inscrit pour le reliquat isolé
                       cod = cod + 1: Range("N" & n) = Chr(cod)


      par contre pour les réassorts il faut que je regarde

      Cdlmnt
      Via
      0
  16. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    Re

    Voir si cette macro te donne les résultats attendus, en principe lettre que pour commandes groupées
    https://mon-partage.fr/f/g6v1FLhG/

    Par contre je me pose une question concernant les jours d’intégration, tu les as tous calculé un par un ? cela doit être possible par formule ou par macro
    0
  17. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    Bonjour

    Je t'avais indiqué les premières lignes à supprimer dans mon message 15 et je ne l'ai pas fait dans le fichier que je t'ai envoyé dans le 16, je me suis occupé des réassorts mais j'ai zappé les reliquats !
    Voilà le bon fichier :
    https://mon-partage.fr/f/cZPMrV4x/

    Cdlmnt
    Via
    0
  18. ludodil62 Messages postés 66 Statut Membre 11
     
    Bonjour,

    Merci pour les fichiers. Je vais tester avec le deuxième dans ce cas.

    Pour les jours d'intégration, j'ai fait simple.
    Je les ai trié du plus ancien au plus récent. J'ai inséré une colonne a droite de la date, puis saisi 1 dans la première cellule.

    Sur les cellules du dessous, jai fait :
    Si date = date du dessus, alors même valeur qu'au dessus (soit 1), sinon valeur du dessus + 1.

    Ensuite j'ai retrié par numéro de client et numéro de jour.

    Je teste le fichier avec mes 50 000 lignes et te tiens au courant. Je vais avoir la même analyse a faire mais sur une autre période.

    Cdt

    Ludovic
    0