Macro copiage d'informations avec condition
wallhqck
Messages postés
37
Date d'inscription
Statut
Membre
Dernière intervention
-
michel_m Messages postés 16602 Date d'inscription Statut Contributeur Dernière intervention -
michel_m Messages postés 16602 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
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:
- Macro copiage d'informations avec condition
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Excel cellule couleur si condition texte - Guide
- Entrer les informations d'identification reseau - Guide
- Reconsidérer le traitement de vos informations à des fins publicitaires - Accueil - Réseaux sociaux
- Jitbit macro recorder - Télécharger - Confidentialité
4 réponses
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
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
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:
Pour ton autre problème Comment ? tu dis "ni a cibler la zone de collage "? sa copie avant ou après ?
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 ?
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
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
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
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