Macro dupliquer ligne entiere selon condition

Bonjour à tous,

Tout d'abord je tiens à vous remercier tous pour vos partage, car grâce à vous tous j'ai pu apprendre pas mal de formules, j' viens de franchir le pas en m'inscrivant, et j'espère pouvoir aider aussi comme vous.

Par contre je suis un novice en MACRO, j'ai beau essayé de regarder des exemple ça reste compliqué pour le moment, mais je n’abandonne pas

Bon voilà j'ai un gros problème que je n'arrive pas à résoudre, j'imagine que c'est une macro qu'il faut utiliser:

j'aimerai dupliquer des lignes en fonction du critère "date fin de contrat",

ex : si j'ai une personne recruté le 01/01/2020 et date de fin au 31/03/2020, alors j'aimerais qu'il rajoute 2 lignes (chaque ligne = 1 mois)

1 ligne = Mois de janvier

2 ligne = Mois de février

3 ligne = Mois de mars

Ainsi de suite pour chaque matricule de salarié

Je vous joins le fichier (en noir la saisie obligatoire et en vert ce que j'aimerais que ça donne comme résultat)

Et si il y'a pas de solutions, ba n'hésiter pas a me le dire svp

Merci d'avance.

Bonjour Cassandra, bonjour le forum,

Essaie comme ça :

Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim LI As Integer 'déclare la variable LI (LIgne)
Dim DA As Date 'déclare la variable DA (DAte)
Dim LAA As Byte 'déclare la variable LAA (Lignes À Ajouter)

Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set O = Worksheets("Feuil4") 'définit l'onglet O
TV = O.Range("A3").CurrentRegion 'définit le tableau des valeurs TV
For I = UBound(TV, 1) To 2 Step -1 'boucle 1 : inversée de la dernière à la seconde ligne du tableau des valeurs TV
    'la ligne au-dessous parce que le tableau ne commence pas à la première ligne
    LI = I + 2 '<= à supprimer si le tableau commence en A1 au lieu de A3 et la remplacer LI par I dans le reste du code
    DA = DateSerial(Year(TV(I, 4)), Month(TV(I, 4)), Day(TV(I, 4))) 'définit la date DA
    LAA = Month(DA) 'définit le nombre de lignes à ajouter LAA (= mois de la date)
    For J = 1 To LAA - 1 'boucle 2 : de 1 à LAA moins 1
        O.Rows(LI).Copy 'copy la ligne LI (remplacer LI par I si le tableau commence à la ligne 1)
        'colle dans la ligne LI + J en décalant vers le bas (remplacer LI par I si le tableau commence à la ligne 1)
        O.Rows(LI + J).Insert xlShiftDown
        'écrit le mois dans la cellule de la colonne A (remplacer LI par I si le tableau commence à la ligne 1)
        O.Cells(LI + J, "A").Value = J + 1
    Next J 'prochaine valeur de la boucle 2
Next I 'prochaine ligne de la boucle 1
Application.CutCopyMode = False 'supprime le clignotement lié au [copier]
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
End Sub

Bonjour ThauThème,

tout d'abord merci pour ta réactivité

j'ai créer un bouton afin d'affecter ta macro elle fonctionne nikel mais le seul bémol c'est qu'elle me duplique les données déjà dupliquer par la macro

Je m'explique plus clairement :

Lorsque je clique sur le bouton (donc ta macro) elle me duplique les données exactement comme je souhaite

Mais lorsque je décide de rajouter un nouveau salarié en dessous, je re-clique sur le bouton il me duplique mes données comme souhaité sur le salarié que je viens de rajouter mais aussi ceux précédemment dupliquer

Selon toi est-ce qu'il est possible de ne pas dupliquer ceux déjà fait ?

Merci

Re,

Je sais pas si ça va te convenir... J'ai rajouté une colonne Fait à la fin et modifié le code :

Le code :

Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim LI As Integer 'déclare la variable LI (LIgne)
Dim DA As Date 'déclare la variable DA (DAte)
Dim LAA As Byte 'déclare la variable LAA (Lignes À Ajouter)

Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set O = Worksheets("Feuil4") 'définit l'onglet O
TV = O.Range("A3").CurrentRegion 'définit le tableau des valeurs TV
For I = UBound(TV, 1) To 2 Step -1 'boucle 1 : inversée de la dernière à la seconde ligne du tableau des valeurs TV
    If TV(I, 8) <> "X" Then 'condition : si la donnée ligne I colonne 8 de TV est différente de "X"
        'la ligne au-dessous parce que le tableau ne commence pas à la première ligne
        LI = I + 2 '<= à supprimer si le tableau commence en A1 au lieu de A3 et la remplacer LI par I dans le reste du code
        DA = DateSerial(Year(TV(I, 4)), Month(TV(I, 4)), Day(TV(I, 4))) 'définit la date DA
        LAA = Month(DA) 'définit le nombre de lignes à ajouter LAA (= mois de la date)
        O.Cells(LI, "H").Value = "X" 'écrit X dans la colonne H
        For J = 1 To LAA - 1 'boucle 2 : de 1 à LAA moins 1
            O.Rows(LI).Copy 'copy la ligne LI (remplacer LI par I si le tableau commence à la ligne 1)
            'colle dans la ligne LI + J en décalant vers le bas (remplacer LI par I si le tableau commence à la ligne 1)
            O.Rows(LI + J).Insert xlShiftDown
            'écrit le mois dans la cellule de la colonne A (remplacer LI par I si le tableau commence à la ligne 1)
            O.Cells(LI + J, "A").Value = J + 1
            O.Cells(LI + J, "H").Value = "X"
        Next J 'prochaine valeur de la boucle 2
    End If
Next I 'prochaine ligne de la boucle 1
Application.CutCopyMode = False 'supprime le clignotement lié au [copier]
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
End Sub

Le fichier :

Moi qui pensais que c'était impossible de sortir de ce gouffre

Honnêtement je ne sais pas quoi te dire hormis que tu viens de me trouver une solution a mon problème qui dur depuis 2 semaines

Tu es un GENIE ThauThème , je te remercie infiniment

MERCI MERCI MERCI 10000 Fois

PS : merci bcp pour tes phrases en vert dans tes formules, ça me permet un peu mieux de comprendre

Bonjour ThauThème,

Désolé de te sollicité encore sur le même fichier, mais vu t'es compétences sur VBA, j’espérais avoir une aide sur le même fichier stp, j'ai 3 questions :

1) Sur le fichier joins (le même fichier ou il y'a ta macro), je voudrais savoir si il est possible de corriger la macro, car celle-ci me duplique le nombre de lignes en fonction du nombre de mois dans "fin de contrat" :

Ex: si quelqu'un à un contrat du 01/02/2020 au 31/05/2020, la macro me crée 5 lignes (de janvier à mai) au lieu de 4 lignes (février à mai)

2) J'aimerai aussi savoir si il est possible de mettre en colonne A automatiquement le mois et année pour chaque ligne au lieu de mettre ma longue formule

3) Et une dernière question, est-il possible d'avoir un "ID salarié" qui se génére automatiquement (allant de 01 à 06) en tenant compte du matricule, libellé emploi et pays

EX :

Si il y'a un salarié au matricule "0003", sur le poste "financier" et en "France" => Résultat "01" (si la macro duplique la ligne ça reste inchangé car la même personne, donc toujours 01)

Mais si il y'a un autre salarié "0004", sur le même poste et même pays => résultat "02" (ainsi de suite jusqu'à max "06")

Enfin si il y'a un 3iem salarié "0005", sur le même poste mais en Espagne => Résultat reviens à "01" car pas le même périmètre

y'a t'il des solutions ?

Merci par avance.

Cassandra

Rechercher des sujets similaires à "macro dupliquer ligne entiere condition"