XL 2013 vba recherche selon champs (contient)

erwanhavre

XLDnaute Occasionnel
Bonjour à tous
Voir PJ j'aimerai une macro qui me copie les données qui sont dans les champs de recherche en feuil1 et qui requête la base de données qui est en feuil2 (et qui la filtre en même temps)
attention dans les champs de recherche je ne mets que des "bouts" c'est comme si on n'activai que les filtres avec ce qui est contenu
merci pour votre aide
 

Fichiers joints

Calvus

XLDnaute Barbatruc
Re,

Voici, bien que je sois pas sûr d'avoir bien tout compris..(par rapport aux filtres notamment)

A+
 

Fichiers joints

erwanhavre

XLDnaute Occasionnel
exemple si je mets "dudu" dans la ligne
information 8
j'aurai en feuil2 juste la ligne contenant "dudu" de filtré
est ce faisable ?
 

Calvus

XLDnaute Barbatruc
Re,

Comme ceci peut être.

Il faut se placer sur la cellule que tu veux filtrer dans la feuille 1 avant de lancer la macro.

A+
 

Fichiers joints

erwanhavre

XLDnaute Occasionnel
désolé je dois mal m'exprimer
j'aimerai avoir la possibilité d'appliquer plusieurs filtres exemple
si je note dans la feuil1
information 1
information 2
information 3zzz
information 4zfez
information 5
information 6
information 7
information 8zfe

Je voudrais qu'il n'y ai que la ligne 4 d'affichée dans la feuil2
Est ce plus clair ?
 

Roblochon

XLDnaute Accro
Bonjour,

D'après ce que j'ai compris voici une tentative par VBA AdvancedFilter.
La zone de critères que j'ai mise en feuil2 au dessus des données, peut-être déménagée partout ailleurs. L'important étant qu'elle est le même nombre de cellule que la zone A1:B8 de la feuil1 mais en ligne.

P.S. puisque vous aviez déjà posé un bouton pour une macro dans votre fichier, la prochaine fois enregistrez le en .xlsm avant de le joindre, ça nous évitera d'avoir à le faire et deux fichiers au lieu d'un

Cordialement
 

Fichiers joints

erwanhavre

XLDnaute Occasionnel
Bien noté la remarque sur le fichier xlsm Roblochon
par contre je n'ai pas besoin d'avoir l'info dans la feuil1 j'ai besoins qu'en appuyant sur le bouton :
  • Aller sur la feuil2
  • Filtrer la feuil2 en fonction des critères noté en feuil1
en prenant compte que dans les critères de recherche on applique la "méthode" contient et non "égal à"
désolé j'ai le fonctionnement en tête mais pas forcément les mots
j’espère que c'est plus clair...
 

laurent950

XLDnaute Impliqué
Bonsoir Calvus, Roblochon, Erwanhavre, sans oublier le Forum.

Ce n'est pas bizarre, C'est juste qu'une date c'est pas un format texte.

La macro a Roblochon est très bien, si je peux me permettre de rajouter juste une instruction à sa procédure.

Ps : Roblochon si vous pouvez m'expliquer la syntaxe de cette commande : plage.Parent.Activate
Plage j'ai compris c'est la variables Objet
Parent (Je connais pas)
Activate je sais l'utiliser

' ***************************************************************************************************************************************
Ajout dans le code

VB:
Option Explicit
Sub Fiiiiiiiiiiiltrer()
    Dim i As Long
    Dim valeur As Variant
    Dim plage As Range
    Set plage = Sheets("Feuil2").Range("A1").CurrentRegion
    For i = 1 To 8
        If Not IsEmpty(Sheets("Feuil1").Cells(i, 2)) Then
            valeur = "*" & Sheets("Feuil1").Cells(i, 2).Value & "*"
            ' test la valeur d'une cellule
                If IsDate(Sheets("Feuil1").Cells(i, 2).Value) Then
                ' Si la cellule = Sheets("Feuil1").Cells(i, 2).Value) est égale à une date.
                ' Transfert de la date telle quelle dans la variable = valeur
                ' Soit la date.
                    valeur = Sheets("Feuil1").Cells(i, 2).Value
                    ' Filtre avec la date.
                    plage.AutoFilter field:=i, Criteria1:="=" & valeur
                Else
                ' Si non dans les autres cas c'est sur une zone de texte
                ' Bien sûr les "*" sont des Jocker et sont équivalent à contient pour le filtre
                ' donc Contient le Texte de la cellule comme ci desous.
                '    "*" & Sheets("Feuil1").Cells(i, 2).Value & "*"
                    plage.AutoFilter field:=i, Criteria1:="=" & valeur
                End If
        End If
    Next i
    ' Par contre ici je n'ai pas compris Parent (cette instruction mais inconu)
        plage.Parent.Activate
