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 :

[XL-17] Automatiser la prise de congés/RTT avec VBA excel


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1
    Par défaut [XL-17] Automatiser la prise de congés/RTT avec VBA excel
    Bonjour à tous,

    je travaille actuellement sur une méthode pour ceux qui recensent (au sein de ma petite entreprise) les prises de congés, RTT et jours de récup.
    Ce n'est pas du tout mon boulot mais je me suis lancé là-dedans avec mes petites connaissances en code.

    Pour l'instant j'en suis seulement à l'étape de prototype, mais l'idée finale est que les salariés se servent d'un Microsoft form pour faire leur demande de congé, que je récupère ensuite le fichier excel associé pour automatiquement transférer ces données sur une fiche navette déjà créée regroupant toutes ces infos pour l'ensemble des salariés.

    J'ai commencé à réfléchir à un algorithme qui automatise le remplissage d'une fiche navette en venant colorier en vert les jours demandés, à partir d'un formulaire créé sur un fichier excel.

    je vous montre ce que j'ai en entrée sur le formulaire :
    Nom : Capture d’écran 2018-11-29 à 10.46.54.png
Affichages : 4449
Taille : 34,8 Ko

    et sur une 2ème feuille j'ai la fiche navette, ici que j'ai recréé mais la première ligne donne l'exemple de la façon dont sont stockées les données :
    Nom : Capture d’écran 2018-11-29 à 10.51.28.png
