VBA Ordre implantation des articles

Bonjour,

Je travaille dans un entrepôt de stockage.

Une particularité : les articles doivent être stockés dans un ordre précis et prédéfini afin de faciliter la partie expédition.

Je dois donc créer une macro, qui a pour objectif de déterminer les articles qui ne sont pas au bon endroit dans l'entrepôt pour pouvoir les déplacer, tout en ayant le moins de déplacement d'article a effectuer.

Je m'explique plus précisément :

Colonne F nous avons l'implantation actuelle des articles sous forme de rang (1 : premier article implanté, 2 : second article implanté etc)

Colonne D l'implantation théorique

Vigilance : - l'implantation théorique dépend du code chemin, le n° d'implantation recommence a 1 pour chaque chemin (les chemins sont considérés comme indépendant)

- en Colonne C qui représente les Statuts d'articles. Il ne faut prendre en compte que les statuts classe A.

Je souhaiterai écrire dans la colonne G si l'article est bien placé ou si il faut le déplacer.

Je débute tout doucement en VBA, et pour créer ma macro j'ai essentiellement utilisé des anciens post sur ce forum.

J'ai donc déjà essayé de construire une macro mais je n'arrive pas a la rendre fiable.

Pourriez-vous m'aider à automatiser la détection des articles non conforme du a leur implantation physique ?

Merci pour votre aide. Si vous avez besoin de plus de précision ou d'explication sur mon problème n’hésitez pas !

Thomas

19classeurthomas.xlsm (25.86 Ko)

Bonjour,

je reformule selon ce que j'ai compris.

si le statut est A et que l' implantation théorique est différente de l'implantation réelle mettre "à déplacer" en colonne I.

Si tel est le cas, pas besoin de macro. formule à mettre en colonne I

=SI([@Statut]="A";SI([@[Ordre d''implantation théo]]<>[@[Implantation réelle]];"à déplacer";);"")

D'abord merci de ton attention a mon problème.

Je réexplique mon problème parce que ta solution ne répond pas correctement.

L'implantation réelle est effectivement représenté sous forme de rang (1 : premier article implanté, 2 : second article implanté etc). On aura donc toujours 1 puis 2 puis 3 ... et ça dans chaque chemin

Cependant pour l’implantation théorique, elle n'est pas représentée sous forme de rang.

C'est-à-dire que : nous avons une table (brut) avec une implantation théorique de tous les articles possibles par chemin. Mais tous les articles ne sont jamais présent en même temps dans un chemin. Comme tu peux le constater, dans le chemin 1, il n'y a pas le numéro d'ordre théorique "2" -> parce que l'article qui doit avoir cet ordre théorique dans le chemin n'est pas présent.

Pour le chemin 1, l'ordre théorique des produits devrait être :

Nom article Statut Ordre d'implantation théorique

CIDRE BRUT 75CL A 1

CIDRE DX 75CL A 1

RICARD 50CL B 1

BIERE 6X25CL A 1

AFFLIGEM 6X25 B 1

PINEAU 75CL A 1

PINEAU 75CL A 1

RICARD 1L B 1

CURLY 100 G A 3

RICARD 2L A 3

RICARD 70CL A 4

SUCRE DE CANNE A 4

CURLY 200 G A 5

PASTIS 1L A 5

CIDRE ROSE 75CL B 5

RICARD 70CL A 8

On remarque d'ailleurs rapidement que plusieurs articles on un ordre d'implantation théorique égal -> même catégorie d'article donc on peut les implanter sans problème d'ordre le CIDRE BRUT 75CL peut se situer avant le CIDRE DX 75CL ou inversement puisqu'ils ont un numéro d'ordre d'implantation théorique égal.

Voila pourquoi il me semblait qu'utiliser une macro était la bonne solution a adopter

re bonjour

et sur base de ce tableau

CIDRE BRUT 75CL A 1

CIDRE DX 75CL A 1

RICARD 50CL B 1

BIERE 6X25CL A 1

AFFLIGEM 6X25 B 1

PINEAU 75CL A 1

PINEAU 75CL A 1

RICARD 1L B 1

CURLY 100 G A 3

RICARD 2L A 3

RICARD 70CL A 4

SUCRE DE CANNE A 4

CURLY 200 G A 5

PASTIS 1L A 5

CIDRE ROSE 75CL B 5

RICARD 70CL A 8

quel devrait être le résultat que tu attends ?

Le tableau est le même que dans le fichier que j'ai envoyé en PJ de mon premier message.

J'ai simplement effectué un tri croissant des ordre d'implantation théorique a travers le chemin 1

