Simulation roulement

Résolu
Bonjour,

Bonjour,

Dans le cadre de mon travail, afin de faciliter la gestion des plannings, je sollicite votre aide sur un point : Dans un classeur Excel avec plusieurs feuilles (cf pièce jointe), j'aimerais créer plusieurs feuilles symbolisant des semaines type conducteurs qui puiseront leurs données dans la feuille "ValeurhoraireR". Le but étant que la feuille "Roulement conducteur 1", je choississe par exemple le service "A01" pour le lundi 1ère semaine et que donc ce service se masque ou ne soit plus sélectionnable dans la "feuille Roulement conducteur 2 " et ainsi de suite... Ceci afin de créer des roulements conductuer unique avec 36 services par jour et 12 conducteurs en repos, c'est-à-dire au total 48 affectations par jour et donc un roulement sur 48 tour.

https://mon-partage.fr/f/BXbcflYy/

Merci pour votre aide

29 réponses

Résumé de la discussion

Un roulement conducteur dans Excel est envisagé, avec des feuilles hebdomadaires qui puisent leurs données dans ValeurhoraireR et qui grisent ou masquent des services selon le conducteur et le jour. Plusieurs réponses proposent une solution partielle : créer une feuille Services récapitulant les services A par jour et semaine, puis réaffecter les validations pour chaque conducteur. Des échanges signalent des bogues de dégrisement et des difficultés de synchronisation entre le simulateur et le classeur SERVICES PERIODE 1 v1, avec l'ajout de boutons et de macros. En cas de progression, certains répondants prévoient d'étendre le système à 36 services par jour et 12 conducteurs en repos, soit 48 affectations quotidiennes, nécessitant une gestion fine des validations et des liens entre classeurs.

