Planning mise en forme auto

Bien le bonjour à tous,

J'ai crée un fichier. Premiere page, les chantier en prevision avec dates de début prévu ainsi que la durée prevue. J'aimerai que le groupe ( colonne C) aille s'inscrire dans les jour de la periode concerné...

Enfin si cela est possible ?

Exemple :

Ligne deux => HAVRE (LE) "13 W.CHURCHILL" , date de début le 12 mai 2014, durée estimée 15 jours.

On vera donc inscri dans le planning de mai "HAVRE (LE) "13 W.CHURCHILL" dans les cellule du 12 au 27 mai...

Pensez vous que ce genre de choses est faisable automatiquement ?

Bien cordialement à vous

Bonsoir Manoss76,

J'ai fait une première approche qui prend en compte la date de départ et décompte de demie journée en demie journée sans tenir compte du contenu de la cellule, on ajoute les groupes les uns sous les autres à l'intérieur de la cellule. Potentiellement, on peut avoir plusieurs groupes à certaines dates, c'est déjà le cas dans ton exemple. Il faudra donc adapter le code en fonction de ton besoin.

Les jours fériés sont-ils travaillés ? Par exemple le 8 mai... Que faut-il faire ? On programme une journée de travail ?

J'ai ajouté une colonne "Statut" en P pour noter les lignes traitées et ne pas le refaire à chaque exécution du programme.

Il y a deux macros, la première pour mettre à jour le planning et la seconde pour réinitialiser le planning (période de test)

La première chose à faire : il faut que tu vérifies toutes des dates du planning, parce j'ai vu des erreurs (Feuille mai-juin en ligne 6)

Voici le code :

Option Explicit

Const PremLig As Long = 3
Const PremCol As Long = 2

Sub MiseEnPlacePlanning()
   Dim Lig As Long, Col As Long, l As Long, c As Long, Sh As Worksheet, aSh() As Worksheet, w As Long
   Dim sGroupe As String, dDateDebut As Date, oDuree As Double, bOk As Boolean

   ReDim aSh(0)
   For Each Sh In ThisWorkbook.Worksheets
      If Mid(Sh.CodeName, 1, 5) = "ShPer" Then
         ReDim Preserve aSh(UBound(aSh) + 1)
         Set aSh(UBound(aSh)) = Sh
      End If ' ShPer
   Next Sh

   For Lig = 2 To ShProgramme.UsedRange.Count
      bOk = False
      If ShProgramme.Cells(Lig, "A") <> Empty Then ' Ligne non vide
         If ShProgramme.Cells(Lig, "P") = Empty Then ' Test Ligne déjà faite
         sGroupe = ShProgramme.Cells(Lig, "C")
         If IsDate(ShProgramme.Cells(Lig, "K")) Then ' Test cellule contient une date
            dDateDebut = ShProgramme.Cells(Lig, "K")
            oDuree = Val(ShProgramme.Cells(Lig, "L"))
            If oDuree > 0 Then ' Test Durée estimée > 0
               For w = 1 To UBound(aSh) ' Boucle sur chacune des feuilles de planning
                  Set Sh = aSh(w)
                  For l = PremLig To Sh.UsedRange.Rows.Count Step 3 ' Boucle sur les lignes de planning
                     For c = PremCol To Sh.UsedRange.Columns.Count Step 2 ' Boucle sur les colonnes de planning
                        If Sh.Cells(l, c) >= dDateDebut Then ' Date du planning> Date début
                           If Not bOk Then bOk = True ' Mise à jour effectuée
                           Sh.Cells(l, c).Offset(1, 0) = Sh.Cells(l, c).Offset(1, 0) & IIf(Sh.Cells(l, c).Offset(1, 0) = Empty, "", vbLf) & sGroupe: oDuree = oDuree - 0.5
                           If oDuree <= 0 Then Exit For
                           Sh.Cells(l, c).Offset(2, 0) = Sh.Cells(l, c).Offset(2, 0) & IIf(Sh.Cells(l, c).Offset(2, 0) = Empty, "", vbLf) & sGroupe: oDuree = oDuree - 0.5
                           If oDuree <= 0 Then Exit For
                        End If
                     Next c
                     If oDuree <= 0 Then Exit For
                  Next l
                  If oDuree <= 0 Then Exit For
               Next w
            End If ' lDuree
         End If ' IsDate
         End If ' Col P <> Ok
      End If ' Col A <> ""
      ' On tope la ligne pour ne pas la mettre à jour plusieurs fois
      If bOk Then ShProgramme.Cells(Lig, "P") = "Ok"
   Next Lig