Nom_Article Statut Ordre d'impl théo Code Chemin Implantation réelle Action théorique Résultat Macro

CIDRE BRUT 75CL A 1 1 5 ok

CIDRE DX 75CL A 1 1 6 ok

RICARD 50CL B 1 1 7

BIERE 6X25CL A 1 1 11 A déplacer

AFFLIGEM 6X25 B 1 1 12

PINEAU 75CL A 1 1 13 A déplacer

PINEAU 75CL A 1 1 14 A déplacer

RICARD 1L B 1 1 15

CURLY 100 G A 3 1 1 A déplacer

RICARD 2L A 3 1 8 A déplacer A déplacer

RICARD 70CL A 4 1 9 A déplacer A déplacer

SUCRE DE CANNE A 4 1 10 A déplacer A déplacer

CURLY 200 G A 5 1 2 A déplacer A déplacer

PASTIS 1L A 5 1 3 A déplacer A déplacer

CIDRE ROSE 75CL B 5 1 4

RICARD 70CL A 8 1 16 ok A déplacer

Comme vous pouvez le constater, dans certains cas, le résultat issu de ma réflexion (colonne action théorique) et le résultat de la macro sont différents.

re-bonjour,

désolé d'être lent à la détente, mais quand faut-il mettre "à déplacer" et quand faut-il mettre "ok" ? Je ne parviens pas à déduire la règle sur base du tableau que tu as fourni. Donc merci d'expliquer pourquoi selon ta réflexion tu as mis "à déplacer" ou "ok", pour les différentes lignes.

Aucun soucis, mes explications ne devaient pas être précises.

Le tableau pour le chemin 1 :

Code Etp Code Article Nom_Article Statut Ordre d'implantation théo Code Chemin Implantation réelle Action théorique Résultat Macro

CE001 926297 CIDRE BRUT 75CL A 1 1 5 ok -> il existe 8 implantation théorique "1" autrement dit les 8 articles avec l'implantation théorique 1 devront correspondre au numéro d'implantation de 1 à 8. L'implantation réelle de cet article = "5 ".Donc, si cet article conserve son implantation (le 5eme) il sera toujours bien placé puisqu'il sera le 5ème article avec un ordre théorique "1". ok = bien placé dans le chemin et ne nécessite aucun déplacement

CE001 931687 CIDRE DX 75CL A 1 1 6 ok -> même chose que précédemment

CE001 111175 RICARD 50CL B 1 1 7 -> article classe B donc on ne touche pas

CE001 48293 BIERE 6X25CL A 1 1 11 A déplacer -> il existe 8 implantation théorique "1" correspondant au numéro d'implantation de 1 à 8. L'implantation réelle de cet article = "11 ". Donc article a déplacer

CE001 386946 AFFLIGEM 6X25 B 1 1 12 -> article classe B donc on ne touche pas

CE001 173606 PINEAU 75CL A 1 1 13 A déplacer -> il existe 8 implantation théorique "1" correspondant au numéro d'implantation de 1 à 8. L'implantation réelle de cet article = "13". Donc article a déplacer

CE001 173810 PINEAU 75CL A 1 1 14 A déplacer -> il existe 8 implantation théorique "1" correspondant au numéro d'implantation de 1 à 8. L'implantation réelle de cet article = "14 ". Donc article a déplacer

CE001 111168 RICARD 1L B 1 1 15 -> article classe B donc on ne touche pas

CE001 544271 CURLY 100 G A 3 1 1 A déplacer -> il existe 2 implantation théorique "3" correspondant au numéro d'implantation de 9 à 10. L'implantation réelle de cet article = "1". Donc article a déplacer

CE001 928837 RICARD 2L A 3 1 8 A déplacer A déplacer -> il existe 2 implantation théorique "3" correspondant au numéro d'implantation de 9 à 10. L'implantation réelle de cet article = "8". Donc article a déplacer (Dans ce cas précis le numéro d'implantation théorique = à +/- 1 du réel et j'aimerai ne pas déplacer cet article pour laisser de la flexibilité)

CE001 438070 RICARD 70CL A 4 1 9 A déplacer A déplacer -> il existe 2 implantation théorique "4" correspondant au numéro d'implantation de 11 à 12. L'implantation réelle de cet article = "9". Donc article a déplacer

CE001 40503 SUCRE DE CANNE A 4 1 10 A déplacer A déplacer -> il existe 2 implantation théorique "4" correspondant au numéro d'implantation de 11 à 12. L'implantation réelle de cet article = "10". Donc article a déplacer

