XL pour MAC Répartir des commandes en colonnes dans un tableau

jcrouzil

XLDnaute Nouveau
Bonjour à tous,

J'ai besoin de vous car j'aimerais pouvoir faire en sorte de remplir un tableau (calendrier) automatiquement à partir des données rentrer dans un autre tableau au dessus.
Dans le fichier que vous trouverez en pièce-jointe, j'ai besoin de répartir mes commandes (N° dans les colonnes du tableau au dessus) dans un tableau de fabrication en dessous en limitant à 8 lignes puisque c'est notre capacité de prod actuelle. Du coup cela me permet de voir quand la porte sortira de prod en fonction de la demande.

Par exemple les 9 premières commandes du 13 juin (colonne verte) sortiront de prod le 20 et 21 juin. La dernière commande du 15 juin sortira le 24 juin.

Si je pouvais mettre cet outil à disposition de mes collaborateurs, ce serait une vraie avancée pour moi.

Le top serait de pouvoir récupérer la couleur également.
Avez vous une idée pour faire cela, je vous prie ?

Merci d'avance,
 

Pièces jointes

  • Calcul délai (Enregistré automatiquement).xls
    134.5 KB · Affichages: 5

vgendron

XLDnaute Barbatruc
Hello

donc. pour éviter les doublons: on commence par effacer le tableau destination
ensuite. pour la colonne R: elle se faisait écraser.. donc test pour chercher l'emplacement de la prochaine commande à partir de la colonne jour+6

Code:
Sub dispatch2()
Application.ScreenUpdating = False
Range("C46:EQ53").ClearContents

'zone contenant toutes les commandes à dispatcher
Set CommandToDispatch = Range("C7:EQ36")

'indices Ligne du tableau de destination
Ldest = 46


'pour chaque colonne de la zone source
For i = 3 To CommandToDispatch.Columns.Count + 2
    'si il y a au moins une commande dans la journée
    If Cells(6, i) <> 0 Then
        'on récupère les commandes de la journée: à partir de la ligne 7, on resize du nombre de commandes calculée en ligne 6
        Set ListeToDispatch = Cells(7, i).Resize(Cells(6, i))
        couleur = Cells(7, i).FormatConditions(1).Interior.ColorIndex
        'permet de décaler de 6 jours
        Cdest = i + 6
       
        'pour chaque commande de la journée
        For Each commande In ListeToDispatch
            'à partir de la colonne +6, on cherche la première place dispo, s'il y a de la place (=ligne53 vide) ET qu'il y a déjà quelque chose (=ligne46 NON vide)
            While Cells(53, Cdest) <> "" And Cells(46, Cdest) <> ""
                Cdest = Cdest + 1
            Wend
            'on récupère l'indice de ligne de la première cellule vide
            If Cells(46, Cdest) <> "" Then
                Ldest = Cells(53, Cdest).End(xlUp).Offset(1, 0).Row
            End If
            'on y colle la commande
            Cells(Ldest, Cdest) = commande
            Cells(Ldest, Cdest).Interior.ColorIndex = couleur
            'petit modulo pour augmenter le numéro de ligne tout en restant inférieur au nombre de commande max par jour
            Ldest = (Ldest - 45) Mod 9 + 46
            'si le prochain numéro de ligne=54 (donc dépasse les 8 commandes)
            If Ldest = 54 Then
                'on passe à la colonne suivante et on repasse en première ligne (46)
                Cdest = Cdest + 1
                Ldest = 46
            End If
        'commande suivant
        Next commande
    End If
    'on vient de placer les commandes d'un jour, on va donc passer au suivant
    'on réinitialise à la première ligne
    Ldest = 46
Next i
   
Application.ScreenUpdating = True
End Sub
 

vgendron

XLDnaute Barbatruc
Avec le test déplacé dans le code pour éviter de le faire à chaque commande..

Code:
Sub dispatch2()
Application.ScreenUpdating = False
Range("C46:EQ53").ClearContents

'zone contenant toutes les commandes à dispatcher
Set CommandToDispatch = Range("C7:EQ36")

'indices Ligne du tableau de destination
Ldest = 46

'pour chaque colonne de la zone source
For i = 3 To CommandToDispatch.Columns.Count + 2
    'si il y a au moins une commande dans la journée
    If Cells(6, i) <> 0 Then
        'on récupère les commandes de la journée: à partir de la ligne 7, on resize du nombre de commandes calculée en ligne 6
        Set ListeToDispatch = Cells(7, i).Resize(Cells(6, i))
        couleur = Cells(7, i).FormatConditions(1).Interior.ColorIndex
        'permet de décaler de 6 jours
        Cdest = i + 6
   
        'à partir de la colonne +6, on cherche la première place dispo,
            'si la colonne est pleine, on se décale à droite
            While Cells(53, Cdest) <> "" And Cells(46, Cdest) <> ""
                Cdest = Cdest + 1
            Wend
            'on récupère l'indice de ligne de la première cellule vide
            If Cells(46, Cdest) <> "" Then
                Ldest = Cells(53, Cdest).End(xlUp).Offset(1, 0).Row
            End If
           
           
        'pour chaque commande de la journée
        For Each commande In ListeToDispatch
           
            'on y colle la commande
            Cells(Ldest, Cdest) = commande
            Cells(Ldest, Cdest).Interior.ColorIndex = couleur
            'petit modulo pour augmenter le numéro de ligne tout en restant inférieur au nombre de commande max par jour
            Ldest = (Ldest - 45) Mod 9 + 46
            'si le prochain numéro de ligne=54 (donc dépasse les 8 commandes)
            If Ldest = 54 Then
                'on passe à la colonne suivante et on repasse en première ligne (46)
                Cdest = Cdest + 1
                Ldest = 46
            End If
        'commande suivant
        Next commande
    End If
    'on vient de placer les commandes d'un jour, on va donc passer au suivant
    'on réinitialise à la première ligne
    Ldest = 46