Fin:

End Sub

Sub EffacePlanning()
   Dim Lig As Long, Col As Long, l As Long, c As Long, Sh As Worksheet, aSh() As Worksheet, w As Long
   Dim sGroupe As String, dDateDebut As Date, oDuree As Double
   ReDim aSh(0)
   For Each Sh In ThisWorkbook.Worksheets
      If Mid(Sh.CodeName, 1, 5) = "ShPer" Then
         ReDim Preserve aSh(UBound(aSh) + 1)
         Set aSh(UBound(aSh)) = Sh
      End If ' ShPer
   Next Sh

   For Lig = 2 To ShProgramme.UsedRange.Count
      If ShProgramme.Cells(Lig, "A") <> Empty Then
         sGroupe = ShProgramme.Cells(Lig, "C")
         If IsDate(ShProgramme.Cells(Lig, "K")) Then
            dDateDebut = ShProgramme.Cells(Lig, "K")
            oDuree = Val(ShProgramme.Cells(Lig, "L"))
            If oDuree > 0 Then
               For w = 1 To UBound(aSh)
                  Set Sh = aSh(w)
                  For l = PremLig To Sh.UsedRange.Rows.Count Step 3
                     For c = PremCol To Sh.UsedRange.Columns.Count Step 2
                        Sh.Cells(l, c).Offset(1, 0).ClearContents
                        Sh.Cells(l, c).Offset(2, 0).ClearContents
                     Next c
                  Next l
               Next w
            End If ' lDuree
         End If ' IsDate
      End If ' Col A <> ""
   Next Lig
Fin:

End Sub

Je joins aussi le fichier.

Bonjour,

D'abord merci pour le travail effectué !

Ensuite effectivement tous les jours feriés sont chomés. de plus j'ai mis des dates au hasard pour le moment, et il n'y aura pas plusieur chantier effectué en meme temps. Concernant les lignes traitées, normalement le tri automatique à l'ouverture me met tout les dossier clos ( colonnes N => opération terminée) en bas de tableau, la colonne P est-elle nécessaire ?

Je me demandais si je n'etais pas mieux de faire une seule feuille avec le calendrier annuel ?

En tout cas le principe de fonctionnement est comme je le souhaitai !

Cordialement,

Manoss

Par contre, chaque date entré se reportent automatiquement au lundi 12 mai....

Manoss,

Calendrier Annuel ? Oui, c'est à toi de voir ce qui est le plus pratique dans l'utilisation que tu vas en faire au quotidien.

Concernant la mise à jour du planning et la nécessité d'avoir la colonne P, cela indique simplement "planning enregistré", c'est à toi de voir pour son utilité, je ne sais pas comment tu vas utiliser ton planning. Imagine que tu valides le planning du groupe de la ligne 10 aujourd'hui, démarrage 22/05/2014 avec une durée de 10 jours : Quand tu vas lancer la macro, elle va générer le planning pour ce groupe et mettre un Oui colonne P.

Si la semaine prochaine tu veux préparer le planning du groupe de la ligne 13, démarrage 5 juin avec une durée de 5 jours, le chantier de la ligne 10 ne sera pas terminé, mais le top Ok en ligne P ne prendra pas la ligne pour mettre à jour le planning et passera directement à la ligne 13. Si tu enlèves le Oui de la colonne P, elle saisira une seconde fois le groupe dans les cellules correspondantes aux dates de chantier. Le programme fonctionne comme cela, car j'ai fait en fonction des éléments qui étaient en ma possession à ce moment là pour encoder cette macro.

Il faudra adapter la macro à ton besoin, il faut faire une série de tests et corriger le code en fonction des modifications à apporter...

Pour les fériés, soit on met la cellule avec un code couleur et le programme testera la couleur et si couleur férié on passe à la date suivante, cela te permettrait de gérer par la même occasion les vacances et autres jours non travaillés (ponts...), soit on fait un contrôle de férié avec une fonction spéciale.

Il y a d'autres points à voir, comme par exemple, si tu as valider un chantier pour un client et qu'il apparait dans le planning, si tu souhaites actuellement décaler le planning de ce client, il faut supprimer le planning de tous les clients et recommencer à zéro... mais c'est peut-être ce que tu souhaites...

Concernant le 12/05/2014, c'est parce que ce n'est pas une valeur date dans la cellule, mais du texte.

Rechercher des sujets similaires à "planning mise forme auto"