XL 2013 Déclencher une macro à partir de l'utilisation d'un filtre

BenHarber

XLDnaute Occasionnel
Bonjour le Forum,
J'ai une question à laquelle je n'ai pas trouvé de réponse satisfaisante sur le net : peut-être pourrez-vous m'éclairer ?
Je souhaiterais savoir s'il est possible de déclencher une macro à partir de l'utilisation d'un filtre dans un tableau ?
cf. PJ. : par exemple, j'aimerais avoir en retour, un message qui m'indique la lettre de la colonne du filtre utilisé : est-ce possible ?

Merci d'avance pour vos lumières souvent salvatrices !
BH
 

Pièces jointes

  • Macro déclenchée avec l'utilisation d'un filtre.xlsm
    10.3 KB · Affichages: 13

job75

XLDnaute Barbatruc
Voyez le fichier joint et la macro :
Code:
Private Sub Worksheet_Calculate()
Dim i%
If Not Me.AutoFilter Is Nothing Then MsgBox "Un filtre a été créé sur la feuille"
MsgBox IIf(Me.FilterMode, "Il y a ", "Il n'y a pas ") & " des données filtrées"
MsgBox "Il y a " & Me.AutoFilter.Filters.Count & " colonnes sur lesquelles il y a un filtre"
For i = 1 To Me.AutoFilter.Filters.Count
    If Me.AutoFilter.Filters(i).On Then MsgBox "Le filtre est situé en position " & i
Next i
End Sub
 

Pièces jointes

  • Filtre(1).xlsm
    21.2 KB · Affichages: 11

job75

XLDnaute Barbatruc
Re, bonjour JB,

Ben Harber demande la lettre de la colonne filtrée donc :
Code:
Private Sub Worksheet_Calculate()
Dim i%
If AutoFilter Is Nothing Then MsgBox "Aucun filtre n'a été créé sur la feuille": Exit Sub
MsgBox IIf(FilterMode, "Il y a ", "Il n'y a pas ") & " des données filtrées"
MsgBox "Il y a " & AutoFilter.Filters.Count & " colonnes sur lesquelles il y a un filtre"
For i = 1 To Me.AutoFilter.Filters.Count
    If AutoFilter.Filters(i).On Then _
        MsgBox "La colonne " & Split(AutoFilter.Range.Columns(i).EntireColumn.Address(0, 0), ":")(1) & " est filtrée"
Next i
End Sub
Fichier (2).

A+
 

Pièces jointes

  • Filtre(2).xlsm
    21.6 KB · Affichages: 12

BenHarber

XLDnaute Occasionnel
Bonjour à tous,
Je reprends ce post car j'ai une question complémentaire sur le sujet :
Maintenant que je sais comment détecter la (les) colonne(s) filtrée(s) de mon tableau, connaissez-vous le code pour récupérer dans une variable (variable tableau je suppose) les critères sélectionnés ?
Par exemple, en reprenant le tableau de Job75, si je filtre sur la colonne "B" les valeurs b2 et b4, puis-je récupérer b2 et b4 dans une variable ?

Merci d'avance pour vos suggestions qui sont toujours les bienvenues :).

BH
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Bonjour,

Cf PJ

http://boisgontierjacques.free.fr/fichiers/Filtre/FiltreImprime.xls
http://boisgontierjacques.free.fr/fichiers/Filtre/FiltreAutoFonctionPerso.xls

Code:
Function FiltreCol(Champ As Range, TitreChamp As Range)
  Application.Volatile
  If Not ChampActif(TitreChamp) Then FiltreCol = "": Exit Function
  Set d = CreateObject("scripting.dictionary")
  d.CompareMode = vbTextCompare
  For Each c In Champ
     If Not c.EntireRow.Hidden And c.Value <> "" Then d(c.Value) = c.Value
  Next c
  a = d.items
  If IsDate(Champ(1)) Then
    If d.Count = 1 Then
       FiltreCol = TitreChamp & ":" & Format(a(0), "dd/mm/yyyy")
    Else
       mini = a(0): maxi = a(0)
       For i = LBound(a) To UBound(a)
         If a(i) < mini Then mini = a(i)
         If a(i) > maxi Then maxi = a(i)
       Next i
       FiltreCol = TitreChamp & ":" & "> " & mini & " et < " & maxi
    End If
   Else
     FiltreCol = TitreChamp & ":" & Join(a, ",")
   End If
End Function



Boisgontier
 

Pièces jointes

  • Copie de Copie de Macro déclenchée avec l'utilisation d'un filtre.xlsm
    19.1 KB · Affichages: 13
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour BenHarber, JB, le forum,

Tout ce que je sais faire c'est lister les valeurs uniques des colonnes filtrées :
Code:
Private Sub Worksheet_Calculate()
Dim i%, d As Object, P As Range, j&, x$
If AutoFilter Is Nothing Then MsgBox "Aucun filtre n'a été créé sur la feuille": Exit Sub
MsgBox IIf(FilterMode, "Il y a des", "Il n'y a pas de") & " données filtrées"
MsgBox "Il y a " & AutoFilter.Filters.Count & " colonnes sur lesquelles il y a un filtre"
For i = 1 To Me.AutoFilter.Filters.Count
    If AutoFilter.Filters(i).On Then
        Set d = CreateObject("Scripting.Dictionary")
        d.CompareMode = vbTextCompare 'la casse est ignorée
        Set P = AutoFilter.Range.Columns(i).Cells
        For j = 2 To P.Rows.Count
            If Not P(j).EntireRow.Hidden Then 'si la ligne n'est pas masquée
                x = P(j)
                If x = "" Then x = "<vide>"
                d(x) = ""
            End If
        Next
        MsgBox "La colonne " & Split(AutoFilter.Range.Columns(i).EntireColumn.Address(0, 0), ":")(1) & _
            " est filtrée" & IIf(d.Count, " sur " & Join(d.keys, ", "), "")
    End If
Next i
End Sub
Fichier (3).

Bonne journée.
 

Pièces jointes

  • Filtre(3).xlsm
    23.2 KB · Affichages: 10

Discussions similaires

Réponses
15
Affichages
790
Compte Supprimé 979
C

Statistiques des forums

Discussions
312 322
Messages
2 087 283
Membres
103 507
dernier inscrit
tapis23