Filtre élaboré par VB

Bonjour à tous,

Je sollicite votre aide svp

Je souhaite faire un filtre élaboré par macro et je galère un peu.

Lorsque je choisis "Banane" en cellule B4 et "tout"en cellule J4, j'aimerai que toutes les lignes comportant Banane s'affichent dans le tableau en dessous

Merci beaucoup d'avance.

Help

Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Application.Intersect(Target, Range("B4")) Is Nothing Then
        On Error Resume Next
        ActiveSheet.ShowAllData         'Libérer le filtre
        On Error GoTo 0
    If Target.Count > 1 Or Target = "" Then Exit Sub

    Range("R2") = "=IF(OR($B$4=""Banane"",$B$4=""Basket"",$B$4=""Pomme"",$B$4=""Orange""),TRUE,FALSE)"

    Range("A7:J1344").AdvancedFilter Action:=xlFilterInPlace, _
    CriteriaRange:=Range("r1:r2"), Unique:=False
 End If
End Sub
mon fichier est : [attachment=0]Test A.xlsm[/attachment]
7test-a.xlsm (82.51 Ko)

Bonjour,

Essaie de faire du VBA (au lieu d'enregistreur mal digéré) et sans rester collé à Excel !

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$B$4" Then
        On Error Resume Next
        Me.ShowAllData
        On Error GoTo 0
        Me.Range("R2") = Target
        [Synth].AdvancedFilter xlFilterInPlace, [Criteres]
    End If
End Sub

NB- Base nommée en dynamique...

NB2- 3 modules standard, c'est 2 de trop, j'en ai supprimé un, reste un en trop

Un nettoyage des noms ne serait pas inutile !

24fopinem-test-a.xlsm (86.27 Ko)
MFerrand a écrit :
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$B$4" Then
        On Error Resume Next
        Me.ShowAllData
        On Error GoTo 0
        Me.Range("R2") = Target
        [Synth].AdvancedFilter xlFilterInPlace, [Criteres]
    End If
End Sub

Bonjour MFerrand,

Je te remercie

Désolée, je suis novice. ça a du te faire mal aux yeux

Cependant, j'ai des questions :

  • A quoi sert le Me. ?
  • Est il possible de mettre un 2e filtre en j4. Exemple : si je choisis EV (cellule J4), et banane (cellule B4), alors toutes les lignes comportant "banane" (en colonne C) et "1" ou "2" (en colonne D) sont affichées ?

Merci encore

Me désigne toujours l'objet concerné dans un module d'objet (feuille, classeur, Userform).

Le filtrage avancé se fait selon les indications de la zone de critères, tu étends cette zone et ajoute des critères...

MFerrand a écrit :

Me désigne toujours l'objet concerné dans un module d'objet (feuille, classeur, Userform).

Le filtrage avancé se fait selon les indications de la zone de critères, tu étends cette zone et ajoute des critères...

Merci encore.

Voici mon code final :

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$B$4" Then
        On Error Resume Next
        Me.ShowAllData
        On Error GoTo 0
        Me.Range("R2") = Target
        Range("A7:I1344").AdvancedFilter xlFilterInPlace, [Criteres]
    End If
    If Target.Address = "$J$4" Then
        On Error Resume Next
        Me.ShowAllData
        On Error GoTo 0
        Me.Range("S2") = Target
        Range("A7:I1344").AdvancedFilter xlFilterInPlace, [Criteres]
    End If
End Sub

Re,

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim cr
    If Target.Address = "$B$4" Or Target.Address = "$J$4" Then
        On Error Resume Next
        Me.ShowAllData
        On Error GoTo 0
        cr = Array(Me.Range("B4"), Me.Range("J4"))
        Me.Range("R2:S2").Value = cr
        Me.Range("A7:I1344").AdvancedFilter xlFilterInPlace, [Criteres]
    End If
End Sub

Mais nomme ta base, comme je l'avais fait, en dynamique, tu n'auras plus à te préoccuper de son extension !

Cordialement.

MFerrand a écrit :

Re,

Mais nomme ta base, comme je l'avais fait, en dynamique, tu n'auras plus à te préoccuper de son extension !

Cordialement.

si je nomme ma base (Synth), et sachant que mon tableau peut comporter des lignes vides, le filtre ne prend pas toutes les lignes du tableau

J'ai vu que c'est parce que ta première colonne comporte des cellules vides, ainsi d'ailleurs que plusieurs autres. Il convient en effet de choisir pour le dimensionnement dynamique d'une plage nommée une colonne ne comportant aucun vide. Il semble que ta colonne H soit dans cette situation, à confirmer. Sinon l'on n'a pas de colonne dans ce cas, on a tout intérêt à en ajouter une pour acueillir un identifiant unique des enregistrements et ne comportera de ce faut aucun vide, ce qui offre une garantie de manipulation fiabilisée d'une base...

Cordialement.

Rechercher des sujets similaires à "filtre elabore"