Filtre par valeur de cellule.

Résolu
megatronnbjja Messages postés 67 Statut Membre -  
megatronnbjja Messages postés 67 Statut Membre -
Bonjour,

Grace à la macro suivante je filtre mon tableau en fonction des valeurs qui sont renseignées dans la ligne 1.

Le code sur le filtre fonctionne puisque dans un premier temps je l'avais écris pour chaque colonne de mon tableau.
J'ai ensuite voulu améliorer le tout grâce à une boucle For mais la les ennuis commencent.
le débogueur me dit: "Next sans For"

Private Sub Worksheet_Change(ByVal Target As Range)


Dim dercol As Integer
dercol = Cells(2, Cells.Columns.Count).End(xlToLeft).Column  'trouve la dernière colonne de la ligne

For i = 1 To dercol  

    If Not Intersect(Target, Range("A1", Cells(1, dercol))) Is Nothing Then  
        Select Case Target.Address
             
        Case Cells(1, i)
            If Target = "" Then
                Range("$A$2:$AB$3000").AutoFilter Field:=i
            Else
                Range("$A$2:$AB$3000").AutoFilter Field:=i, Criteria1:="*" & Cells(1, i) & "*"
            End If
             
Next i
        
       
        End Select
    End If
End Sub


Si quelqu'un trouve l'erreur ou peut me donner un conseil, merci d'avance.

Megatronnbjja

2 réponses

  1. ccm81 Messages postés 11033 Statut Membre 2 434
     
    Bonjour

    au moins une erreur
    Ton dernier End if doit être placé avant Next i

    ou peut être mieux
    Ton if not intersect .... devrait être placé avant ta boucle For i ...

    bonne suite
    0
    1. ccm81 Messages postés 11033 Statut Membre 2 434
       
      En plus propre, bien que je ne comprenne pas tout

      Private Sub Worksheet_Change(ByVal Target As Range)
      Dim dercol As Long, i As Long
      dercol = Cells(2, Cells.Columns.Count).End(xlToLeft).Column  'trouve la dernière colonne de la ligne
      If Not Intersect(Target, Range("A1", Cells(1, dercol))) Is Nothing Then
        For i = 1 To dercol
           Select Case Target.Address
              Case Cells(1, i)
                  If Target = "" Then
                      Range("$A$2:$AB$3000").AutoFilter Field:=i
                  Else
                      Range("$A$2:$AB$3000").AutoFilter Field:=i, Criteria1:="*" & Cells(1, i) & "*"
                  End If
           End Select
        Next i
      End If
      End Sub


      bon courage
      0
    2. megatronnbjja Messages postés 67 Statut Membre
       
      Re,

      Voici le lien d'un classeur qui reflète ce que je veux faire. J'ai essayé les modif que tu m'as indiquées. Aucune erreur ne s'affiche cependant aucun filtre ne s'applique....
      je continue de plancher. Si tu as de nouvelles idées, je suis preneur.

      https://www.cjoint.com/?0ErlIut1LHA

      Merci
      0
  2. megatronnbjja Messages postés 67 Statut Membre
     
    Bonjour,

    J'ai écrit un code qui fonctionne. Dès que l'on modifie une valeur en ligne 9, le filtre se met en place.

    Private Sub Worksheet_Change(ByVal Target As Range)
    
    
    Dim dercol As Integer, i As Long, derlig As Long
    
    dercol = Cells(10, Cells.Columns.Count).End(xlToLeft).Column   'défini la dernière colonne remplie en ligne 10
    derlig = Range("A" & Rows.Count).End(xlUp).Row                 'défini la dernière ligne remplie en colonne A
    
    
    If Not Intersect(Target, Range("A9", Cells(9, dercol))) Is Nothing Then  'Condition : si modification d'une cellule en ligne 9
    
      For i = 1 To dercol
      
         Select Case Target.Address
            Case Cells(9, i).Address  'on regarde ce qu'il se passe en ligne 9
                If Target = "" Then    'si la cellule est vidée
                    Range("A10", Cells(derlig, dercol)).AutoFilter Field:=i 'critère de filtre: ""
                Else
                   Range("A10", Cells(derlig, dercol)).AutoFilter Field:=i, Criteria1:="*" & Cells(9, i).Value & "*"  'si la cellule contient une valeur alors le critère de filtre est: valeur de la cellule
                   
                End If
         End Select
      Next i
    End If
    End Sub
    0