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
J'ai mis cette fonction en place à défaut de savoir comment vérifier dans l'onglet si la ligne était déjà existante

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
Rechercher des sujets similaires à "verif copier coller"