Next i
   
Application.ScreenUpdating = True
End Sub
 

jcrouzil

XLDnaute Nouveau
En fait j'ai réussi à le faire tout seul. Enfin quelque chose que j'arrive à faire.
Vraiment encore une fois merci pour tout, j'ai maintenant un super outil.

Code:
Sub dispatch2()

Application.ScreenUpdating = False

Range("C46:EQ53").ClearContents



'zone contenant toutes les commandes à dispatcher

Set CommandToDispatch = Range("C7:EQ36")



'indices Ligne du tableau de destination

Ldest = 46



'pour chaque colonne de la zone source

For i = 3 To CommandToDispatch.Columns.Count + 2

    'si il y a au moins une commande dans la journée

    If Cells(6, i) <> 0 Then

        'on récupère les commandes de la journée: à partir de la ligne 7, on resize du nombre de commandes calculée en ligne 6

        Set ListeToDispatch = Cells(7, i).Resize(Cells(6, i))

        Couleur = Cells(7, i).FormatConditions(1).Interior.ColorIndex

        Couleurpolice = Cells(7, i).FormatConditions(1).Font.ColorIndex

        'permet de décaler de 6 jours

        Cdest = i + 5

   

        'à partir de la colonne +6, on cherche la première place dispo,

            'si la colonne est pleine, on se décale à droite

            While Cells(53, Cdest) <> "" And Cells(46, Cdest) <> ""

                Cdest = Cdest + 1

            Wend

            'on récupère l'indice de ligne de la première cellule vide

            If Cells(46, Cdest) <> "" Then

                Ldest = Cells(53, Cdest).End(xlUp).Offset(1, 0).Row

            End If

           

           

        'pour chaque commande de la journée

        For Each commande In ListeToDispatch

           

            'on y colle la commande

            Cells(Ldest, Cdest) = commande

            Cells(Ldest, Cdest).Interior.ColorIndex = Couleur

            Cells(Ldest, Cdest).Font.ColorIndex = Couleurpolice

            'petit modulo pour augmenter le numéro de ligne tout en restant inférieur au nombre de commande max par jour

            Ldest = (Ldest - 45) Mod 9 + 46

            'si le prochain numéro de ligne=54 (donc dépasse les 8 commandes)

            If Ldest = 54 Then

                'on passe à la colonne suivante et on repasse en première ligne (46)

                Cdest = Cdest + 1

                Ldest = 46

            End If

        'commande suivant

        Next commande

    EndIf

    'on vient de placer les commandes d'un jour, on va donc passer au suivant

    'on réinitialise à la première ligne

    Ldest = 46

Next i

   

Application.ScreenUpdating = True

EndSub
 

jcrouzil

XLDnaute Nouveau
Aurais-tu une idée pour rendre un jour inactif.
Si par exemple j'ai un jour non travaillé (férié ou machine en maintenance) je dois pouvoir le rendre inactif, c'est à dire que la macro saute la colonne. Je peux supprimer la colonne mais si je pouvais le garder ce serait mieux.
Ici par exemple le 14 juillet.
Merci bien.
 

vgendron

XLDnaute Barbatruc
Hello

alors. pour les jours inactif (week end ou jour férié) voir PJ

l'idée
1) tu nommes une zone (ListeJoursFériés) dans la feuill1 et tu y mets tous les jours fériés (ou ceux que tu souhaites désactiver)

2) une fonction JourValid regarde le Jour destination (jour J + 6)
si ce Jour est un week end (>=6) ou fait parti des jours fériés, alors, la fonction décale à son tour de une colonne
 

Pièces jointes

  • Calcul délai (Enregistré automatiquement) (Enregistré automatiquement).xls
    179 KB · Affichages: 56

jcrouzil

XLDnaute Nouveau
Super, j'ai intégré cette fonction au tableau ça marche nickel.
Merci beaucoup, je pense que maintenant tout est parfait.

Je vais pouvoir planifier ma prod aux petits oignons.

Encore merci beaucoup pour ta réactivité et ton talent, le résultat est au delà de mes attentes.
A très bientôt.
 

Discussions similaires

Réponses
8
Affichages
297

Statistiques des forums

Discussions
312 287
Messages
2 086 823
Membres
103 395
dernier inscrit
Laurent34