Boucle VBA pour réaliser un saut de ligne quand la condition est atteinte

Bonjour à toutes et à tous,

J'essaie de réaliser via VBA un planning congé du personnel (aucune donnée n'est réelle) dans la feuille "Calendrier de personnel" mais je n'arrive pas à réaliser cela car dans ma feuille ayant les informations des congés "planning congés" on retrouve une seule ligne pour la totalité des congés (ex: du 15 au 22 et non 15, 16,17...).

Pour cela j'ai tenté de réaliser ce code afin de réaliser cette décomposition des congés dans mon planning afin de voir chaque jours où le personnel est en vacances.

Sub planning()

    Dim debut, i As Variant

    i = 2

    debut = Cells(i, 2) 'Debut congés

    Do While debut <= Cells(i, 3) 'Tant que la variable debut est <= à la date de fin des congés, la boucle est répétée
        debut = debut + 1 'Le numéro est augmenté de 1 à chaque boucle
    Loop

    Do While debut <= Cells(i, 3)
     i = i + 1
    Loop

End Sub

Le but de cette démarche est directement de faire une correspondance après entre les dates de débuts et de fin entre les 2 feuilles et ainsi affiché par exemple CP dans la colonne D de "Calendrier Personnel" si la personne a posé un congé le 1er janvier par exemple et jusqu'à sa date de fin.

En espérant avoir été le plus clair possible dans ma demande.

Merci par avance.

Bonjour,

A tester en modifiant depuis l'onglet "Calendrier personnel" l'année ou l'ID personnel

Il a quelques trucs dans ce planning sur lesquels je m'interroge.

Manifestement, il s'agit d'un outil fait pour l'année qui vient. On le vide à la fin de l'année 2022 et on le remplit pour 2023 par exemple. Cela signifie que le calendrier des congés est établi avant que l'année ne commence. Soit le calendrier est arrêté et on entre les congés des personnels, soit on a pas tout et on complètera au fur et à mesure des choix.

Si cette analyse est correcte, pourquoi avoir mis une liste déroulante avec les années dans la feuille "Calendrier personnel" ? Dans l'outil tel qu'il est actuellement, ne pourrait-on pas mettre carrément 2023 à la place de cette liste pour préparer le calendrier de l'année prochaine ?

Bonjour,

Histoire de s'amuser un peu et de ne pas fournir une fichier identique à celui proposé par M12 que je salue, voici une autre proposition,

Lorsque qu'on change d'année ou d'ID, TOUS les iD sont rapatriés dans le calendrier en 2ème colonne en face chaque date, et le nombre de CP à cette date en 1ère colonne, et seuls les emplacements où à été détecté l' l'ID sélectionné en H2 est sur fond vert. Ceci permet d'avoir une vue d'ensemble des jours plus ou moins chargés en congés et de voir en détail un Id particulier.

Cdlt

Bonjour tout le monde,

Une autre proposition, un peu au pif en l'absence de réponse (avec les années bissextiles).

Bonjour à tous,

@M12 Super calendrier, simple et efficace répondant exactement à mes attentes. Merci beaucoup d'avoir pris le temps de vous pencher sur ma demande.

@Arturo83 Vraiment pertinent votre système pour analyser les périodes où le personnel pose leurs congés, effectivement cela permet d'analyser les tendances et ainsi voir les périodes récurrentes de pose de congé. J'ai quelques petites questions concernant votre code

Sub Planning() 

 If Left(f2.Cells(l, c + 2), 1) = "," Then f2.Cells(l, c + 2) = Right(f2.Cells(l, c + 2), Len(f2.Cells(l, c + 2)) - 1)
Cpt = UBound(Split(f2.Cells(l, c + 2), ",", , 1)) + 1  
--> en langage naturel que réalise ces 2 lignes de codes?

