chercher dans une colonne un critere precis et copier la ligne

m0ul3sh0t

XLDnaute Nouveau
Bonsoir,

après moulte recherche, j'ai un peu de mal a faire ce que je veux.
Je cherche a faire une macro pour parcourir la colonne A d'une feuille1 et rechercher selon le critère "type" dans le fichier joint (par exemple). Une fois trouvé une case, je veux copier toute la ligne et la mettre dans la feuille2 si elle n'y est pas déjà, puis recommencer jusqu'à avoir parcouru toute la feuille 1.

Je ne demande pas forcement du code, mais j'aimerais bien être aiguille sur la démarche a avoir parce que je n'ai que des notions en langage C et donc je patoge légèrement :)

Merci d'avance
 

Pièces jointes

  • test.xls
    13.5 KB · Affichages: 85
  • test.xls
    13.5 KB · Affichages: 92
  • test.xls
    13.5 KB · Affichages: 90

Cousinhub

XLDnaute Barbatruc
Re : chercher dans une colonne un critere precis et copier la ligne

Bonjour,
regarde l'exemple joint
tu mets autant de feuilles que tu as de "Type"
tu nommes les feuilles avec le nom de "Type", et met le même en-tête que la feuille de base
Ensuite, on fait un filtre élaboré, qui extrait vers tous les onglets les données correspondantes
 

Pièces jointes

  • TESTv1.zip
    8.8 KB · Affichages: 102
  • TESTv1.zip
    8.8 KB · Affichages: 105
  • TESTv1.zip
    8.8 KB · Affichages: 103

Cousinhub

XLDnaute Barbatruc
Re : chercher dans une colonne un critere precis et copier la ligne

Re-,
le principe du filtre élaboré, lorsqu'on extrait vers un autre emplacement, et qu'on veut effectuer une sélection avec des critères :
- définir la base (dans ton exemple, les 3 premières lignes du code qui nomment dynamiquement la base avant extraction)
- définir les critères :
- Ici, on veut extraire suivant le "Type" donc en en-tête du filtre, on met la catégorie qu'on veut, et dessous (en G2), le critère
- définir la zone d'extraction (ici sur chaque feuille dont le nom est un "Type")

Donc, par ce code, on met en G1 : "Type", et en G2, la catégorie qu'on veut, ici cela correspond au nom de la feuille
 

Cousinhub

XLDnaute Barbatruc
Re : chercher dans une colonne un critere precis et copier la ligne

Re-,
on détermine la zone, en nommant cette zone "base"

de A1 à C et le numéro de la dernière ligne non vide de ta colonne A soit dans ton exemple ligne 7 donc la zone qui servira d'extraction sera la plage de cellules : ("A1:C7")
 

m0ul3sh0t

XLDnaute Nouveau
Re : chercher dans une colonne un critere precis et copier la ligne

Re-
maintenant disons que j'ai un tableau qui va de A à T mais ou toute les colonnes ne sont pas remplies.
Si ma colonne de critere est la colonne G ou le nom en G1 est "type choix" je modifie ces lignes, si j'ai bien comprit:

Set pl = Range("A1:T" & [A65000].End(xlUp).Row)
.[G1] = "type choix"
Range("base").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=.[G1:G2], CopyToRange:=.Range("A1:T1"), Unique:=False

ou est ce que je me trompe?

et si jamais il y a des lignes ou la colonne "type choix" est vide, comment est ce que ca reagit?
 

Cousinhub

XLDnaute Barbatruc
Re : chercher dans une colonne un critere precis et copier la ligne

Re-,
non, dans ce cas, il faut que tu places tes critères dans une colonne non utilisée, soit, si tu extrais toutes tes colonnes vers les autres onglets, en V1 et V2 par exemple

en V1, tu mets le type de critère que tu veux extraire, soit "type choix", dans le code
en V2, le nom de la feuille sera automatiquement mis par le code

Code:
Set pl = Range("A1:T" & [A65000].End(xlUp).Row)
.[V1] = "type choix"
.[V2] = sh.Name
Range("base").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=.[V1:V2], CopyToRange:=.Range("A1:T1"), Unique:=False

Ici, avec ce dernier code, on extrait les données ayant les cellules de la colonne "type" vides

pour les cellules vides, elles ne seront pas extraites, à moins de créer une autre feuille, nommée sans type, par exemple, et de recommencer le code comme ceci, par exemple :

Code:
Sub Macro2()
Dim pl As Range
Set pl = Range("A1:T" & [A65000].End(xlUp).Row)
pl.Name = "base"
For Each sh In Sheets
    If sh.Name <> "Feuil1" Then
        If sh.Name <> "sans type" Then
            With sh
                .[V1] = "type choix"
                .[V2] = sh.Name
                Range("base").AdvancedFilter Action:=xlFilterCopy, _
                    CriteriaRange:=.[V1:V2], CopyToRange:=.Range("A1:T1"), Unique:=False
                .[V1:V2].ClearContents
            End With
        Else
            With sh
                .[V1] = "type choix"
                .[V2] = ""
                Range("base").AdvancedFilter Action:=xlFilterCopy, _
                    CriteriaRange:=.[V1:V2], CopyToRange:=.Range("A1:T1"), Unique:=False
                .[V1:V2].ClearContents
            End With
        End If
    End If
Next sh
End Sub
 

m0ul3sh0t

XLDnaute Nouveau
Re : chercher dans une colonne un critere precis et copier la ligne

avec le fichier de teste que tu m'avais donne, il suffisait de creer une feuille avec le nom "type" et la ligne 1 se remplissait automatiquement

j'ai essaye de suivre ce que tu m'as dit pour mon veritable tableau et j'obtiens l'erreur dexecution 1004 ("Nom de champ introuvable ou incorrect dans la plage d'extraction").

la mon tableau commence a la ligne 5 donc je remplace A1:T par A5:T et A1:T1 par A5:T5 mais la macro m'extrait bien une partie mais elle me sort une erreur au bout d'un moment et je ne sais pas du tout pourquoi :s
 

Cousinhub

XLDnaute Barbatruc
Re : chercher dans une colonne un critere precis et copier la ligne

RE-,
comme précisé dans mon premier post :

tu nommes les feuilles avec le nom de "Type", et met le même en-tête que la feuille de base

il faut donc que dans chaque feuille, il y ait les mêmes titres
Ensuite, il faut obligatoirement que ta cellule V1 soit exactement le même en-tête que dans le tableau de base et dans toutes les feuille

Donc, pour toutes les feuilles A5:T5 = A5:T5 de la feuille de base, et V1=C5 si le critère est dans la colonne C
 

Cousinhub

XLDnaute Barbatruc
Re : chercher dans une colonne un critere precis et copier la ligne

Re-,
tu peux les garder, mais tu les mets en plus dans la condition :

Code:
If sh.Name <> "Feuil1" And sh.Name <> "ton_onglet" Then

PS : avec le filtre élaboré, tu n'es pas obligé d'extraire toutes les colonnes, tu peux n'en extraite que le nombre que tu désires, pour peu qu'ils aient le même nom dans les en-têtes
Par exemple, tu peux n'extraire que les colonnes 1,2,3,10,12,17.....
 

Discussions similaires

Statistiques des forums

Discussions
312 113
Messages
2 085 422
Membres
102 886
dernier inscrit
eurlece