Microsoft 365 Macro pour enlever les filtres mais laisser la possibilité de filtrer avant fermeture

Daniel200666

XLDnaute Junior
Bonsoir à tous
j'ai avec l'aide de certains d'entre vous créer une macro pour "défiltrer" le fichier avant fermeture; dans la mesure où le fichier est multi-utilisateurs car partagé, cela permet à chacun de récupérer un fichier non filtré à chaque fois:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Ws As Worksheet
For Each Ws In Worksheets
If Ws.AutoFilterMode = True Then Ws.AutoFilterMode = False
Next
Sheets(1).Activate
End Sub



en revanche, est-il possible, en complément de la macro ci dessus, de conserver le petit sigle sur chaque colonne, afin que chaque utilisateur ne retourne pas sur "Accueil" >>> "Filtrer" à chaque fois ? je pense que c'est quelque chose sur la ligne en rouge mais je ne vois pas comment la rédiger

Merci de votre aide

Bien à vous et bonne soirée
 

Daniel200666

XLDnaute Junior
Hello,

je m'immisce, y'a un truc que je ne pige pas :
TooFatBoy à proposé "Est-ce qu'un .ShowAllData pourrait convenir ??" et il semblerait qu'il n'y ait pas eue de réponse alors qu'il me semble que c'est "la" bonne façon de faire au lieu d'espérer que les données soient toujours à la même place, non ?

en mode cochon je remplacerai juste Ws.AutoFilterMode = False par Ws.ShowAllData
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Ws As Worksheet
For Each Ws In Worksheets
If Ws.AutoFilterMode = True Then Ws.ShowAllData
Next
Sheets(1).Activate
End Sub
la seule différence c'est l'affichage de toutes les données au lieu de supprimer le filtre (et de devoir le remettre à la prochaine ouverture)
Merci beaucoup pour ces réponses qui m'ont effectivement bien aidé
bonne fin de journée !!
 

TooFatBoy

XLDnaute Barbatruc
en mode cochon je remplacerai juste Ws.AutoFilterMode = False par Ws.ShowAllData
VB:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Ws As Worksheet
    For Each Ws In Worksheets
        If Ws.AutoFilterMode = True Then Ws.ShowAllData
    Next
    Sheets(1).Activate
End Sub
la seule différence c'est l'affichage de toutes les données au lieu de supprimer le filtre (et de devoir le remettre à la prochaine ouverture)
Est-ce que ça fonctionne chez toi ?

Chez moi ça ne fonctionne que s'il y a au moins un filtrage en cours.
Sinon ça provoque une erreur, donc obligé d'ajouter un On Error Resume Next :
VB:
Sub Defiltrage()
'
Dim Ws As Worksheet

    On Error Resume Next
    For Each Ws In Worksheets
        If Ws.AutoFilterMode = True Then
            Ws.ShowAllData
        End If
    Next
    On Error GoTo 0

    Sheets(1).Activate

End Sub
 

Nain porte quoi

XLDnaute Junior
J'ai écrit "en mode cochon" et c'était en fait du "gros cochon" :)

Le On Error Resume Next masque toutes les erreurs, ça n'est pas vraiment une bonne solution
voici la macro en mode "moins cochon"
VB:
Sub Defiltrage()
    Dim Ws As Worksheet
    
    For Each Ws In Worksheets
        If Ws.AutoFilterMode Then
    
            For i = 1 To Ws.AutoFilter.Filters.Count
                If Ws.AutoFilter.Filters(i).On Then
                    Ws.ShowAllData
                    Exit For
                End If
            Next i
        
        End If
    
    Next Ws
    Sheets(1).Activate
End Sub

Ca devrait fonctionner un peu mieux et c'est quand même plus propre.
 

Nain porte quoi

XLDnaute Junior
Oups, désolé pour le malaise vagal provoqué :) ; Le exit for il n'est pas du tout obligatoire c'est juste pour gagner quelques pouillèmes de seconde car une fois que toutes les données sont affichées il ne sert plus à rien de chercher si d'autres colonnes sont filtrées.

...et le "plus propre" c'était par rapport à un "on error resume next"

j'aurais du/pu déclarer proprement les variables aussi :cool:
 

Discussions similaires

Statistiques des forums

Discussions
312 207
Messages
2 086 230
Membres
103 160
dernier inscrit
Torto