Sub Calendrier()
Range(f2.Cells(6, i), f2.Cells(28 + 5, i)).FormulaR1C1 = "=DATE(R2C10,MONTH(1&R5C),ROW()-5)" 
f2.Cells(29 + 5, i).FormulaR1C1 = "=IF(MOD(R[-32]C[5],4)=0,DATE(R2C10,2,ROW()-5),"""")"
--> avec le mode R1C1 j'ai du mal à savoir comment en formula local la formule serait, notamment sur le "-5" j'ai des problèmes de compréhension

Merci par avance et merci également pour votre aide précedente.

@Optimix Vraiment merci, l'utilisation de l'user form rend l'utilisation du planning beaucoup plus sympa que sans.

Merci.

En conclusion, je pense faire une combinaison de vos 3 codes pour mon calendrier du personnel.

Encore merci pour votre aide.

Tom-tom91

PS: comment faire pour clôturer le sujet si je trouve vos 3 solutions pertinentes?

in, c'est fait

Bonsoir,

If Left(f2.Cells(l, c + 2), 1) = "," Then f2.Cells(l, c + 2) = Right(f2.Cells(l, c + 2), Len(f2.Cells(l, c + 2)) - 1)
Cpt = UBound(Split(f2.Cells(l, c + 2), ",", , 1)) + 1

Concernant la première ligne: Pour récupérer tous les ID à la suite des uns des autres, je mets une virgule comme séparateur entre chaque ID, mais il y en a une au début de la liste ainsi constituée, elle est donc inutile donc, on supprime le premier caractère de gauche de cette liste.

Pour la 2ème ligne, on compte (Cpt) le nombre de virgules comprises dans cette liste, ce qui nous donne le nombre de CP pour la journée, c'est ce nombre qu'on affiche dans la colonne de gauche.

******************************************************************************************************

Sub Calendrier()

1ère ligne de code donne en équivalent formulalocal: =DATE($J$2;MOIS(1&B$5);LIGNE()-5) pour le 1er janvier .

B5 donne le mois en lettre, en précisant 1&B5, cela donne le N° du mois.

2ème ligne de code donne en équivalent formulalocal: =SI(MOD(J2;4)=0;DATE($J$2;2;LIGNE()-5);"") permet de savoir si l'année traitée est bissextile (si le reste de la division de l'année par4 =0, alors c'est une année bissextile )

LIGNE()-5) signifie qu'on prend la ligne de la date qu'on traite et à laquelle on retranche 5 (puisque le tableau commence à la ligne 6), donc par exemple, pour rentrer la date du 1er janvier, on utilise la fonction date(Année, Mois, Jour) L'année on la connait (en J2), le mois sur la ligne 5, reste le jour à trouver; avec ligne()-5 on aura ligne 6-5 =1 donc ce sera le 1er du mois, pour la date du 2, ce sera toujours ligne()-5 soit ligne 7-5=2 et ainsi de suite.

***********************************************************************************************************

PS: comment faire pour clôturer le sujet si je trouve vos 3 solutions pertinentes? Sélectionnez l'une des réponses et cherchez "Résolu".

Cdlt

Merci pour ce complément d'information @Arturo83.

Par contre, après quelque test j'ai constaté que quand on passe de l'année 2018 à 2020, le 29 février s'affiche mais en revanche quand je passe de 2020 à 2018 le 29 reste afficher. Pourquoi ne s'efface t-il pas?

Cdt

Bonjour,

je passe de 2020 à 2018 le 29 reste afficher. Pourquoi ne s'efface t-il pas?

Tout simplement parce que j'ai oublié d'ajouter la ligne suivante:

If NbJours = 28 Then Range("E34").Value = ""

Le code en entier:

Sub Calendrier()
    Application.ScreenUpdating = False
    Set f2 = Sheets("Calendrier personnel")
    Effacer_Planning
    For i = 2 To 38 Step 3
        Select Case i
            Case 2, 8, 14, 20, 23, 29, 35, 38
                NbJours = 31
            Case 11, 17, 26, 32
                NbJours = 30
            Case 5
                If Range("J2").Value Mod 4 = 0 Then
                    NbJours = 29
                Else
                    NbJours = 28
                End If
        End Select
        If NbJours = 29 Then
            Range(f2.Cells(6, i), f2.Cells(28 + 5, i)).FormulaR1C1 = "=DATE(R2C10,MONTH(1&R5C),ROW()-5)"
            f2.Cells(29 + 5, i).FormulaR1C1 = "=IF(MOD(R[-32]C[5],4)=0,DATE(R2C10,2,ROW()-5),"""")"
        Else
            If i = 38 Then
                Range(f2.Cells(6, i), f2.Cells(NbJours + 5, i)).FormulaR1C1 = "=DATE(R2C10 +1,MONTH(1&R5C),ROW()-5)"
            Else
                Range(f2.Cells(6, i), f2.Cells(NbJours + 5, i)).FormulaR1C1 = "=DATE(R2C10,MONTH(1&R5C),ROW()-5)"
                If NbJours = 28 Then Range("E34").Value = ""
            End If
        End If
    Next i
    f2.Range("B6:AL36").Value = f2.Range("B6:AL36").Value
End Sub
Cdlt

Edit:

Version améliorée, la zone de comptage des nombres de CP sont soumises à une MFC appliquant les couleurs allant du jaune à Orangé vif.

Pour faire un calendrier perpétuel, il est plus simple de ne pas utiliser de matrice : 4 formules suffisent :

1er Janvier (B6) : =DATE(J2;1;1)

2 janvier : (B7) : =B6 + 1 (à recopier vers le bas)

29 février (E34) : =SI(MOD(J2;4)=0;E33+1;"") ' On n'a jamais à effacer

1er mars (H6) : =SI(MOD(J2;4)=0;E34+1;E33+1)

Le premier jour des mois suivants on incrémente le dernier jour du mois précédent.

Bonjour Arturo83 et Optimix,

Merci Arturo pour la modification du fichier. Effectivement j'aurais pu rajouter cette ligne de code moi-même si j'y avais pensé.

Merci Optimix dans un autre de mes onglets j'avais également un autre calendrier avec l'utilisation de matrice. Par conséquent , j'ai modifié les formules.

Encore merci pour tout et bonne fin de journée.

Cdt

Rechercher des sujets similaires à "boucle vba realiser saut ligne quand condition atteinte"