Affichages : 1550
Taille : 54,0 Ko

    ET voici le code :
    Pour vous aider à comprendre, ma fonction colonnedebut permet de savoir en fonction de la date du mois demandé, de se placer dans la bonne colonne pour colorier. Après j'ai fait une boucle "if" à chaque fois pour savoir dans quelle ligne se placer en fonction du type de congé.
    l'idée ensuite c'est qu'une fois que la personne a rempli ses informations (je n'ai pas encore géré les cas où ces champs sont vides ...), quand il clique sur valider, cela cherche dans ma fiche navette le nom correspondant, ensuite que ça colorie en vert en fonction des dates demandées (avec gestion des années bissextiles et des jours ouvrés).
    Si il n'existe pas de champ à ce nom, cela va en créer un (mais je sais que cette fiche navette doit être déjà préparée avec recevoir ces données, donc les cases doivent être fusionnées, etc).

    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
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
     
    Function bisextile(madate As Date) As Boolean
    bisextile = Day(DateSerial(Year(madate), 3, 0)) = 29
    End Function
     
     
    Function colonnedebut(mois As Integer)
     
     
    If bisextile(Year(Date)) Then
     
        If mois = 1 Then
            colonnedebut = 5
        End If
        If mois = 2 Then
            colonnedebut = 36
        End If
        If mois = 3 Then
            colonnedebut = 65
        End If
        If mois = 4 Then
            colonnedebut = 96
        End If
        If mois = 5 Then
            colonnedebut = 126
        End If
        If mois = 6 Then
            colonnedebut = 157
        End If
        If mois = 7 Then
            colonnedebut = 187
        End If
        If mois = 8 Then
            colonnedebut = 218
        End If
        If mois = 9 Then
            colonnedebut = 249
        End If
        If mois = 10 Then
            colonnedebut = 279
        End If
        If mois = 11 Then
            colonnedebut = 310
        End If
        If mois = 12 Then
            colonnedebut = 340
        End If
    Else
        If mois = 1 Then
            colonnedebut = 5
        End If
        If mois = 2 Then
            colonnedebut = 36
        End If
        If mois = 3 Then
            colonnedebut = 64
        End If
        If mois = 4 Then
            colonnedebut = 95
        End If
        If mois = 5 Then
            colonnedebut = 125
        End If
        If mois = 6 Then
            colonnedebut = 156
        End If
        If mois = 7 Then
            colonnedebut = 186
        End If
        If mois = 8 Then
            colonnedebut = 217
        End If
        If mois = 9 Then
            colonnedebut = 248
        End If
        If mois = 10 Then
            colonnedebut = 278
        End If
        If mois = 11 Then
            colonnedebut = 309
        End If
        If mois = 12 Then
            colonnedebut = 339
        End If
    End If
     
    End Function
     
    Function nbjoursouvres(datedebut, datefin)
     
    Dim i As Long
        For i = datedebut To datefin
            If Weekday(CDate(i)) <> 1 And Weekday(CDate(i)) <> 7 Then _
                nbjoursouvres = nbjoursouvres + 1
        Next
     
    End Function
     
     
     
     
    Sub valider()
     
    Dim nom As String
    Dim prenom As String
    Dim typeconge As String
    Dim tampon As Integer
    Dim datedebut As Date
    Dim datefin As Date
    Dim nbjourouvre As Integer
     
    'Worksheets("saisie").Activate
    'Worksheets("2018").Activate
     
    'on récupère les différentes valeurs pour nom, prénom, date début, date fin
    nom = Worksheets("saisie").Range("C3").Value
     
    prenom = Worksheets("saisie").Range("E3").Value
    datedebut = Worksheets("saisie").Range("C7").Value
    datefin = Worksheets("saisie").Range("E7").Value
     
    'on recupere la valeur de retour du menu deroulant
    tampon = Worksheets("saisie").Range("I11").Value
     
    If tampon = 1 Then
    typeconge = "CP"
    End If
     
    If tampon = 2 Then
    typeconge = "RTT"
    End If
     
    If tampon = 3 Then
    typeconge = "Recup"
    End If
     
    'on initialise ligne et colonne pour que ça regarde la premiere ligne du tableau avec un nom
    Dim ligne As Integer
    ligne = 2
    Dim colonne As Integer
    colonne = 1
     
    Dim dernierecase As String
    Dim trouve As Boolean
    trouve = False
     
    Dim moisselect As Integer
    Dim debutcolor As Date
    Dim fincolor As Date
     
     
    'on initialise dernierecase avec la premiere case nom du tableau
    dernierecase = Worksheets("2018").Cells(ligne, colonne).Value
     
    Do Until trouve = False
     
        While (dernierecase <> "") 'tant que la case sélectionnée n'est pas vide on rentre dans la boucle
     
            If dernierecase = nom Then 'si la case nom du tableau correspond au nom entrée alors on entre dans la boucle
     
                If typeconge = "CP" Then 'si la personne a sélectionné CP il faut ecrire dans la premiere ligne du tableau correspondant à son nom
                    'on ne change pas la valeur de ligne
                    colonne = colonnedebut(Month(datedebut))   'sélectionne la colonne a laquelle on va commencer à colorier
                    For colonne = colonne + Day(datedebut) To colonne + Day(datedebut) + nbjourouvre
                        Worksheets("2018").Cells(ligne, colonne).Interior.ColorIndex = 4 'on colorie la cellule en vert
                    Next colonne
                End If
     
                If typeconge = "RTT" Then 'si la personne a sélectionné RTT il faut ecrire dans la premiere ligne du tableau correspondant à son nom
                    ligne = ligne + 1 'on ajoute 1 pour etre dans la bonne ligne
                    colonne = colonnedebut(Month(datedebut))   'sélectionne la colonne a laquelle on va commencer à colorier
                    For colonne = colonne + Day(datedebut) To colonne + Day(datedebut) + nbjourouvre
                        Worksheets("2018").Cells(ligne, colonne).Interior.ColorIndex = 4 'on colorie la cellule en vert
                    Next colonne
     
                End If
     
                If typeconge = "Recup" Then 'si la personne a sélectionné RTT il faut ecrire dans la premiere ligne du tableau correspondant à son nom
                    ligne = ligne + 2 'on ajoute deux pour etre dans la bonne ligne
                    colonne = colonnedebut(Month(datedebut))   'sélectionne la colonne a laquelle on va commencer à colorier
                    For colonne = colonne + Day(datedebut) To colonne + Day(datedebut) + nbjourouvre
                        Worksheets("2018").Cells(ligne, colonne).Interior.ColorIndex = 4 'on colorie la cellule en vert
                    Next colonne
                End If
     
                    trouve = True 'on dit a la variable trouve qu'il a trouvé le nom
     
            Else
                ligne = ligne + 3 'on ajoute 3 car le nom est une cellule fusionnée contenant 3 lignes
                dernierecase = Worksheets("2018").Cells(ligne, colonne).Value 'on attribue a dernierecase le nom de la ligne suivante
           End If
        Wend
     
     
     
    Loop
     
    If trouve = False Then 'si on a pas trouvé le nom dans le tableau alors on créer une nouvelle ligne
     
        Worksheets("2018").Cells(ligne, colonne).Value = nom
        Worksheets("2018").Cells(ligne, colonne + 1).Value = prenom
                If typeconge = "CP" Then 'si la personne a sélectionné CP il faut ecrire dans la premiere ligne du tableau correspondant à son nom
                    'on ne change pas la valeur de ligne
                    colonne = colonnedebut(Month(datedebut))   'sélectionne la colonne a laquelle on va commencer à colorier
                    For colonne = colonne + Day(datedebut) To colonne + Day(datedebut) + nbjourouvre
                        Worksheets("2018").Cells(ligne, colonne).Interior.ColorIndex = 4 'on colorie la cellule en vert
                    Next colonne
                End If
     
                If typeconge = "RTT" Then 'si la personne a sélectionné RTT il faut ecrire dans la premiere ligne du tableau correspondant à son nom
                    ligne = ligne + 1 'on ajoute 1 pour etre dans la bonne ligne
                    colonne = colonnedebut(Month(datedebut))   'sélectionne la colonne a laquelle on va commencer à colorier
                    For colonne = colonne + Day(datedebut) To colonne + Day(datedebut) + nbjourouvre
                        Worksheets("2018").Cells(ligne, colonne).Interior.ColorIndex = 4 'on colorie la cellule en vert
                    Next colonne
     
                End If
     
                If typeconge = "Recup" Then 'si la personne a sélectionné RTT il faut ecrire dans la premiere ligne du tableau correspondant à son nom
                    ligne = ligne + 2 'on ajoute deux pour etre dans la bonne ligne
                    colonne = colonnedebut(Month(datedebut))   'sélectionne la colonne a laquelle on va commencer à colorier
                    For colonne = colonne + Day(datedebut) To colonne + Day(datedebut) + nbjourouvre
                        Worksheets("2018").Cells(ligne, colonne).Interior.ColorIndex = 4 'on colorie la cellule en vert
                    Next colonne
                End If
     
    End If
     
     
     
     
     
    End Sub
    Voilà, mon code ne plante pas visiblement mais lorsque que je fais un test, cela ne colorie rien en vert. Donc il doit y avoir une erreur quelque part ... Je suis conscient qu'il doit pas être très optimisé, mais j'ai fait avec mon raisonnement et mes connaissances .. Si quelqu'un peut m'aider, je suis preneur !

    Si vous avez besoin de plus d'infos, n'hésitez pas à demander.

    Merci beaucoup,

    Baptiste L.

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Le seul conseil judicieux que je peux te donner c'est de ne pas t'engager dans cette voie.
    Il existe sur le marché des logiciels qui font ça très bien pour un coût raisonnable.
    La publicité étant interdite sur ce forum, je ne peux pas te donner de titre mais tu n'auras aucun mal à en trouver en demandant à des amis ou des fournisseurs ce qu'ils utilisent dans leurs entreprises (au pire, un coup de moteur de recherche).

    Crois-moi, tu y gagnera sur tous les plans : temps, argent et fiabilité.

    Surtout en fiabilité. Parce que si un bug dans ton code entraine une perte de fiabilité dans ton application et que tu ne peux plus être sûr à 100% du nombre de jours de congé restant à chacun, les employés tireront à la courte paille pour savoir à quelle sauce te manger.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Comptable
    Inscrit en
    Novembre 2018
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Comptable

    Informations forums :
    Inscription : Novembre 2018
    Messages : 100
    Par défaut
    Bonjour tistou10 et Menhir,

    Je vais rejoindre l'avis de Menhir sur la fiabilité d'un tel logiciel et le sujet sensible des congés.
    Bref, dans les petites entreprises c'est souvent le système D et ton idée est tout à fait louable

    Pour ta sécurité, il faut que tu prévois des export réguliers (au cas où sa crache tu auras de la traçabilité) et des fiches de synthèse individualisés pour valider auprès des personnes concernés leur droit en congés. En cas de problème tu auras une base de validation.

    J'ai regarder ton code et fait un pas à pas pour comprendre la logique et j'ai plusieurs recommandations

    1- Pas de fusion de cellule car même si tu met un nom existant il ne le trouve pas. Une solution : une ligne par personnel et trois type de couleur en fonction du type de congés sachant que l'on ne peut pas prendre pour un même jour deux types de congés différents.

    2 - Utilise plus la structure ElseIf tu optimisera ton code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     If mois = 1 Then
            colonnedebut = 5
        End If
        If mois = 2 Then
            colonnedebut = 36
        End If
    A remplacer par : L'avantage c'est dès qu'il a une correspondance il ne teste pas les if suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if mois = 1 Then
           colonnedebut = 5
        ElseIf mois = 2 Then
            colonnedebut = 36
        End If
    3 - Le programme colorie seulement la date de début. Le problème vient de ta boucle For To
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For colonne = colonne + Day(datedebut) To colonne + Day(datedebut) + nbjourouvre
    Je penses que tu veux faire plutôt cela : (Je n'ai pas testé mais pas convaincu que tu gère correctement les jours non travailllé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For colonne = colonne + Day(datedebut) To colonne + Day(datefin) + nbjourouvre(datedebut,datefin)
    Faire attention car dans certaines entreprises ont utilise une base 30 au lieu d'une base 25. Dans le cas d'une base 30 le samedi est considéré comme travaillé.

    4 - Je te conseille dans un premier temps de déclarer tous tes processus/fonctions (Function colonnedebut,...) sans écrire les codes et de décrire les étapes avec les liens avec les autres processus.

    5 - Réaliser à vide les feuilles d'entrée (saisie), et tes feuilles de sortie (2018,...) . Cela t'évitera de te rendre compte que tu as oubli un paramètre à la fin de programme et devoir modifier une partie important par la suite.

    A+

Discussions similaires

  1. envoi mail outlook avec vba excel
    Par momolamoto dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/09/2010, 10h45
  2. Contrôle d'un document Word avec VBA Excel
    Par wsl1912 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 03/01/2008, 10h06
  3. manipulation des fichiers et dossiers avec VBA excel
    Par GBAGO dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 29/07/2007, 23h30
  4. lien internet avec VBA EXCEL
    Par casefayere dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/07/2007, 10h40
  5. Images avec VBA Excel
    Par dorschner dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/09/2006, 23h28

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