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 SubBonjour 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 SubLe 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
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