Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Filtre automatique

Chombi

XLDnaute Occasionnel
Bonjour à tous

En utilisant un filtre auto il est possible de sélectionner tout ou rien via la case à cocher du haut.(j’apprends rien à personne)
Mais je cherche le moyen d'inverser la sélection, je m'explique:
par ex sur un filtre de 10 cases on sélectionne les 5 premières puis en un clic via un bouton par ex on désélectionnerait les 5 premières et on sélectionnerait les 5 dernières

Est ce que quelqu'un aurait une solution?

Merci
 

job75

XLDnaute Barbatruc
Re : Filtre automatique

Bonjour Chombi,

Voyez le fichier joint et cette macro :

Code:
Sub InverserFiltrage()
Dim col%, d As Object, i&, crit
col = 1 'colonne de filtrage, à adapter
Set d = CreateObject("Scripting.Dictionary")
With [A1].CurrentRegion 'à adapter
  For i = 2 To .Rows.Count
    If .Rows(i).Hidden Then d(.Cells(i, col).Value) = ""
  Next
  If d.Count Then crit = d.keys Else crit = "="
  .AutoFilter col, crit, xlFilterValues
End With
End Sub
Bravo pour le sujet, c'est la 1ère fois que je fais ça

A+
 

Pièces jointes

  • Inverser le filtrage(1).xlsm
    19 KB · Affichages: 30
Dernière édition:

job75

XLDnaute Barbatruc
Re : Filtre automatique

Re,

Avec la propriété .Value les nombres ne sont pas filtrés il faut utiliser .Text :

Code:
Sub InverserFiltrage()
Dim col%, d As Object, i&, crit
col = 1 'colonne de filtrage, à adapter
Set d = CreateObject("Scripting.Dictionary")
With [A1].CurrentRegion 'à adapter
  For i = 2 To .Rows.Count
    If .Rows(i).Hidden Then d(.Cells(i, col).Text) = ""
  Next
  If d.Count Then crit = d.keys Else crit = "="
  .AutoFilter col, crit, xlFilterValues
End With
End Sub
Fichier (2).

A+
 

Pièces jointes

  • Inverser le filtrage(2).xlsm
    19 KB · Affichages: 27

Chombi

XLDnaute Occasionnel
Re : Filtre automatique

Bonjour job75 (mon fidèle serviteur)

Bravo pour le sujet, c'est la 1ère fois que je fais ça
coup de chance, j'ai toujours peur d'envoyer un sujet déjà traité, mais après quelques recherches j'avais en effet rien trouvé

En tout cas un grand merci c'est exactement ce que je recherchais
 

Chombi

XLDnaute Occasionnel
Re : Filtre automatique

J'ai été un peu vite

fonctionne très bien sur la colonne 1 par contre sur la colonne 4 par ex (voir fichier) si on a filtré préalablement la colonne 1, l'inversion ne fonctionne pas
l'idée serait d'attribuer un bouton à chaque colonne, possédant un filtre, pour pouvoir inverser rapidement la sélection filtrée, sans avoir d'incidence sur les filtres fait préalablement sur les autres colonnes
j’espère avoir été clair

Merci
 

Pièces jointes

  • Inverser le filtrage(3)-1.xlsm
    17.7 KB · Affichages: 25

Chombi

XLDnaute Occasionnel
Re : Filtre automatique

Re

oui en effet, cependant avec des filtres sur plusieurs colonnes quand on attribue le bouton à la première colonne ça fonctionne très bien et je ne sais dire pourquoi

à bientôt
 

Pièces jointes

  • Inverser le filtrage(4)-1.xlsm
    17.7 KB · Affichages: 24

Chombi

XLDnaute Occasionnel
Re : Filtre automatique

Re

ma colonne sur laquelle je voulais appliquer ce code se trouvée en D je vais la déplacer en A c'est un bon début en attendant de pouvoir améliorer

Merci
A bientôt
 

Chombi

XLDnaute Occasionnel
Re : Filtre automatique

Re

Après de nombreux essais le code a malgré tout un drôle de comportement !!!
Difficile à expliquer.... si quelqu'un a 5 minute ou plus
Je réétudierai cela demain.....

A bientôt
 

job75

XLDnaute Barbatruc
Re : Filtre automatique

Bonjour Chombi, le forum,

Une macro plus élaborée qui détermine l'unique colonne filtrée :

