Macro copiage d'informations avec condition

Fermé
wallhqck Messages postés 37 Date d'inscription vendredi 3 mai 2013 Statut Membre Dernière intervention 11 février 2017 - 23 juil. 2014 à 23:31
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 - 25 juil. 2014 à 14:14
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
A voir également:

4 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
24 juil. 2014 à 06:33
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
awesome33 Messages postés 32 Date d'inscription samedi 7 décembre 2013 Statut Membre Dernière intervention 26 juillet 2014 68
24 juil. 2014 à 00:05
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
wallhqck Messages postés 37 Date d'inscription vendredi 3 mai 2013 Statut Membre Dernière intervention 11 février 2017
25 juil. 2014 à 11:21
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
25 juil. 2014 à 14:14
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