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 SubJe 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.