Mise en forme d'une demande d'absence

Résolu
Bonjour,
Je souhaiterai avoir votre aide sur une mise en forme automatique selon le contenu des cellules. J’ai essayé de réaliser des formules mais je ne sais pas faire de macros en partant de 0, je sais seulement les lire et les adapter…
Il s’agit d’un fichier de gestion de congés que j’ai paramétré et je souhaite réaliser l’automatisation du remplissage du bordereau de demande d’absence.
Je vous joins le fichier pour illustrer mes explications.
Dans l’onglet « congé », je souhaiterai reprendre les éléments de la colonne E (en bleu) et les reprendre dans les cellules colorées en jaune et en vert comme j’ai fait mais de manière automatique c’est-à-dire avec des dates et les types de congés qui vont évoluer.
Voici les éléments que j’ai identifié pour compléter que la macro reprenne (je ne pense pas que de simples formules puissent le faire):
- Vide on ne prend pas;
- "le" on prend puis ligne retour ligne d'en dessous (cellules jaunes) ou cellule d’à côté (cellule vert)
- "du" alors recherche du "au" à la suite, concaténation puis retour à la ligne d'en dessous cellules jaunes) ou cellule d’à côté (cellule vert)
NB : les couleurs ne servent qu’à vous repérer, dans le fichier final mais cellules seront incolores.
Merci par avance pour votre aide
Cordialement

https://www.cjoint.com/c/HDmlY5Z06Vx

5 réponses

  1. Contributeur Ambassadeur
    bonsoir, je propose ceci:
    Sub demcg()
    Dim fl As Worksheet
    Dim ligbl As Long, ligjn As Long, derlig As Long
    Dim cour As String, acc As String
    
    Set fl = ThisWorkbook.Sheets("Congé")
    derlig = fl.UsedRange.Rows(fl.UsedRange.Rows.Count).Row
    ligjn = 15
    acc = ""
    For ligbl = 4 To derlig
        cour = fl.Cells(ligbl, 5)
        If cour <> "" Then
            If Left(cour, 1) <> " " Then
                If acc <> "" Then
                    fl.Cells(ligjn, 9) = acc
                    ligjn = ligjn + 1
                End If
                acc = cour
            Else
                acc = acc & cour
            End If
        End If
    Next ligbl
    If acc <> "" Then
        fl.Cells(ligjn, 9) = acc
    End If
    End Sub
    0
    1. Merci pour vos réponses ! je regarde cela et je vous tiens au courant
      0
      1. Je viens de tester les 2 réponses et elles fonctionnent. Je n'y serai jamais arrivé tout seul... merci encore.
        Maintenant il me resterait à faire de même mais en repérant chaque type de congés CA (et CA N-1) CT, RTT, RF et en mettant les dates côte à côte dans les cellules vertes. Pour cette mise en forme soit on décale dans la cellule de droite soit on met à la suite dans la même cellule.
        0
        1. Contributeur Ambassadeur
          suggestion:
          Sub demcg()
          Dim fl As Worksheet
          Dim ligbl As Long, derlig As Long
          Dim cour As String, acc As String
          
          Set fl = ThisWorkbook.Sheets("Congé")
          derlig = fl.UsedRange.Rows(fl.UsedRange.Rows.Count).Row
          ligjn = 15
          acc = ""
          For ligbl = 4 To derlig
              cour = fl.Cells(ligbl, 5)
              If cour <> "" Then
                  If Left(cour, 1) <> " " Then
                      If acc <> "" Then
                          Call svcg(fl, acc)
                          ligjn = ligjn + 1
                      End If
                      acc = cour
                  Else
                      acc = acc & cour
                  End If
              End If
          Next ligbl
          If acc <> "" Then
              Call svcg(fl, acc)
          End If
          End Sub
          Private Sub svcg(fl As Worksheet, conge As String)
          Dim tlig As Long
          Select Case Left(conge, 2)
              Case "CA"
                  tlig = 24
              Case "CT"
                  tlig = 32
              Case "RT"
                  tlig = 40
              Case "RF"
                  tlig = 49
              Case Else
                  tlig = 57
          End Select
          tcol = 10
          Do While Cells(tlig, tcol) <> ""
              tcol = tcol + 1
          Loop
          Cells(tlig, tcol) = conge
          End Sub
          0
      2. Un grand merci à vous, c'est parfait!!!
        Cdt
        0
        1. Contributeur Ambassadeur
          petites corrections:
          option explicit
          Sub demcg()
          Dim fl As Worksheet
          Dim ligbl As Long, derlig As Long
          Dim cour As String, acc As String
          
          Set fl = ThisWorkbook.Sheets("Congé")
          derlig = fl.UsedRange.Rows(fl.UsedRange.Rows.Count).Row
          acc = ""
          For ligbl = 4 To derlig
              cour = fl.Cells(ligbl, 5)
              If cour <> "" Then
                  If Left(cour, 1) <> " " Then
                      If acc <> "" Then
                          Call svcg(fl, acc)
                      End If
                      acc = cour
                  Else
                      acc = acc & cour
                  End If
              End If
          Next ligbl
          If acc <> "" Then
              Call svcg(fl, acc)
          End If
          End Sub
          Private Sub svcg(fl As Worksheet, conge As String)
          Dim tlig As Long, tcol As Long
          Select Case Left(conge, 2)
              Case "CA"
                  tlig = 24
              Case "CT"
                  tlig = 32
              Case "RT"
                  tlig = 40
              Case "RF"
                  tlig = 49
              Case Else
                  tlig = 57
          End Select
          tcol = 10
          Do While Cells(tlig, tcol) <> ""
              tcol = tcol + 1
          Loop
          Cells(tlig, tcol) = conge
          End Sub
          0