Code:
Sub InverserFiltrage()
Dim i&, col%, d As Object
If Not ActiveSheet.AutoFilterMode Then GoTo 1
With ActiveSheet.AutoFilter.Range
  For i = 1 To .Parent.AutoFilter.Filters.Count
    If .Parent.AutoFilter.Filters(i).On Then
      If col Then MsgBox "Filtrez une seule colonne !": Exit Sub
      col = i
    End If
  Next
1 If col = 0 Then MsgBox "Aucun filtrage...": Exit Sub
  Set d = CreateObject("Scripting.Dictionary")
  For i = 2 To .Rows.Count
    If .Rows(i).Hidden Then d(.Cells(i, col).Text) = ""
  Next
  .AutoFilter col, d.keys, xlFilterValues
End With
End Sub
Edit : c'est plus cohérent avec .AutoFilter.Range...

Fichier (4).

A+
 

Pièces jointes

  • Inverser le filtrage(4).xlsm
    20.8 KB · Affichages: 20
Dernière édition:

Chombi

XLDnaute Occasionnel
Re : Filtre automatique

Bonjour job75

une idée: ne pourrait on pas sur les colonnes B,C,D (1) - enregistrer le filtre en cour (2) - défiltrer les colonnes B,C,D (3) - inverser le filtrage en A puis en (4) - filtrer B,C,D avec l'enregistrement du début

test sur D ci joint (par contre je ne sais pas comment enregistrer le filtre en cour)

A bientôt
 

Pièces jointes

  • Inverser le filtrage(5).xlsm
    19.4 KB · Affichages: 15

Chombi

XLDnaute Occasionnel
Re : Filtre automatique

Re,

il y a quelque temps (bientôt 10 ans) j'avais récupéré un code de J boisgontier (ci dessous) qui affiche dans la cellule au dessus du filtre les valeurs filtrés ex:formule en B1: =filtreactuel(B2), en C1:=filtreactuel(C2) etc

Code:
Fonctions personnalisées
Ces fonctions affiche les critères de filtres choisis

Function FiltreActuel(c, Optional typeCol As String)
 col = c.Column - Sheets(Application.Caller.Parent.Name).Range("_FilterDataBase").Column + 1
 feuille = Application.Caller.Parent.Name
 Application.Volatile
 If Sheets(feuille).FilterMode Then
    If Sheets(feuille).AutoFilter.Filters.Item(col).On Then
      temp = ActiveSheet.AutoFilter.Filters.Item(col).Criteria1
      If Left(temp, 2) = ">=" Or Left(temp, 2) = "<=" Then
         o = Left(temp, 2): n = Mid(temp, 3)
      Else
         If Left(temp, 1) = "=" Or Left(temp, 1) = ">" Or Left(temp, 1) = "<" Then
           o = Left(temp, 1): n = Mid(temp, 2)
         Else
           n = temp
         End If
      End If
      If typeCol = "D" Then n = Format(n, "dd/mm/yy")
      temp = o & n
      '---
      If Sheets(feuille).AutoFilter.Filters.Item(col).Operator Then
          oper = IIf(Sheets(feuille).AutoFilter.Filters.Item(col).Operator = 1, " ET ", " OU ")
          On Error Resume Next
          Err = 0
          temp2 = Sheets(feuille).AutoFilter.Filters.Item(col).Criteria2
          If Err = 0 Then
              If Left(temp2, 2) = ">=" Or Left(temp2, 2) = "<=" Then
                 o = Left(temp2, 2): n = Mid(temp2, 3)
              Else
                If Left(temp2, 1) = "=" Or Left(temp2, 1) = ">" Or Left(temp2, 1) = "<" _
                 Then o = Left(temp2, 1): n = Mid(temp2, 2)
              End If
              If typeCol = "D" Then n = Format(n, "dd/mm/yy")
              temp2 = o & n
           Else
              oper = ""
           End If
       End If
       FiltreActuel = temp & oper & temp2
    Else
      FiltreActuel = ""
    End If
  Else
      FiltreActuel = ""
  End If
End Function

Code que j'ai d’ailleurs des difficultés à comprendre
est ce que vous pensez que c'est utilisable?
on pourrait copier les valeurs dans une autre cellule pour s'en servir ensuite

A bientôt
 

Discussions similaires

Réponses
6
Affichages
336
Réponses
14
Affichages
445
Réponses
15
Affichages
788
Compte Supprimé 979
C
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…