Code VBA pour exécuter une rotation d'un planning
Bonjour, je veux du code VBA pour exécuter un planning de rotation pour un nombre de chauffeurs -livreurs en utilisant des véhicules pour assurer des destinations. J'ai 30 chauffeurs, 31 livreurs, 19 destinations et 32 véhicules. Les destinations sont classés et chaque Trio: chauffeur livreur véhicule doit assurer chaque deux jours une destination dans l'ordre défini et après 3 rotations où 4, le trio passe en réserve. J'ai un tableau excel où chaque colonne représente une donnée. colonne A livreurs, colonne B chauffeurs, colonne C véhicules, colonne D destinations, colonne E statut livreur ( Absent, en congé, mise à pied..), colonne F statut chauffeur (absent , en congé, mise à pied..), colonne G statut véhicule (disponible,en panne).je veux du code VBA pour générer à chaque exécution une rotation pour l'ensemble des trios
Merci bien.
bonjour Naoumi,
vous avez déjà un fichier avec toutes ces données ?
Bonjour et merci pour votre réponse.
oui j'ai le fichier Excel
merci pour l'aide
désolé voici le bon fichier
re,
je suppose que je n'ai pas bien compris la question.
On est par exemple le 1/1/24 et je prends aléatoirement 19 trios d'une véhicule + un chauffeur + un livreur et puis chaqu'un reçoit une destination. 2 Jours plus tard, ces 19 trios ne changent pas, mais je leur donne la destination suivante et comme ça je le fais 19 fois, donc on est déjà le 2 février et rotation 1 est fini. Je fais la même choise avec les 19 mêmes trios encore 19 fois et rotation2 est finie le 15/3. Et encore une 3eme fois et rotation3 est fini le 22 avril.
Puis on peut choisir 19 nouveaux trios véhicule-chauffeur-livreur.
Re et mille mercis pour votre réponse
Les trios sont fixés et c'est la destination qui change chaque 2 josi urs pour chaque trio.si on commence par une rotation de démarrage où chaque trio assure une destination donc 19 Trios assurent les 19 destinations pour par exemple aujourd'hui et demain, le 2 sera générée une nouvelle rotation où chaque trio avance a la destination suivante et de même cette nouvelle rotation sera pour 2 jours et une troisième rotation sera ensuite générée pour le 6 octobre car vendredi samedi est le weekend. Et chaque trio passe en réserve après avoir assurer 3 ou 4 rotations.
Merci pour l'aide
donc le tableau est correct ou pas ?
Re. Oui le tableau est correcte
re, je veux rajouter des détails :
- une rotation si elle commence jeudi son deuxième jour sera dimanche et si elle se termine jeudi, la prochaine rotation commencera le dimanche car le weekend c'est vendredi-samedi
- le binôme qui assure la destination " jijel " assure uniquement et toujours cette destination
-les destinations sont classées comme suit et chaque binôme assure ces destinations dans cet ordre et cycliquement :
Annaba2, Tebessa, Constantine1, Khenchela → Puis en réserve. (un binôme lorsque il termine d'assurer ces 4 destinations, chacune pendant 2 jours, passe en réserve pendant 2 jours sauf que durant ces deux jours de réserve, le livreur ou le chauffeur assure une destination en cas d'absence d'un collègue pour quelconque motif : absence autorisée, congé annuel , congé exceptionnel , congé de maladie )
Annaba1, Batna2, Setif1, Biskra → Puis en réserve. (ce même binôme arrivé à ces 4 destinations et après avoir les assurer chacune pendant 2 jours, passe aussi en reserve pendant 2 jours, et si jamais Ya une absence le livreur ou le chauffeur assure la destination du collègue absent)
Guelma, Skikda, BBA (Bordj Bou Arreridj) → Puis en réserve. (toujours la même chose, ce même binôme continu avec ces 3 destinations chacune pendant 2 jours puis passe en réserve et si jamais Ya une absence le livreur ou le chauffeur assure la destination du collègue absent)
OEB (Oum El Bouaghi), Jijel, Setif2 → Puis en réserve. même principe que précédemment
Souk Ahras, Mila → Puis en réserve. même principe
Setif3, El Tarf, Batna1 → Puis en réserve. même principe et la prochaine rotation sera la toutes première Annaba2 pendant 2 jours puis Tebessa pendant 2 jours puis Constantine1 pendant 2 jours puis Khenchela pendant 2 jours → Puis en réserve et ainsi de suite
-Le statut des livreurs et chauffeurs si est vide donc disponible si CA donc en congé annuel, si CM donc en congé de maladie, si CSS donc en congé sans solde, si AA donc absence autorisé, si CE donc congé exceptionnel.
-Le statut des véhicules si vide donc c’est disponible, si EP donc c’est en panne
merci pour l'aide
ce n'est qu'un début, pour le moment, tout le monde est là, toutes les véhicules sont disponibles.
Vous aviez définié 6 groupes de destinations, A à F et chaque trio prend 2 jours plus tard la destination suivante de son groupe + 1 réserve (si aucun malade, etc)
Le résultat, c'est comme dans le fichier en PJ ?
Plus tard, vous avez l'intention de planifier chaque jour ou chaque semaine ou chaque mois, parce que comment sait-on les absences, etc ?
Bonjour, une planification chaque jour qui génère la rotation des deux jours prochains comme ça on aura la liste de ceux qui seront absents ou en congé etc.. pour les deux jours qui viennent. exemple si je commence une rotation aujourd'hui je fait entrer dans mon tableau excel tous les statuts des livreurs chauffeurs et véhicules et je génère une rotation pour le 02 et 03 octobre et la prochaine rotation que je génèrerai le 03 octobre sera pour le 04 et 06 octobre ( vendredi -samedi c'est le weekend)
re, chaque trio doit assurer pour chaque deux jours une destination de tous les groupes de destinations j'ai juste classée les destinations par groupe pour montrer qu’après chaque groupe qui varie entre 04 ,06 ou 08 jours ouvrables passe en réserve et ne sera pas inclus dans la rotation pour deux jours mais doivent se présenter au travail pour en cas d'absence inattendue d'un autre collègue, il assure sa destination
re,
avec un autre layout.
feuille "parametres"
cellules B1:B2 = vos 2 dates consécutives (il faut juste changer B1, B2 est une formule qui exclut vendredi et samedi)
Puis B3 = "oui" veut dire qu'on reprend les trios d'avant-hier pour ces 2 jours et les trios prennent les destinations suivantes (comme la macro de hier).
Puis on a ces tableaux pour les préposés, les chauffeurs et les véhicules. Le premier est la liste avec les noms et en 2eme colonne, on vérifie s'il y a un blocage pour ces 2 dates B1:B2 (alors on a une MFC en rouge). 3eme colonne, moins important pour le moment, on compte le nombre de présences dans le tableau de la feuille "planning". Le 2eme tableau est une liste d'absences avec en première colonne le choix (liste déroulante), 2eme et 3eme colonne = début & fin de l'absence et 4eme colonne la raison. Ici aussi, une MFC pour montrer les blocages pour ces 2 jours B1:B2.
feuille "planning"
si on lance la macro, on reçoit un premier planning pour ces 2 jours en B1:B2 et comme c'est la premiere fois, tous les trios sont composés d'une manière aléatoire. Si il manque des possibilités, comme pour le moment pour les chauffeurs, les cellules sont vides et rouges et on assigne les "reserve" des autres destinations en colonnes L:N.
Puis je ne savais plus, faut-il continuer comme hier avec les trios existants mais avec une destination suivante dans le même groupe ou pas. Bon, c'est pour cela que j'ai crée la cellule B3 de "parametres".Si vous voulez les mêmes trios, vous choississez "oui", autrement avec "non", vous créez des nouveaux trios.
Si une véhicule, chauffeur ou préposé n'st pas disponible, son nom devient rouge (MFC) et on cherche un alternatif avec les "reserves" du jour et vous voyez ce choix dans les colonnes L:N
c'est un petit peu comme ça que vous pensez ?
PS1. avc la macro "RAZ" vous supprimez tout le contenu du tableau de la feuille "planning".
PS2: pour chaque nouveau planning, il faut ajouter 2 jours dans la cellule B1 de parametres (et éviter les vendredis et samedis) avant de relancer la macro "test"
Bonjour BsAlv
Je vous remercie énormément pour votre effort et attention. Je vais tester d'abord votre programme et je vous répondrai. Il ya sûrement plusieurs scénarios et d'autres conditions à respecter notamment les réserves ( le programme doit m'afficher la liste des préposés et chauffeurs en réserve). Un autre point pour les absents normalement un absent pour un congé annuel quand il reprend il doit assurer la destination qui succède à celle assurée le dernier jour avant son absence c a d il continu sa rotation.et un absent pour motif absens autorisée ou non autorisée quand il reprend il doit assurer la même ligne du jour de son absence.
Merci encore une fois
Mes salutations.
re,
dans la colonne O, vous avez pour le moment tous vos réserves. Je suppose, qu'excl ne pouvait pas encore les assigner dans les colonnes L:N
Si vous restez choisir pour "les mêmes trios" dans la cellule B3, ces trios ne changent pas, on remplace simplement les cellules rouges des colonnes C:E par ces colonnes L:N. Dès quelqu'un est de nouveau présent, il continue dans ce schéma.
Bonjour BsAlv, je comprends pas mai j'ai pas pu ouvrir le fichier excel que vous m'avez envoyé. Excel à cessé de fonctionner et le fichier n'a pas été ouvert
Merci pour une orientation
le même fichier que mardi 20:16, j'éspère que celui-ci est sans problèmes.
BONJOUR et je m'excuse pour l'absence j'ai mis beaucoup de temp pour comprendre le principe du travail et me voila aujourd'hui avec une autre version mais j'ai un problème avec le code actuel. sur ma feuille Rotation il y a le tableau principal de la rotation journalière avec le tableau des réserves.je peut généré la rotation de chaque jour ainsi que la liste des réserves. ensuite je génère le tableau journalier des préposés -chauffeurs sans les réserves et la sur ce tableau je remplie le statut des préposés et chauffeurs absents par AA, CA ,CM ,CSS ,CEXP, ST4, RGI. et en parallèle j'ai le tableau des réserves ou je doit aussi remplir l'état d'un préposé ou chauffeur de réserve dans le tableau RESERVES : RAA, RAC, RCM, RCSS ,RCEXP . et j'ai des interdictions à respecter lors du remplacement des absents du programme journalier par les réserves du tableau RESERVES comme suit : ' Vérifier les restrictions en fonction de la destination et du type de réserve
Select Case cell.Value
Case "Reserve1"
If (dayOfWeek = "Lundi" Or dayOfWeek = "Jeudi") And destination = "Constantine1" Then GoTo NextReserve
If (dayOfWeek = "Mardi" Or dayOfWeek = "Jeudi") And destination = "Tebessa" Then GoTo NextReserve
Case "Reserve2"
If destination = "Annaba1" Then GoTo NextReserve
If (dayOfWeek = "Mardi" Or dayOfWeek = "Jeudi") And destination = "Khenchela" Then GoTo NextReserve
Case "Reserve3"
If destination = "Setif1" Then GoTo NextReserve
If (dayOfWeek = "Dimanche" Or dayOfWeek = "Mardi") And destination = "Batna2" Then GoTo NextReserve
Case "Reserve4"
If destination = "Guelma" Or destination = "Biskra" Then GoTo NextReserve
Case "Reserve5"
If destination = "OEB" Or destination = "BBA" Then GoTo NextReserve
Case "Reserve6"
If (dayOfWeek = "Dimanche" Or dayOfWeek = "Mardi") And (destination = "Souk Ahras" Or destination = "SETIF2") Then GoTo NextReserve
Case "Reserve7"
If destination = "Setif3" Or destination = "Skikda1" Then GoTo NextReserve
Case "Reserve8"
If destination = "Annaba2" Or destination = "Batna1" Then GoTo NextReserve
End Select
donc le code qui fait le remplacement des absents par ceux en réserve sur un nouveau tableau que je nomme Programme journalier premier jour de réserve il doit respecter les interdictions précédentes. Le code doit me générer une boite de dialogue msgbox qui me demande d'introduire le jour de la semaine dimanche, lundi, mardi .. et suivant le jour il vérifie pour affecter la destination au préposé ou chauffeur de réserve. ensuite et suivant une liste destinations fatigantes et non fatigantes je passe au programme journalier du deuxième jour de réserve. si un préposé ou chauffeur à assuré une destination dite fatigante le premier jours alors on lui affecte le deuxième jour une destination non fatigante et inversement. voila la liste des destination fatigantes par ordre : Tebessa, Biskra, Souk Ahras, Batna1, BBA, Jijel, Khenchela, Batna2, El taref, Annaba2.
la liste des destination non fatigantes ou moins fatigantes est : Annaba1, Setif1, Guelma ,Mila, Skikda1, Skikda2, Setif2 ,Setif3, OEB, Constantine1
Bonjour, voila le code qui pose problème : c'est la macro du bouton générer programme journalier prmier jours de réserve
Sub GenererProgrammePremierJourDeReserve()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Rotation") ' Assurez-vous que le nom de la feuille est correct
' Trouver la dernière ligne du tableau "Programme Journalier Préposés-Chauffeurs"
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' Ajouter le titre "Programme Du Premier Jour De Réserve" sous le tableau existant
Dim newTitleRow As Long
newTitleRow = lastRow + 2
ws.Cells(newTitleRow, 1).Value = "Programme Du Premier Jour De Réserve"
ws.Cells(newTitleRow, 1).Font.Color = RGB(0, 128, 0) ' Titre en vert
ws.Cells(newTitleRow, 1).Font.Bold = True
' Obtenir le jour de la semaine pour lequel on crée le programme
Dim jourSemaine As String
jourSemaine = InputBox("Entrez le jour du programme (dimanche, lundi, etc.)")
' Créer un nouveau tableau à partir des remplacements
Dim i As Long
Dim destination As String
Dim reservePrepose As String
Dim reserveChauffeur As String
Dim newRow As Long
newRow = newTitleRow + 1 ' Commencer à remplir le tableau sous le titre
' Parcourir le tableau "Programme Journalier Préposés-Chauffeurs"
For i = 2 To lastRow ' En partant de la ligne 2 pour éviter les titres
destination = ws.Cells(i, 3).Value ' Destination de la ligne actuelle
' Copie de la ligne vers le nouveau tableau
ws.Cells(newRow, 1).Value = ws.Cells(i, 1).Value ' Préposé
ws.Cells(newRow, 2).Value = ws.Cells(i, 2).Value ' Chauffeur
ws.Cells(newRow, 3).Value = destination ' Destination
ws.Cells(newRow, 4).Value = ws.Cells(i, 4).Value ' Statut Préposé
ws.Cells(newRow, 5).Value = ws.Cells(i, 5).Value ' Statut Chauffeur
' Vérifier l'absence du préposé
If IsAbsent(ws.Cells(i, 4).Value) Then
' Trouver un préposé de réserve
reservePrepose = TrouverRemplacement("Préposé", ws, destination, jourSemaine)
If reservePrepose <> "" Then
ws.Cells(newRow, 1).Value = reservePrepose ' Remplacement du préposé
Else
MsgBox "Aucun préposé de réserve disponible pour " & destination, vbExclamation
End If
End If
' Vérifier l'absence du chauffeur
If IsAbsent(ws.Cells(i, 5).Value) Then
' Trouver un chauffeur de réserve
reserveChauffeur = TrouverRemplacement("Chauffeur", ws, destination, jourSemaine)
If reserveChauffeur <> "" Then
ws.Cells(newRow, 2).Value = reserveChauffeur ' Remplacement du chauffeur
Else
MsgBox "Aucun chauffeur de réserve disponible pour " & destination, vbExclamation
End If
End If
newRow = newRow + 1 ' Passer à la ligne suivante dans le nouveau tableau
Next i
End Sub
Function IsAbsent(status As String) As Boolean
' Vérifier si un préposé ou chauffeur est absent
Select Case status
Case "CA", "AA", "CM", "CEXP", "MAP", "DT", "ST4", "RGI", "CSS"
IsAbsent = True
Case Else
IsAbsent = False
End Select
End Function
Function TrouverRemplacement(typeRemplacement As String, ws As Worksheet, destination As String, jourSemaine As String) As String
Dim reserves As Range
Dim etats As Range
Dim i As Long
' Définir les plages en fonction du type (Préposé ou Chauffeur)
If typeRemplacement = "Préposé" Then
Set reserves = ws.Range("I2:I20") ' Colonne des préposés de réserve
Set etats = ws.Range("K2:K20") ' Colonne de l'état des préposés de réserve
Else
Set reserves = ws.Range("J2:J20") ' Colonne des chauffeurs de réserve
Set etats = ws.Range("L2:L20") ' Colonne de l'état des chauffeurs de réserve
End If
' Parcourir les réserves pour trouver un remplacement disponible
For i = 1 To reserves.Rows.Count
If etats.Cells(i, 1).Value = "" Then ' Disponible
Select Case reserves.Cells(i, 1).Value
' Vérifier les interdictions en fonction du jour et de la destination
Case "Reserve1"
If (jourSemaine = "mardi" Or jourSemaine = "jeudi") And destination = "Tebessa" Then GoTo NextReserve
If (jourSemaine = "lundi" Or jourSemaine = "jeudi") And destination = "Constantine1" Then GoTo NextReserve
Case "Reserve2"
If destination = "Annaba1" Or ((jourSemaine = "mardi" Or jourSemaine = "jeudi") And destination = "Khenchela") Then GoTo NextReserve
Case "Reserve3"
If destination = "Setif1" Or ((jourSemaine = "dimanche" Or jourSemaine = "mardi") And destination = "Batna2") Then GoTo NextReserve
Case "Reserve4"
If destination = "Guelma" Or destination = "Biskra" Then GoTo NextReserve
Case "Reserve5"
If destination = "OEB" Or destination = "BBA" Then GoTo NextReserve
Case "Reserve6"
If ((jourSemaine = "dimanche" Or jourSemaine = "mardi") And destination = "Souk Ahras") Or destination = "Setif2" Then GoTo NextReserve
Case "Reserve7"
If destination = "Setif3" Or destination = "Skikda1" Then GoTo NextReserve
Case "Reserve8"
If destination = "Annaba2" Or destination = "Batna1" Then GoTo NextReserve
End Select
' Si pas d'interdiction, retourner cette réserve
TrouverRemplacement = reserves.Cells(i, 1).Value
etats.Cells(i, 1).Value = "Utilisé" ' Marquer comme utilisé
Exit Function
End If
NextReserve:
Next i
' Si aucune réserve n'est disponible
TrouverRemplacement = ""
End Function