Macro copiage d'informations avec condition

wallhqck Messages postés 37 Statut Membre -  
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour à tous,

J'ai un problème concernant une macro que j'essaie de mettre en place (et oui encore...), voici ce que je cherche à faire :

J'ai une feuille de données (Feuil1)
Et une feuille de base de données (Feuil2)

Dans la feuille de données (Feuil1) :

Si la valeur de la colonne « L » est égale à « PB » alors copier uniquement la valeur de la colonne B qui correspond à la ligne ou est identifié le PB et non la ligne entière (contrairement à mon code ci-dessous)

Exemple : Si L6 = PB alors je veux copier uniquement la valeur de B6 et non toute la ligne

Dans la feuille de base de données :

Je veux venir coller dans cette autre feuille (Feuil2) la valeur de la colonne B6 (de la feuil1) à la suite des valeurs déjà existantes dans cette feuille, sans remplacer les anciennes (déjà fait dans le code normalement)

Pour la recherche des "PB" dans la feuille de données, le range est toujours le même, de L6 à L510 (en fait je viens coller un reporting mensuel, et tous les nouveaux codes qui ne sont pas dans la base de données apparaissent en "PB", et je veux qu'ils apparaissent automatiquement dans ma feuille de base de données). Je ne sais pas si ça a une importance dans le code.

En gros ma macro ci-dessous fonctionne mais je n'arrive pas à cibler uniquement la valeur à copier ni a cibler la zone de collage

Pouvez-vous m'aider ?

Merci d'avance,

Voici mon code :

Range("A65536").End(xlUp).Offset(1, 0).Select

For L = 6 To Feuil1.Range("A" & Rows.Count).End(xlUp).Row

If Feuil1.Range("L" & L).Value = "PB" Then

Feuil1.Rows(L).Copy

Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues

Lig = Lig + 1

End If

Next

Application.CutCopyMode = False

Application.ScreenUpdating = False

4 réponses

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour

    apparemment on restitue dans la colonne A ?
    proposition: on ne boucle que sur le nombre de "PB" dans la colonne L au lieu de parcourir la colonne ligne par ligne

    il est inutile d'écrire Application.ScreenUpdating = False à la fin de la macro puisque tu rends la main au système

    Option Explicit
    '-------
    Sub copier_si_pb()
    Dim Ligvid As Integer, Nbre As Integer, Lig As Integer, Cptr As Integer

    Application.ScreenUpdating = False
    Ligvid = Sheets(2).Columns("A").Find("", Range("A1")).Row
    With Sheets(1)
    Nbre = Application.CountIf(.Columns("L"), "PB")
    Lig = 5
    For Cptr = 1 To Nbre
    Lig = .Columns("L").Find("PB", .Cells(Lig, "L"), xlValues).Row
    Sheets(2).Cells(Ligvid, "A") = .Cells(Lig, "B")
    Ligvid = Ligvid + 1
    Next
    End With
    Sheets(2).Activate
    End Sub

    1
  2. awesome33 Messages postés 37 Statut Membre 68
     
    Salut ,
    J'ai pas compris ton code .
    Essaye de l'améliorer avec ce que je vais te donner .
    Pour parcourir une de L6 a L510:
    Sub For_Each_Next_Plage() 
    Dim FL1 As Worksheet, Cell As Range, Plage As Range
    Dim Var1

    Set FL1 = Worksheets("Feuil1")
    With FL1
    'Détermination de la plage de cellules à lire
    'Peut s'écrire en utilisant l'objet range de la plage
    'For Each Cell In .Range("L6:L510")

    'ou en utilisant l'objet Plage (range) de la plage
    Set Plage = .Range("L6:L510")
    For Each Cell In Plage

    'Valeur de la cellule lue
    Var1 = Cell.Value
    if Var1= PB then
    'Instruction pour copier
    end if
    Next
    End With
    Set FL1 = NoThing
    Set Plage = NoThing
    End Sub

    Pour ton autre problème Comment ? tu dis "ni a cibler la zone de collage "? sa copie avant ou après ?
    0
  3. wallhqck Messages postés 37 Statut Membre
     
    Merci pour vos réponses,

    J'ai principalement utilisé ton code Michel_m et j'ai quelques questions :

    Peux-tu m'expliquer clairement ce que fait la macro pour ma culture personnel car je n'y comprends pas grand chose. Voici ou j'en suis arrivé (la macro marche mais pas comme je veux)

    Dim Ligvid As Integer, Nbre As Integer, Lig As Integer, Cptr As Integer

    '?

    Application.ScreenUpdating = False

    '?

    Ligvid = Feuil2.Columns("B").Find(Range("B65536").End(xlUp).Offset(1, 0)).Row

    ' Commencer en dessous de la dernière ligne non vide de la colone B

    (C'est ici que ce situe mon problème, la macro commence le collage des valeurs à la ligne 1 de la colonne B car les lignes 1 à 3 sont vides. Ce que je veux c'est que les valeurs qui sont copiés viennent se coller à la suite des valeurs de la colonne B, donc en partant de la dernière cellule de la colonne B et en remontant jusqu'à temps qu'il trouve une cellule non vide

    With Feuil5

    ' Avec la Feuil5

    Nbre = Application.CountIf(.Columns("O"), "PB")

    ' Détermine le nombre de "PB" dans la colone "O"

    Lig = 1068

    ' A partir de la ligne 1068

    ' Est-ce possible de définir un range (Jusqu'a la ligne 1578 pour alléger la macro et augmenter la rapidité) car le fichier est énorme ????

    For Cptr = 1 To Nbre

    ' ?

    Lig = .Columns("O").Find("PB", .Cells(Lig, "O"), xlValues).Row

    ' Dans la colone O, il cherche la valeur "PB" sur la ligne ??

    Feuil2.Cells(Ligvid, "B") = .Cells(Lig, "B")

    ' Il copie la valeur de la ligne B et la cole dans la Feuille 2 dans la colone B ??

    Ligvid = Ligvid + 1

    'Il passe à la ligne en dessous et recommence la recherche ??

    Next

    End With

    Feuil2.Activate

    ' Feuille 2 activée ?

    Range("B65536").End(xlUp).Offset(1, 0).Select

    'Selectionne la ligne en dessous de la dernière ligne remplie de la colone B

    End Sub

    Voila si tu pouvais m'éclairer encore une fois :)

    Merci d'avance
    0
  4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour

    car le fichier est énorme ????
    très subjectif: nombre de lignes si oui de quel ordre: 1000, 10000, 50000 ,100000... ?
    pourquoi ne l'as tu pas écrit au départ?

    au besoin
    mettre un extrait( env 1000 lignes)du classeur et non un exemple bricolé à la va vite, sans données confidentielles en pièce jointe sur
    https://www.cjoint.com/
    puis copier l'adresse du lien et la coller dans le message de réponse

    0