Je me suis fait quelques utilitaires de suppression / restoration de filtres sur tableau structuré.
Pourquoi ? Et bien parce que le Delete de lignes dans une tableau structuré filtré pose différents problèmes qu'on ne peut contourner qu'en supprimant les filtres.
Alors donc 2 fonctions principales dans le fichier joint: - Sub StockerFiltresTableauStructuré
- Sub DéstockerFiltresTableauStructuré
Jusque là pas de problème ça fonctionne, jusqu'au moment où j'ai placé un Filtre Couleur.
Le .Criteria1 récupéré en Stocker est un ObjetCriteria1:=RGB(255, 255, 0). Fort bien !
Mais évidemment le .Criteria1=<l'objet en question> plante en Déstocker. Et je ne sais pas comment le valoriser.
Scénario du test:
- Filtrer la colonne T2 sur la couleur jaune
- Cliquer sur le bouton StockerFiltres
- Cliquer sur le bouton SupprimerFiltres
- Cliquer sur le bouton DéstockerFiltres -> Plantage sur la création du filtre
Oui TabFiltres(j).Criteria1 est un objet, et plus précisément un Interior. J'ignore pourquoi c'est comme ça mais Il possède alors une propriété Color. Hélas elle n'est pas convenablement initialisée.
Tu peux maintenir tout ce que tu veux. Même que 2 + 2 = 4 (en base 10).
Moi je maintiens que Critéria1 est un Object. Et ça n'avance pas le schimblick de savoir que RGB renvoie un Long, ce que tout le monde sait.
Oui TabFiltres(j).Criteria1 est un objet, et plus précisément un Interior. J'ignore pourquoi c'est comme ça mais Il possède alors une propriété Color. Hélas elle n'est pas convenablement initialisée.
Oui je sais bien
D'ailleurs le code que tu as trouvé montre que le problème est bien réel; c'est une confirmation et c'est déjà ça.
Je me sens moins seul
Grandiose. Il faudra que je m'intéresse à ces espions.
Et si, je la trouve bien valorisée: .Criteria1.Color = 65535 ce qui est bien la couleur du jaune en l'occurrence.
Je fais un test en changeant l'Objet en Long, on va voir.
Bravo @Dranreb, tu as éclairci le mystère en identifiant l'objet comme étant un Interior !!!
Cette fois ça marche. On peut:
- Sauvegarder les filtres
- Supprimer les filtres
- Restaurer les filtres
J'espère que c'est le seul cas de filtre qui présente un Object en Criteria1. Edit: Apparemment oui. Voir Post #28.
@Dranreb,
Merci encore, j'y ai passé plusieurs heures à essayer des tas de trucs.
Pourrais-tu STP expliquer en 2 mots comment tu mets un espion sur une variable ?
@Staple1600,
Merci aussi de t'être intéressé à ce problème un peu tordu.
Donc on fait plus fort que le code que tu as trouvé
Dudu2
Je ne vois pas ce que tu as changé dans ton code entre le premier fichier et le dernier fichier.
(mais effectivement cela fonctionne -> test sur Excel 2013)
J'ai juste changé ça dans la capture / sauvegarde des filtres: Ancien:
Code:
With .AutoFilter.Filters(j)
If TypeOf .Criteria1 Is Object Then
Set TabFiltres(j).Criteria1 = .Criteria1
Else
TabFiltres(j).Criteria1 = .Criteria1
End If
Nouveau:
VB:
With .AutoFilter.Filters(j)
If TypeOf .Criteria1 Is Object Then
TabFiltres(j).Criteria1 = .Criteria1.Color
Else
TabFiltres(j).Criteria1 = .Criteria1
End If
De sorte qu'à la restauration des filtres:
VB:
Case Else
.Range.AutoFilter Field:=j, Criteria1:=TabFiltres(j).Criteria1, Operator:=TabFiltres(j).Operator
Ne plante plus puisqu'il n'y a plus d'Object impliqué.
Juste un petit complément concernant les filtres sur couleur.
Ils sont de 2 types:
1 - sur la couleur de fond (Operator = xlFilterCellColor)
2 - sur la couleur de caractères (Operator = xlFilterFontColor)
Curieusement, seul le 1er génère un Object Interior pour Criteria1.
Pourquoi un telle particularité ? Seul Excel le sait ! Le 2ème génère un Long pour Criteria1 ce qui semble plus "normal" dans le cas d'une couleur dans les 2 cas définie par la fonction RGB() pour Criteria1.
Illustré dans ce fichier au code cosmétiquement modifié.
Bonjour.
Je soupçonne un bogue de Microsoft
Toutefois je me demande si ce n'est pas parce que c'était le seul moyen de reproduire aussi ces conneries de ThemeColor et TintAndShade que je n'utilise jamais …