Bobot (l’IA à votre service)
  1. Bonsoir
    Merci pour ton aide.
    Je n'ai pas le temps de tester tout de suite. Je te tiens informé de la suite.
    Crdlt
    0
    1. Bonsoir
      Je te remercie pour ta réponse. J'ai effectué des essais et j'ai remarqué un problème au niveau de grisage des cellules pour quelque services, si je choisi le A003 les services grisés sont A003,A004 et A006, la meme chose pour plusieurs services sur tout les jours semaines.




      J'ai essayé de réparer l'erreur mais sans succès.
      "Set c = Columns("A").Find(ServiceEX, LookIn:=xlValues)
      NbLig = Selection.Rows.Count
      c.Select
      If c <> "" Then Range(Cells(c.Row, "A"), Cells(c.Row + NbLig - 1, "S")).Interior.ColorIndex = xlNone"

      Merci pour ton aide.
      0
      1. Bonjour
        J'ai refais les tests et pour moi tout est OK. Je suppose qu'il devait rester des sélections de services dans les feuilles de certains conducteurs lors des essais.
        Le bouton "Réinitialiser" ne faisait que réinitialiser la feuille" Services" et le fichier "Services Périodes 1".
        j'avais rajouté un bouton "Effacer le tableau" dans chaque feuille conducteur pour n'effacer que le tableau du conducteur sélectionné, ce qui nécessitait de passer en revue tous les conducteurs. J'ai donc apporté une modification affectée au bouton "Réinitialiser" qui dans la foulée effacera les tableaux de tous les conducteurs. Reste à savoir si cela vous convient, ou bien si vous préférez, créez un bouton supplémentaire dans la feuille "Services" et affectez y la macro "EffacerTableauxConducteurs", si vous optez pour cette solution supprimez les lignes suivantes dans la macro "Reinitialiser":
            EffacerTableauxConducteurs
            Sheets("Services").Select


        Voici les nouveaux codes du module 2
        Sub Reinitialiser()
            Application.ScreenUpdating = False
            Range("A2:A49").Copy
            Range("B2:BE49").Select
            ActiveSheet.Paste
            
            'Effacement des réservations dans le classeur "SERVICES PERIODES"
            Degrisage
            EffacerTableauxConducteurs
            Sheets("Services").Select
        End Sub
        
        Sub EffacerTableauxConducteurs()
            Application.ScreenUpdating = False
            For i = 1 To Sheets.Count
                If Sheets(i).Name <> "Simulation Semaine" And Sheets(i).Name <> "Simulation Vacances" And Sheets(i).Name <> "Valeur horaireR" And Sheets(i).Name <> "Valeur POINT" And Sheets(i).Name <> "Services" Then
                    Sheets("Roulement conducteur 1").Select
                    Range("D10:K17").ClearContents
                End If
            Next i
        End Sub
        

        Cdlt
        0
    2. Bonjour

      Autant pour moi pour mardi. mais ca fait la même chose avec dim(2) conducteur 54040 pourtant le service existe!!
      Merci beaucoup pour ton aide.

      0
      1. Bonjour

        Merci pour ta réponse.
        J'ai effectué des essais, toujours un problème au niveau des saisies.



        Merci

        Cordialement.
        0
        1. le service A001 n'existe pas dans la feuille "mar"
          0
      2. Bonsoir

        J'ai effectué les modifications que tu as apportées. J'ai remarqué que quand je choisis le service A001 pour le chauffeur A le lundi de la 1ère semaine, ce même se grise mais si je le corrige et le remplace il ne se dégrise pas. De plus les service choisies pour les autres jours (mardi, mercredi....) ne se grise pas a l'heure choix dans les feuilles spécifique mais sur celle de lundi.

        J'espère que mon explication est suffisamment claire.

        voici le fichier avec la création des feuilles conducteurs et les modifications que tu m'as demandé de faire : https://mon-partage.fr/f/fFQnQEmt/

        Merci pour ton aide.
        0
        1. Bonjour
          1)-Important: En premier lieu, il faut réinitialiser les services pour partir d'un fichier vierge. Cliquez sur le bouton "réinitialiser" de la feuille "Services".
          2)-Vous n'avez pas affecté les bonnes validations de données pour chaque jour. Pour le lundi de la première semaine, il faut affecter la liste: =Liste_A1_lun_sem1, pour le lundi de la 2ème semaine, se sera: =Liste_A1_lun_sem2, ainsi de suite pour tous les autres jours et pour chaque conducteurs.
          3)-remplacez la macro "Grisage" par :
          Sub Grisage()
              Application.ScreenUpdating = False
              FeuilleActive = ActiveSheet.Name
              Windows("SERVICES PERIODE 1 v1.xlsm").Activate
              If Sem <> 1 Then Onglet = Left(Jour, 3) & " (" & Sem & ")" Else: Onglet = Left(Jour, 3)
              Set C = Columns("A").Find(Service, LookIn:=xlValues)
              If C Is Nothing Then
                  MsgBox "Service introuvable dans le classeur ""SERVICES PERIODE"""
                  Exit Sub
              End If
              C.Select
              NbLig = Selection.Rows.Count
              With Range(Cells(C.Row, "A"), Cells(C.Row + NbLig - 1, "S")).Interior
                  .ThemeColor = xlThemeColorDark1
                  .TintAndShade = -0.249977111117893
              End With
              Windows("SIMULATEUR ROULEMENT V1.xlsm").Activate
              Sheets(FeuilleActive).Select
          End Sub

          Commencez par ces modifications, on verra par la suite.
          Bonne soirée
          Cdlt
          0
          1. Bonjour,

            J'ai effectué les modifications que tu as apportées. J'ai remarqué que quand je choisis le service A001 pour le chauffeur A le lundi de la 1ère semaine, ce même service reste apparent dans la liste déroulante du chauffeur B pour le même jour, alors que ce n'était pas le cas avant les dernières modifications.

            De plus, concernant la feuille "SERVICES PERIODE V1", le but est que lorsque tous les conducteurs auront choisi leur service dans le classeur "simulation de service", tous les services soient grisés. C'est-à-dire qu'au fur et à mesure que les conducteurs choisissent leur service, cela agrémente le classeur "SERVICES PERIODE V1". Exemple, le conducteur A choisis tous ses services pour les 8 semaines, ceux-ci sont donc grisées sur toutes les feuilles du classeur. Le conducteur B verra que ces services sont grisés mais ne pourra pas les sélectionner. Il devra en choisir des non grisés et ainsi de suite pour les autres chauffeurs jusqu'à l'attribution de tous les services à chacun des chauffeurs.

            J'espère que mon explication est suffisamment claire.

            voici le fichier avec la création des feuilles conducteurs et les modifications que tu m'as demandé de faire : https://mon-partage.fr/f/05macXpA/


            Merci beaucoup pour ton aide.
            0
            1. Bonjour
              Il va falloir faire quelques modifications.
              A faire pour chaque conducteurs, remplacez les macros des modules de feuille par
              Private Sub Worksheet_Change(ByVal Target As Range)
                  If Not Intersect(Target, Range("D10:J17")) Is Nothing Then
                      Jour = Cells(9, Target.Column)
                      Sem = Cells(Target.Row, "C")
                      Service = Target
                      ServiceEx = [A1]
                      RetirerService
                      'grisage dans le classeur "Services périodes"
                      Grisage
                      [A1] = Target
                      [A1].Select
                  End If
              End Sub
              
              Commentaires: A chaque sélection d'un service, on le sauvegarde dans la cellule A1 de chaque conducteur, Si pour le même conducteur on change de service, on restitue le précédent service sauvegardé et on supprime le nouveau service sélectionné qui à son tour va s'écrire en A1.

              Ensuite, remplacez la macro "RetirerService" par
              Sub RetirerService()
                  Application.ScreenUpdating = False
                  Application.Calculation = xlCalculationManual
                  FeuilActive = ActiveSheet.Name
                  Liste = Jour & " sem " & Sem
                  Sheets("Services").Select
                  Set l = Rows("1").Find(Liste, LookIn:=xlValues)
                  If l Is Nothing Then Exit Sub
                  l.Select
                  
                  Set ListServ = Range(Cells(l.Row, l.Column), Cells(50, l.Column))
                  If ServiceEx <> "" Then
                      Set C = ListServ.Find(ServiceEx, LookIn:=xlValues)
                      If C Is Nothing Then Cells(49 + 1, l.Column) = ServiceEx
                  End If
                  
                  Set C = ListServ.Find(Service, LookIn:=xlValues)
                  C.ClearContents
                  Range(Cells(1, l.Column), Cells(50, l.Column)).Select
                  ActiveWorkbook.Worksheets("Services").Sort.SortFields.Clear
                  ActiveWorkbook.Worksheets("Services").Sort.SortFields.Add Key:=Range(Cells(2, l.Column), Cells(50, l.Column)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortTextAsNumbers
                  With ActiveWorkbook.Worksheets("Services").Sort
                      .SetRange Range(Cells(1, l.Column), Cells(50, l.Column))
                      .Header = xlYes
                      .SortMethod = xlPinYin
                      .Apply
                  End With
                  Sheets(FeuilActive).Select
                  Application.Calculation = xlCalculationAutomatic
              End Sub

              Avec cette modif, ça devrait aller
              Cdlt
              0
              1. Bonjour,

                La première manipulation (grisage ou dégrisage d’un service si sélectionné sur les fiches) fonctionne parfaitement pour le 1er conducteur. Je souhaite le faire pour 42 conducteurs.
                Un problème apparaît: lorsque j’effectue la même manipulation pour sélectionner les services du " conducteur 2" la macro dégrise les services déjà grisé pour le "conducteur 1" pour les remplacer par ceux du "conducteur 2" .

                Je souhaite donc pouvoir griser les services au fur et à mesure, ce qui empêcherait les conducteurs suivant de choisir le même service le même jour deux fois. Ils doivent rester apparents, mais grisés .

                merci pour ton aide
                0
                1. Bonjour
                  Remplacez la macro "RetirerService" par celle-ci
                  Sub RetirerService()
                      Application.ScreenUpdating = False
                      Application.Calculation = xlCalculationManual
                      FeuilActive = ActiveSheet.Name
                      Liste = Jour & " sem " & Sem
                      Sheets("Services").Select
                      Set l = Rows("1").Find(Liste, LookIn:=xlValues)
                      If l Is Nothing Then Exit Sub
                      l.Select
                      Range("A2:A49").Copy
                      Range(Cells(l.Row + 1, l.Column), Cells(49, l.Column)).Select
                      ActiveSheet.Paste
                      Set ListServ = Range(Cells(l.Row, l.Column), Cells(50, l.Column))
                      Set C = ListServ.Find(Service, LookIn:=xlValues)
                      If C Is Nothing Then Exit Sub
                      C.ClearContents
                      Range(Cells(1, l.Column), Cells(50, l.Column)).Select
                      ActiveWorkbook.Worksheets("Services").Sort.SortFields.Clear
                      ActiveWorkbook.Worksheets("Services").Sort.SortFields.Add Key:=Range(Cells(2, l.Column), Cells(50, l.Column)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortTextAsNumbers
                      With ActiveWorkbook.Worksheets("Services").Sort
                          .SetRange Range(Cells(1, l.Column), Cells(50, l.Column))
                          .Header = xlYes
                          .SortMethod = xlPinYin
                          .Apply
                      End With
                      Sheets(FeuilActive).Select
                      Application.Calculation = xlCalculationAutomatic
                  End Sub

                  Cdlt
                  0
                  1. Rebonjour,

                    J'ai testé la macro. Elle fonctionne très bien pour griser et dégriser. Cependant, si je choisis par exemple le service A001 dans une cellule et que je le corrige par la suite, il est dégrisé dans le classeur SERVICE PERIODE 1, mais je ne peux pas le ressaisir car il est déjà supprimé de la sélection de la feuille Services dans le classeur SIMULATEUR ROULEMENT V1. Pour le sélectionner à nouveau, il faut réinitialiser, retour à la case départ. Y aurait-il une macro pour pallier à cela ?
                    merci
                    0
                    1. Bonjour
                      Remplacez la macro "Grisage" par celle-ci
                      Sub Grisage()
                          Application.ScreenUpdating = False
                          FeuilleActive = ActiveSheet.Name
                          Windows("SERVICES PERIODE 1 v1.xlsm").Activate
                          If Sem <> 1 Then Onglet = Left(Jour, 3) & " (" & Sem & ")" Else: Onglet = Left(Jour, 3)
                          Sheets(Onglet).Select
                          With Range("A2:S91").Interior
                              .Pattern = xlNone
                              .TintAndShade = 0
                              .PatternTintAndShade = 0
                          End With
                          Set C = Columns("A").Find(Service, LookIn:=xlValues)
                          If C Is Nothing Then
                              MsgBox "Service introuvable dans le classeur ""SERVICES PERIODE"""
                              Exit Sub
                          End If
                          C.Select
                          NbLig = Selection.Rows.Count
                          With Range(Cells(C.Row, "A"), Cells(C.Row + NbLig - 1, "S")).Interior
                              .ThemeColor = xlThemeColorDark1
                              .TintAndShade = -0.249977111117893
                          End With
                          Windows("SIMULATEUR ROULEMENT V1.xlsm").Activate
                          Sheets(FeuilleActive).Select
                      End Sub

                      Cdlt
                      0
                      1. Bonjour,

                        merci pour ta réponse rapide. J'ai créé les autres feuilles de conducteurs. Tout fonctionne pour l'instant. Le seul bémol est que quand je choisis un service dans une cellule, celui-ci se grise, mais une fois grisé, on ne peut pas revenir en arrière (reste grisé, même quand on rectifie le choix dans la même cellule). c'est-à-dire que l'on est obligé de tout réinitialiser en cas d'erreur de saisie. Y a-t-il une solution pour pallier à cela ?

                        Merci
                        0
                        1. Bonsoir
                          Les noms des feuilles "MAR , MER , JEU etc... contiennent un espace à la fin, Supprimez cet espace.
                          Cdlt
                          0
                          1. Bonjour,

                            Après test et ajout des onglets de conducteurs, je me suis aperçu d'une erreur de la 1ère ligne (semaine 1 a partir de mardi...) : il me sort une erreur (cf capture écran). Je ne parviens pas à la corriger. Je vous renvoie le fichier.
                            Merci pour votre intérêt.
                            J'aurais besoin d'une réponse rapide.
                            Merci

                            https://mon-partage.fr/f/crmw3gAy/

                            0
                            1. Bonjour
                              Question1: je voudrais créer 36 feuilles conducteur par nom et prénom dans le fichier simulation : est-ce qu'il faut copier la macro existante dans la feuille conducteur 1 ? Et comment ?
                              Il ne faut recopier que la macro qui se trouve dans le module de la feuille "Roulement conducteur ", c'est la même pour tous les conducteurs. il faut la recopier dans chaque nouvelle feuille conducteur créée.


                              Dans le module "this Workbook",
                              la deuxième ligne doit être:
                              Workbooks.Open Filename:="C:\Users\jenetniz\Desktop\Pimous\SERVICES PERIODE 1 v1.xlsm"
                              c'est le fichier "SERVICES PERIODES" que l'on doit ouvrir.

                              2ème Question:est-ce qu'il faut changer des paramètres pour que la ou les macro reconnaissent les nouvelles feuilles créer ? Où ? NON

                              3ème Question: si je souhaite ajouter des services dans la feuille "services" dans le classeur simulation, comment déclarer les cellules ajoutées ? En déclarant les nouvelles listes dans la feuille "Services", en dessous de liste déjà crée. Dans la macro "RetirerService", remplacer la valeur 50 par le numéro de la dernière ligne. Pensez à modifier les plages ou en créer d'autres.

                              Bon courage
                              Cdlt
                              0
                              1. Bonjour
                                Merci pour ton aide.
                                Je n'ai pas le temps de tester tout de suite. Je te tiens informé de la suite.
                                0
                            2. Bonjour,

                              Merci pour les corrections apportées. J'ai encore juste quelques questions :

                              - je voudrais créer 36 feuilles conducteur par nom et prénom dans le fichier simulation : est-ce qu'il faut copier la macro existante dans la feuille conducteur 1 ? Et comment ?


                              - est-ce qu'il faut changer des paramètres pour que la ou les macro reconnaissent les nouvelles feuilles créer ? Où ?



                              - si je souhaite ajouter des services dans la feuille "services" dans le classeur simulation, comment déclarer les cellules ajoutées ?


                              Merci encore
                              0
                              1. C'est toujours lié aux problèmes des noms de feuille.
                                remplacez la macro Degrisage par celle-ci
                                Sub Degrisage()
                                    Application.ScreenUpdating = False
                                    Windows("SERVICES PERIODE 1 v1.xlsm").Activate
                                    Sheets("lun").Select
                                    ActiveWindow.ScrollWorkbookTabs Position:=xlLast
                                    Sheets(Array("lun", "lun (2)", "lun (3)", "lun (4)", "lun (5)", "lun (6)", "lun (7)", _
                                        "lun (8)", "mar ", "mar (2)", "mar (3)", "mar (4)", "mar (5)", "mar (6)", "mar (7)", _
                                        "mar (8)", "mer ", "mer (2)", "mer (3)", "mer (4)", "mer (5)", "mer (6)", "mer (7)", _
                                        "mer (8)", "jeu")).Select
                                    Sheets(Array("jeu (2)", "jeu (3)", "jeu (4)", "jeu (5)", "jeu (6)", "jeu (7)", _
                                        "jeu (8)", "ven", "ven (2)", "ven (3)", "ven (4)", "ven (5)", "ven (6)", "ven (7)", _
                                        "ven (8)", "sam", "sam (2)", "sam (3)", "sam (4)", "sam (5)", "sam (6)", "sam (7)", _
                                        "sam (8)", "dim", "dim (2)")).Select Replace:=False
                                    Sheets(Array("dim (3)", "dim (4)", "dim (5)", "dim (6)", "dim (7)", "dim (8)")).Select Replace:=False
                                    Range("A2:S200").Select
                                    With Selection.Interior
                                        .Pattern = xlNone
                                        .TintAndShade = 0
                                        .PatternTintAndShade = 0
                                    End With
                                    Sheets(1).Select
                                    Windows("SIMULATEUR ROULEMENT V1.xlsm").Activate
                                End Sub

                                cdlt
                                0
                                • 1
                                • 2