CE001 544272 CURLY 200 G A 5 1 2 A déplacer A déplacer -> il existe 3 implantation théorique "5" correspondant au numéro d'implantation de 13 à 15. L'implantation réelle de cet article = "2". Donc article a déplacer

CE001 41419 PASTIS 1L A 5 1 3 A déplacer A déplacer -> il existe 3 implantation théorique "5" correspondant au numéro d'implantation de 13 à 15. L'implantation réelle de cet article = "3". Donc article a déplacer

CE001 193205 CIDRE ROSE 75CL B 5 1 4 -> article classe B donc on ne touche pas

CE001 253532 RICARD 70CL A 8 1 16 ok A déplacer -> il existe 1 implantation théorique "8" correspondant au dernier numéro d'implantation le 16. L'implantation réelle de cet article = "16". Donc article est bien placé -> ok

Est ce que c'est plus clair maintenant ?

Bonjour,

sur base de ce que j'ai compris.

13classeurthomas.xlsm (26.16 Ko)

Bravo ! C'est ce que je souhaite, merci beaucoup !

Par curiosité et surtout pour être capable de reproduire des macros de ce type, j'ai quelques questions sur votre code :

Est-ce que le code toujours est utilisable si l'on utilise un Array pour optimiser le temps d’exécution ? L'exemple que j'ai utilisé était sur une trentaine de ligne mais en réalité j'ai environ 5000 lignes.

J'ai quelques inquiétude sur l'utilisation de la fonction : Application.WorksheetFunction.CountIf. Il me semble avoir lu sur ce forum que son utilisation était impossible dans un Array

oi = Application.WorksheetFunction.CountIf(Range(Cells(2, "E"), Cells(dl, "E")), Cells(i, "E"))

Bonjour,

Est-ce que le code toujours est utilisable si l'on utilise un Array pour optimiser le temps d’exécution ? L'exemple que j'ai utilisé était sur une trentaine de ligne mais en réalité j'ai environ 5000 lignes.

Bonjour, oui c'est possible moyennant l'adaptation de l'instruction countif comme tu l'as indiqué.

soit il faut développer sa propre fonction countif sur une array

soit tu utilises l'astuce proposée dans le lien ci-après.

https://stackoverflow.com/questions/37174152/array-countif-substitute-countmatch

Bonsoir,

En faisant des tests de performances, je me suis rendu compte qu'il y avait un bug. voici donc une version corrigée.

le code tel quel met moins de 2 secondes pour 7000 lignes. A toi de voir s'il est nécessaire de le rendre plus performant en passant par une array.

8classeurthomas.xlsm (298.56 Ko)

Un grand merci pour ton travail !

Ta solution semble répondre a ma demande et tu as même corrigé le petit bug !

Merci pour l'astuce Array ! J'essayerai de l'utiliser si jamais le temps d’exécution du code est beaucoup plus long.

J'essaye d'adapter ton code a mon fichier final et je te fais un retour.

Dès que j'ai réussi a finaliser ma macro je ferme la discussion.

Encore merci !

Bonjour,

Je m’excuse pour le temps depuis mon dernier message, j'ai eu un dossier urgent a finir.

En PJ, mon fichier adapté avec ta macro.

Le temps d’exécution est rapide, j'ai utilisé un Array pour mettre en forme mes données et non pas dans ta macro. Après test, les résultats de la macro sont plutôt bon : aucune erreur identifiée.

Mais comme tu peux le constater j'ai beaucoup de ligne "A déplacer". Pour limiter cet effet, j'aimerai pouvoir appliquer une flexibilité a ta macro. C'est à dire, ne pas considérer l'article a déplacer si il se trouve dans le numéro d'ordre d'implantation théorique précédent ou suivant.

Attention je ne parle pas de la plage [Ordre Théorique actuel - 1 ; Ordre Théorique actuel + 1] mais de la plage [Ordre Théorique actuel précédent ; Ordre Théorique actuel suivant].

Si tu as des questions (ou un besoin de plus de précision), sur la "flexibilité" que je souhaite laisser a la macro, n’hésite pas.

Bonjour,

voici une adaptation. à vérifier !

Bonjour,

Je regarde ta solution et te fait un retour rapidement.

Merci pour ton travail !

Bonjour,

Après vérification les résultats de la marco sont ok.

Cependant, quand je confronte mon problème a la réalité les solutions de la macro ne sont pas réaliste et donc impossible a mettre en place.

Je m'explique avec un exemple :

Le chemin 1 va de l'ordre théorique 1 à 2000,

