Vérif avant copier / coller
Bonjour à tous,
J'ai besoin d'un petit coup de main pour travailler un fichier.
Je souhaite mettre en place une macro qui doit :
- copier une ligne d'un onglet ("INDEPENDANTS") vers une deuxième onglet ("ARCHIVE") si la cellule en colonne V contient une info, puis masquer la ligne copiée dans l'onglet d'origine.
Aujourd'hui j'ai saisi le code ci-dessous :
Private Sub Workbook_Open()
With Worksheets("INDEPENDANTS")
For Each C In .Range("V4:V" & .Range("V" & Rows.Count).End(xlUp).Row)
If C <> "" And C.Rows.Hidden = False Then
LigneAjout = Worksheets("ARCHIVE").Range("A" & Rows.Count).End(xlUp).Offset(1).Row
C.EntireRow.Copy
C.EntireRow.Hidden = True
Worksheets("ARCHIVE").Range("A" & LigneAjout).PasteSpecial Paste:=xlValues
Application.CutCopyMode = False
End If
Next C
End With
End Sub
Actuellement ma macro fonctionne donc ainsi (en théorie) :
- elle se déclenche à l'ouverture du fichier
Je préférerai qu'elle se déclenche après la saisie de la valeur en colonne V (ou au changement de cellule)
- Elle vérifie pour toutes les lignes, à partir de la 4ème, si la colonne V contient une valeur
- Si oui, elle copie la ligne et la masque, puis colle la ligne à la suite dans le deuxième onglet
- Si la ligne est déjà masquée, elle ne doit pas la copier à nouveau
Mon problème est que si j'ouvre plusieurs fois mon fichier sans faire de modif, il finit par copier et masquer des lignes au dessus de la ligne 4 ; je ne comprends pas à quel moment dans le code, cette action s'effectue.
Du coup si vous pouviez m'aider à:
- changer l'élément déclencheur de la macro (la saisie d'une donnée, ou le changement de cellule après la saisie)
- vérifier si une ligne a déjà été copiée pour éviter de la copier en double (exemple : en vérifiant si les infos en colonne F existent déjà dans le deuxième onglet).
Je vous remercie par avance pour vos lumières et espère que vous pourrez m'aider.
Nota : si mon problème n'est pas clair, n'hésitez pas à demander des précisions
Bonjour,
à tester,
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
'vérifier si les infos en colonne F existent déjà dans le deuxième onglet
If Not IsError(Application.Match(Cells(Target.Row, "F"), Sheets("ARCHIVE").Range("F:F"), 0)) Then Exit Sub
Set isect = Application.Intersect(Target, Range("V:V"))
If Not isect Is Nothing Then
For Each C In .Range("V4:V" & .Range("V" & Rows.Count).End(xlUp).Row)
If C <> "" And C.Rows.Hidden = False Then
LigneAjout = Worksheets("ARCHIVE").Range("A" & Rows.Count).End(xlUp).Offset(1).Row
C.EntireRow.Copy
C.EntireRow.Hidden = True
Worksheets("ARCHIVE").Range("A" & LigneAjout).PasteSpecial Paste:=xlValues
Application.CutCopyMode = False
End If
Next C
End With
End If
Application.EnableEvents = True
End Sub