Macro copier / coller sous condition

Bonjour à tous,

J'ai cherché ma solution dans différents forums mais je ne trouve pas alors je me permets de vous solliciter :-)

Je suis à la recherche d'une macro me permettant de copier coller des lignes de ma feuille 1 (alimentée de manière brute par une extraction depuis une liste sharepoint) vers ma feuille 2 seulement si ma colonne 3 contient "valeur A" et si la ligne n'est pas déjà présente dans ma feuille 2 (j'ai un numéro de ligne en colonne 1).

Je risque d'avoir un nombre important de données (environ 6000 lignes par an), il faudrait que la recherche soit simple afin qu'elle ne prenne pas trop de temps à s'exécuter.

Merci par avance pour votre aide précieuse!

Configuration: Windows / Edge 86.0.622.56

5 réponses

  1. Contributeur
    bonjour,
    tu n'as pas expliqué où tout cela devait arriver dans la feuille de destination.
    il est sans doute préférable que tu partages un fichier d'exemple.
    1. Bonjour,

      Effectivement! Désolée, je suis novice... ça se voit! :-)
      Dans ma feuille de destination, il faut que ça s'incrémente à la suite du tableau actuel soit première ligne vide

      Merci
      1. Contributeur
        il est sans doute préférable que tu partages un fichier d'exemple.
    2. Li'dée :
      - Onglet 1 : il s'agit de mon extraction brute sharepoint
      - Onglet 2 (qui sera propre à chaque site) récupère dans l'onglet 1 les lignes qui concernent son site et qui ne sont pas déjà présentes dans l'onglet.

      Dans l'exemple, il s'agit du site 1, il a fait sa mise à jour le 09/11/2020, et depuis, des nouvelles données ont été saisies dans le sharepoint qui sont maintenant dans l'onglet 1

      J'espère avoir été assez claire sur mon explication
      1. Contributeur
        pour pouvoir déterminer le site associé à l'onglet, il est nécessaire qu'il y ait déjà des données dans l'onglet.
        je cherche comment ganger du temps:
        serait-il possible d'utiliser une colonne de "extraction", pour indiquer que la ligne est déjà extraite? en fait, l'extraction de sharepoint recrée chaque fois la liste complète?
        les numéros de ligne sont toujours croissants dans tous les onglets?
        si une ligne de extraction est présente dans un des onglets, peut-on supposer que toutes les lignes précédentes ont déjà été traitées (pour tous les sites)?
      2. @yg_beserait-il possible d'utiliser une colonne de "extraction", pour indiquer que la ligne est déjà extraite? en fait, l'extraction de sharepoint recrée chaque fois la liste complète? => oui l'extraction sharepoint écrase tout à chaque fois

        les numéros de ligne sont toujours croissants dans tous les onglets? => les numéros correspondent à ceux de la colonne 1 de l'extraction

        si une ligne de extraction est présente dans un des onglets, peut-on supposer que toutes les lignes précédentes ont déjà été traitées (pour tous les sites)? => normalement oui, je vérifie
      3. @Nathalie.chassefaireVérification faite, le numéro de ligne est bien incrémenté à chaque nouvelle saisie.
        Donc si ligne n°x déjà intégrée dans l'onglet n°2, pas besoin de traiter les lignes d'avant
    3. Contributeur
      Bonjour,

      un essai:

      https://www.cjoint.com/c/JKsr4fpTy2Q
      1. Merci pour cet envoi.
        La macro m'insère donc les lignes n°0 et 2 (qui sont bien du site 1).
        Mais quid des autres lignes du site n°1?

        Je souhaiterais qu'à chaque mise à jour de l'onglet "extraction", il puisse m'intégrer dans l'onglet suivi des actions les lignes du site 1 qui n'y sont pas déjà.
      2. Contributeur
        @Nathalie.chassefaireJ'ai vu ces 2 lignes qui avaient en commun "Action Dangereuse"

        Donc voici le code pour tout le site 1:

        Option Explicit
        Sub For_X_to_Next_Ligne()
        Dim FL1 As Worksheet, NoCol As Integer
        Dim NoLig As Long, Var As Variant
        Dim FL2 As Worksheet
        Dim derligne As Long
        Dim obj As Object
            Set FL1 = Worksheets("Extraction") 'a adapter
              Set FL2 = Worksheets("Suivi actions") 'a adapter
            NoCol = 3 'lecture de la colonne C
            Application.ScreenUpdating = False
            For NoLig = 1 To Split(FL1.UsedRange.Address, "$")(4)
                Var = FL1.Cells(NoLig, NoCol)
                If Var = "Site 1" Then
                derligne = FL2.Range("A" & Rows.Count).End(xlUp).Row + 1
          Set obj = FL2.Columns("A").Find(FL1.Cells(NoLig, NoCol - 2), , , xlWhole)
        If Not obj Is Nothing Then
        MsgBox "La ligne " & obj.Rows & " existe déjà!", vbCritical, "Ajout de ligne" ' on peut supprimer le message
        Else
        FL1.Range("A" & NoLig & ":J" & NoLig).Copy _
            Destination:=FL2.Range("A" & derligne)
            End If
                End If
             Next
            Set FL1 = Nothing
             Application.ScreenUpdating = True
        End Sub
        
        


        Voilà

      3. @cs_Le PivertC'est exactement ça!
        Par contre, quand je bascule la macro dans le véritable fichier, ça ne fonctionne pas...
      4. Contributeur
        @Nathalie.chassefaireIl faut adapter la macro aux feuilles, c'est marqué dans les commentaires!

        Lire les commentaires pour comprendre la macro!
      5. @cs_Le PivertBon, au final ça fonctionne bien avec mon fichier!

        Génial. Merci.