IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

macro vba pour générer une rotation en remplacant les absents par les réserves


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Femme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : Algérie

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2021
    Messages : 10
    Par défaut macro vba pour générer une rotation en remplacant les absents par les réserves
    bonjour, j'ai un problème avec le code vba suivant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    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

    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 en cas d'absence: RAA, RAC, RCM, RCSS ,RCEXP . et j'ai des interdictions à respecter lors du remplacement des absents par les réserves du tableau RESERVES comme suit : Vérifier les restrictions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    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 de destinations fatigantes et non fatigantes je passe au programme journalier du deuxième jour de réserve. si un préposé ou chauffeur de réserve à 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 destinations 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
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 335
    Par défaut
    Bonjour,
    Pour éventuellement pouvoir répondre à votre demande pourriez-vous donner un exemple de planning sur plusieurs semaines? Un début vous est donné en attaché.
    Bien cordialement.
    Fichiers attachés Fichiers attachés

  3. #3
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 335
    Par défaut
    ou cela ressemblerait à celui-ci?
    Fichiers attachés Fichiers attachés

  4. #4
    Membre averti
    Femme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : Algérie

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2021
    Messages : 10
    Par défaut
    Bonjour et merci pour votre réponse et aide. le fichier rotation et programme explique tout :
    j'ai une rotation de démarrage comme suit :
    - 20 binômes sont afféctés à 20 destinations.
    - 06 binômes sont mis en réserve.
    - une rotation s'exécute pendant 02 jours de suite et le 3 jour , on passe à une nouvelle rotation où chaque binôme passe à la destination suivante.
    le bouton Générer Rotation Journalière permet à chaque fois que j'exécute de générer la rotation suivante jusqu’à revenir à la première rotation et ça recommence de manière cyclique.
    le bouton Générer Programme Journalier Sans Réserves me fait juste une copie de la rotation journaliers sans prendre les lignes du tableau des réserves pour que l'utilisateur commence à introduire le statut de l’absence des livreurs (préposés) et des chauffeurs " AA ,CA ,CM ,CEXP ,CSS ,RGI, ST4 ,MAP "

    sur une rotation il y a toujours 06 réserves que l'on utilise pour remplacer les absents journaliers de la rotation. le remplacement se fait en respectant des conditions :
    * un livreur ou un chauffeur en réserve ne doit pas assurer la destination du jour précédent et celle de la rotation suivante c -a -d par exemple Reserve1 ne doit pas assuré Tebessa ou Constantine1 si leurs propriétaires sont absents mais Reserve1 livreur ou chauffeur peut assuré une autre destination dont le propriétaire est absent.

    * un livreur ou chauffeur si il remplace un absent dans le premier jour de réserve pour une destination dite fatigante, le deuxième jour de réserve il doit assurer une destination d'un absent qui est non fatigante.

    * avant de remplacer un absent par un réserve il faut aussi vérifier l'état de réserve il peut aussi être absent : "RAA ,RCM ,RCEXP, RMAP, RCSS " est donc on ne peut pas l'utiliser dans le replacement .

    * la liste des destinations fatigantes par ordre :
    Tebessa (fatigante pour les jours Mardi/jeudi sinon pour le reste des jours de la semaine elle est non fatigante)
    Biskra
    Souk Ahras (fatigante pour les jours Dimanche/Mardi sinon pour le reste des jours de la semaine elle est non fatigante)
    Batna1
    BBA
    Jijel
    Khenchela (fatigante pour les jours Mardi/Jeudi sinon pour le reste des jours de la semaine elle est non fatigante)
    Batna2
    El taref
    Annaba2.
    la liste des destination non fatigantes ou moins fatigantes est : Annaba1
    Setif1
    Guelma
    Mila
    Skikda1
    Skikda2
    Setif2
    Setif3
    OEB
    Constantine1 (fatigante pour les jours Leund/jeudi sinon pour le reste des jours de la semaine elle est non fatigante)
    - je veux que lorsque je clique sur le bouton Générer Programme journalier Premier Jour de réserve, la macro remplace les absents par les réserves en respectant les conditions précédentes et quand je clique sur le bouton Générer Rotation pour Le deuxième jour de réserve la macro alterne entre les destinations fatigantes et non fatigantes c- a-d si un réserve on lui à affecté une destination fatigante le premier jour de réserve alors le deuxième jour on lui affecte une qui est non fatigante et inversement pour chaque préposé ou chauffeur de réserve.

    merci bien pour toute aide

Discussions similaires

  1. Réponses: 0
    Dernier message: 01/10/2024, 11h14
  2. Réponses: 3
    Dernier message: 29/06/2020, 18h11
  3. [XL-2010] Macro VBA pour lancer une commande terminal (Ouvrir PostGresQL)
    Par EAbadie dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/03/2018, 16h20
  4. [XL-2013] Macro VBA pour supprimer une ligne entière
    Par Riahi's dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 22/12/2016, 13h57
  5. Réponses: 4
    Dernier message: 19/03/2009, 10h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo