XL 2016 VBA - Restoration filtres sur tableau structuré quand TypeOf Criteria1 Is Object

Dudu2

XLDnaute Barbatruc
Bonjour les VBistes,

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 Objet Criteria1:=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

Merci par avance pour tout conseil avisé.
 

Pièces jointes

  • FiltresTableauStructuré.xlsm
    28.6 KB · Affichages: 8
Solution
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.

Dudu2

XLDnaute Barbatruc
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.
 

Dudu2

XLDnaute Barbatruc
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.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
@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é
1646779312803.gif
 

Dudu2

XLDnaute Barbatruc
OK merci pour l'explication.

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é.
 

Dudu2

XLDnaute Barbatruc
Bonjour,

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é.
 

Pièces jointes

  • FiltresTableauStructuré.xlsm
    34.7 KB · Affichages: 2
Dernière édition:

Dranreb

XLDnaute Barbatruc
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 …
 
Dernière édition:

Discussions similaires

Réponses
8
Affichages
620