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

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
Bonjour BenHarber, Bruno,

Non pas pile poil car il faut déclencher la macro comme indiqué dans le titre.

Pour cela mettre une fonction SOUS.TOTAL dans la feuille et le code de la macro dans une Worksheet_Calculate.

A+
 

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
Youki, job75,
Merci pour votre réponse rapide : c'est exactement ce que je voulais (je n'utilise jamais l'évènement "Worksheet_Calculate", donc je tournais en rond) : ce code va m'être bien utile, YESSSS !
Merci beaucoup
BH
 

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
849
Compte Supprimé 979
C
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…