Dans ce chemin l'ordre 1 va de 1 à 500

Dans ce chemin l'ordre 2 va de 501 à 1000

Dans ce chemin l'ordre 3 va de 1001 à 1500

Dans ce chemin l'ordre 4 va de 1501 à 2000

Avec la macro actuelle, si un produit est a un ordre d'implantation réel de 510 et un ordre théorique de 1 -> considéré comme ok

Si un produit est a un ordre d'implantation réel de 990 et un ordre théorique de 1 -> considéré comme ok

Voila mon problème, il y aura donc plus de 450 emplacements entre mon article et les articles de la même famille (même ordre d'implantation théorique).

Dans le premier fichier que j'ai partagé, je n'avais qu'une trentaine de valeur donc je n'avais pas identifié ce problème.

L'utilisation d'un % (pour commencer utilisation de 10% -> a vérifier avec résultat obtenu) du chemin et de seuils min/max réglable (pour plus de flexibilité), me semble être une solution qui s'adaptera mieux a la réalité.

Je développe l'utilisation du "%" dans le calcul.

Le chemin 1 va de l'ordre théorique 1 à 400,

Dans ce chemin l'ordre 1 va de 1 à 100

Dans ce chemin l'ordre 2 va de 101 à 200

Dans ce chemin l'ordre 3 va de 201 à 300

Dans ce chemin l'ordre 4 va de 301 à 400

Un produit avec un ordre d'implantation réel de 100 et un ordre théorique de 1 -> considéré comme ok (dans les bons numéro d'ordre)

Un produit avec un ordre d'implantation réel entre 91 et 210 et un ordre théorique de 2 -> considéré comme ok (correspond à +/-10% du chemin)

Je développe l'utilisation du "seuil max" dans le calcul.

Le chemin 1 va de l'ordre théorique 1 à 1500,

Dans ce chemin l'ordre 1 va de 1 à 1000

Dans ce chemin l'ordre 2 va de 1001 à 1100

Dans ce chemin l'ordre 3 va de 1101 à 1450

Dans ce chemin l'ordre 4 va de 1451 à 1500

Un produit avec un ordre d'implantation réel de 100 et un ordre théorique de 1 -> considéré comme ok (dans les bons numéro d'ordre)

Un produit avec un ordre d'implantation réel de 1100 et un ordre théorique de 1 -> considéré comme ok (correspond à 10% du chemin) cependant supérieur au seuil de 50 (-> variable : possibilité de modification de cette valeur suivant les résultats) produits d'écart avec la limite de l'ordre 1 -> a déplacer dans l'ordre théorique 1

Je développe l'utilisation du "seuil min" dans le calcul.

Le chemin 1 va de l'ordre théorique 1 à 40,

Dans ce chemin l'ordre 1 va de 1 à 10

Dans ce chemin l'ordre 2 va de 11 à 32

Dans ce chemin l'ordre 3 va de 33 à 35

Dans ce chemin l'ordre 4 va de 35 à 40

Un produit avec un ordre d'implantation réel de 10 et un ordre théorique de 1 -> considéré comme ok (dans les bons numéro d'ordre)

Un produit avec un ordre d'implantation réel de 11 et un ordre théorique de 1 -> considéré comme ok (correspond à 10% du chemin)

Un produit avec un ordre d'implantation réel de 12 et un ordre théorique de 1 -> supérieur au 10% du chemin -> considéré comme article a déplacer -> cependant en réalité l'article se trouve a coté de la zone d'ordre théorique 1 (a 2 emplacements pret).

L'idée, de la même facon que pour le seuil max, est de considérer l'article comme ok si le seuil de 15 produits d'écarts n'est pas dépassé (même chose -> variable : possibilité de modification de cette valeur suivant les résultats)

N’hésite pas si tu as besoin de plus de précision sur ma demande .

Bonne journée !

bonjour,

une version adaptée pour tenir compte de 4 paramètres, %, seuil min, seuil max et détail de la raison du choix. paramètres à modifier dans le code.

Re bonjour,

Merci pour ton travail je vais regarder ça tout de suite !

Peux-tu m'expliquer a quoi sert la variable dbg dans ta macro ? J'ai du mal a comprendre comment elle fonctionne

Bon week end !

bonsoir,

dbg (debug) peut prendre la valeur true or false. et active ou désactive l'affichage des valeurs sur lesquelles la macro s'est basée pour faire son choix. cela me semblait utile pour faire le tuning des autres paramètres.

Rechercher des sujets similaires à "vba ordre implantation articles"