End Sub
Cdt
Laurent
 
Dernière édition:

Roblochon

XLDnaute Accro
Bonjour @laurent950

Quasiment tous les objets en vba ont une propriété Parent qui retourne l'objet auquel ils "appartiennent". Pour un objet Range (Plage), c'est sa feuille. Feuille qui a elle-même une propriété Parent qui retourne l'objet Workbook auquel elle appartient qui lui même a une propriété Parent qui retourne l'objet Application (Sommet de la hiérarchie).

@erwanhavre la demande était: "méthode" contient et non "égal à" donc si vous mettez une date, si l'assertion "contient" est toujours valable alors mettez la date sous forme de texte telle qu'elle apparait dans le texte des cellules à filtrer. Si vous recherchez des dates exactes (au type date), les méthodes seront différentes et là il ne faut plus appliquer "contient". A vous de voir.

Cordialement
 
Dernière édition:

laurent950

XLDnaute Impliqué
Bonjour Roblochon.
Je viens de lire votre explication sur la propriété Parent, et je vous remercie pour cette explication concernant cette instruction que je ne connaissais pas, je vais essayer de voir dans quelles conditions je vais pouvoir l'intégrer à des futurs codes.
Cdt
Laurent
 

Robert

XLDnaute Barbatruc
Bonjour le fil, bonjour le forum,

Parce que je m'em***dais une autre proposition. Les données ne sont pas filtrées dans l'onglet Feuil2 mais renvoyées dans l'onglet Feuil3 :

VB:
Sub Macro1()
Dim F1 As Worksheet 'déclare la variable F1 (onglet Feuil1)
Dim F2 As Worksheet 'déclare la variable F2 (onglet Feuil2)
Dim F3 As Worksheet 'déclare la variable F3 (onglet Feuil3)
Dim TV1(1 To 8) As String 'déclare la variable TV1 (Tableau des Valeurs de l'onglet F1)
Dim TV2 As Variant 'déclare la variable TV2 (Tableau des Valeurs de l'onglet F2)
Dim TEST As Boolean 'déclare la variable TEST
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim L As Byte 'déclare la variable L (incrément)

Set F1 = Worksheets("Feuil1") 'définit l'onglet F1
For I = 1 To 8 'boucle sur les 8 informations
    TV1(I) = F1.Cells(I, "B") 'définit l'information de la boucle (donnée en colonne "B" de la boucle)
Next I 'prochaine information
Set F2 = Worksheets("Feuil2") 'définit l'onglet F2
TV2 = F2.Range("A1").CurrentRegion 'définit le tableau des valeurs de l'onglet F2, TV2
Set F3 = Worksheets("Feuil3") 'définit l'onglet F3
'renvoie la première ligne du tableau TV2 dans A1 redimensionnée de l'onglet F3
F3.Range("A1").Resize(1, UBound(TV2, 2)).Value = Application.Index(TV2, 1)
F3.Range("A1").CurrentRegion.Offset(1, 0).ClearContents 'efface d'éventuelles anciennes données dans l'onglet F3
K = 1 'initialise la variable K
For I = 2 To UBound(TV2, 1) 'boucle 1 : sur toutes les lignes I du tableau des valeur TV2 (en partant de la seconde)
    TEST = False 'réinitialise la varible TEST
    For J = 1 To 8 'boucle 2 : sur les 8 informations du tableau TV1
        If TV1(J) <> "" Then 'condition : si l'information de la boucle du tableau TV1 n'est pas vide
            'si le texte de l'information n'est pas contenu dans la colonne J de TV2, alors TEST est [vrai], sort de la boucle 2
            If InStr(1, TV2(I, J), TV1(J), vbTextCompare) = 0 Then TEST = True: Exit For
        End If 'fin de la condition
    Next J 'prochaine information de la boucle 2
    If TEST = False Then 'condition : si TEST est [faux]
        ReDim Preserve TL(1 To 8, 1 To K) 'redimensionne le tableau des lignes TL (8 lignes, K colonnes)
        For L = 1 To UBound(TV2, 2) 'boucle3 : sur toutes les colonnes L du tableau des valeurs TV2
            TL(L, K) = TV2(I, L) 'récupère dans la ligne L de TL la donnée en colonne L de TV2 (=> transposition)
        Next L 'prochaine colonne de la boucle 3
        K = K + 1 'incrémente K (ajoute une colonne au tableau des lignes TL)
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
'si K est supérieure à 1, renvoie dans A2 redimensionnée de l'onglet F3 le tableau TL transposé
If K > 1 Then F3.Range("A2").Resize(UBound(TL, 2), UBound(TL, 1)).Value = Application.Transpose(TL)
End Sub
 

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas