Autofilter avec exclusion d'un critère de filtre

Bonsoir à tous.

Je ne parviens pas, malgré mes recherches sur la toile, à réaliser un autofiltre pour lequel toutes les critères seraient cochés sauf un seul lorsque mon critère est une variable string ressemblant à un nombre.

Le but avoué est simple.

J'ai 2 colonnes:

La première affiche des valeurs alphanumériques

La seconde colonne affiche des numéros de figure (identifiés par un numéro à 2 chiffres et éventuellement un caractère alphabétique en plus).

Ce que je souhaite, c'est filtrer la deuxième colonne pour afficher TOUTES les figures sauf une seule dont le numéro est stocké dans une variable.

Ceci afin de:

  • supprimer toutes les lignes filtrées
    supprimer ensuite le filtre et me retrouver au final avec les lignes relatives à ma figure stockée dans la variable.

Par exemple, j'ai 6 figures : 01, 01A, 02, 03, 03A, 04.

Je stocke dans ma variable FigNum la valeur string "03".

J'active mon autofiltre, et dans la le filtre de la colonne "B", je sélectionne les figures 01, 01A, 02, 03A, 04 mais PAS la 03.

Toutes les lignes s'affichent en fonction du résultat du filtre, je les sélectionne toutes puis je les supprime.

Enfin, je supprime le filtre et il ne me reste plus que les lignes relatives à ma figure FigNum "03".

J'ai tenté l'instruction suivante:

Dim FigNum as string'stocke le numéro de la figure, par exemple 02A ou 03
Mafeuille.UsedRange.AutoFilter Field:=2, Criteria1:="<>" & FigNum

Cela fonctionne correctement seulement si FigNum est à 3 digits et comporte donc un caractère numérique (ex: 03A).

Si FigNum = 01 ou 02 ou 03 ou NN, cela ne fonctionne plus.

Je précise que toute la colonne est au format texte et que ma variable FigNum est typée string.

J'imagine que c'est un problème de type de variable.

Ci-joint la feuille excel.

Merci d'avance pour vos lumières.

Cordialement.

Bonjour,

Sub TriFig()
    Dim d As Object, FigNum, choix$, n%, i%
    Set d = CreateObject("Scripting.Dictionary")
    With Worksheets("CSN-EDES")
        n = .Cells(.Rows.Count, 2).End(xlUp).Row
        For i = 2 To n
            d(.Cells(i, 2).Value) = ""
        Next i
        FigNum = d.keys
        Do
            choix = InputBox("Vous désirez générer l'index de quelle Figure ?" & Chr(10) _
             & "Choisir dans la liste suivante : " & Join(FigNum, "|"))
            If choix <> "" Then
                For i = 0 To UBound(FigNum)
                    If FigNum(i) = choix Then
                        FigNum(i) = "@": Exit Do
                    End If
                Next i
            End If
        Loop
        FigNum = Replace(Replace(Join(FigNum), "@ ", ""), " @", "")
        FigNum = Split(FigNum)
        Application.ScreenUpdating = False
        .Range("B1").autofilter 2, FigNum, xlFilterValues
        .Range("B2:B" & n).SpecialCells(xlCellTypeVisible).EntireRow.Delete
        .ShowAllData
    End With
End Sub

Filtrage à partir d'un tableau des valeurs à filtrer...

NB- J'ai omis de tester s'il y avait plus d'une valeur... (si le cas devait pouvoir se produire, il conviendrait de tester pour ne mettre en tableau que si plus d'une valeur).

Cordialement.

Bonjour Mferrand.

Je vous remercie d'avoir bien voulu prendre de votre temps pour me répondre.

C'est même plus qu'une réponse.

Cependant, au regard du nombre d'étoiles qui scintillent sous votre pseudo, je perds tout espoir de m'en tenir à quelque chose de simple.

Je suis un éternel débutant en VBA et j'avoue que si je parviens toujours à me débrouiller, je m'en tiens à des méthodes assez populaires et basiques.

Ce que j'aimerais savoir pour ce qui concerne la méthode que j'ai utilisée, c'est pourquoi elle ne fonctionne pas avec une variable constituée uniquement de digits numériques.

J'imagine que si vous vous êtes ingénié à créer le code VBA ci-dessus, c'est qu'il n'y pas moyen d'utiliser la méthode autofilter tel que je l'aurais souhaité...

J'ai lu votre code, et il n'y a pas d'ambiguïté possible, il fonctionne à merveille.

Sauriez-vous m'expliquer pourquoi il y a des % sur vos variables déclarées ?

Pour ce qui est de "object", je n'en ai encore jamais utilisé.

Si d esu déclaré object, quid de FigNum, choix$, n%, i% (ce sont des strings mélangées à des integer sans typage affiché ?

Pourquoi typer un objet et pas les autres (j'ai fait une petite formation VBA et mon approche reste très scolaire, très protocolaire surtout en matière de "rigorisme" lié aux déclarations) ?

Si j'ai bien compris, Scripting.Dictionary permet de stocker des données dans la mémoire de l'ordinateur ?

J'ai du mal à comprendre le code. Je suis à des années lumières de ce type d'écriture...

Si vous vous pouviez jeter quelques lumière sur votre code, ça serait super.

Merci encore et bonne journée.

Cordialement.

Bonjour,

moi non plus je ne comprend pas que "<>02" ne fonctionne pas.

Il semble (j'en suis même sûr avec les tests) qu'excel tente une conversion de la chaine en numérique, et s'il y arrive fasse un filtre numérique et non texte. Et ce même en manuel alors qu'on est explicitement dans les Filtres textuels.

Cependant dans ton cas de figure tu peux t"en sortir avec

Criteria1:="<>*" & FigNum

dans la mesure où apparemment tu n'as jamais de caractère devant le nombre.

Ou bien, si tu en as la possibilité, forcer la conservation en texte en démarrant tous tes noms de figure par "_"

eric

Bonsoir,

Je te dirai que lorsqu'une méthode refuse de fonctionner, pour avancer il convient d'en trouver une autre qui fonctionne...

Ceci dit, tu as raison sur le fait que ce n'est pas complètement satisfaisant et qu'on aimerait arriver à savoir pourquoi !

Mais comme Eric, cela m'irrite un peut mais je n'ai pas d'explication satisfaisante. En vérifiant, cela active bien le filtre textuel, différent de mais avec immanquablement la valeur 3... Une conversion s'opère donc, que l'on n'arrive pas à empêcher jusqu'à présent (et je peux te garantir que mes essais pour élucider la chose ont été nombreux...)

Comme Eric j'ai constaté qu'en insérant une astérisque (caractère joker signifiant qu'il peut remplacer un ou plusieurs caractères ou aucun), cela fonctionne. Là en vérifiant c'est le filtre personnalisé qui est activé : ne se termine pas par...

Très louable à toi de t'intéresser de près au code... Tu as des connaissances de base en VBA, et c'est une bonne occasion de s'attacher à quelques détails pour les étoffer... Mes variables sont toutes typées sauf une. Le réflexe consistant à penser qu'il faut au maximum typer ses variables est un bon réflexe, à conserver.

d est déclaré As Object : de la même façon, il convient de préférer un type d'objet défini... Par sécurité, je reste sur une déclaration d'objet générique lorsque l'assistant VBA ne me propose pas l'objet qui conviendrait. Et il y a aussi quelques objets dont le type est fluctuant lors de leur constitution, notamment du côté d'objets qui finiront par être de type Shape, mais ne le sont pas encore à l'insertion ou à la mise en place de leurs éléments constituant (exemple : une procédure destinée à fabriquer une forme libre, on en définit les constituants et il est commode d'affecter le premier posé à une variable, mais erreur si on la déclare en Shape, car on aura un objet Shape qu'après avoir appliqué la méthode ConvertToShape à la construction...)

FigNum n'est pas typée, donc de type Variant, volontairement car elle est destinée à pouvoir accueillir un tableau et concurremment la transformation de ce tableau en chaîne au moyen de la fonction Join, avant retransformation en tableau après modification de la chaîne au moyen de la fonction Split. Là le type Variant s'impose.

Je dois tout de même ajouter que j'utilise plus souvent des variables Variant que des variables Date pour les dates (plus de souplesse dans le traitement de ce type de données. Et dans une moindre mesure j'utilise aussi assez fréquemment des Variant pour des nombres décimaux, au lieu de typer en Double.

Ensuite : choix$ est équivalent à choix As String ($ est ici un caractère de déclaration de type).

De même dans n% et i%, % est équivalent à As Integer.

Il existe encore quelques autres caractères de déclaration de type utilisables :

& = As Long

! = As Single

# = As Double

@ = As Currency

Cela permet de raccourcir un peu les déclarations et le temps passé à les écrire...

L'objet Dictionary est un type d'objet fort utile en certaines circonstances (à noter qu'il est disponible sur PC et généralement activé par défaut, mais non disponible sur MAC). Chaque élément d'un dictionnaire est constitué par un couple clé(key)/item (ou valeur de l'élément). Les clés sont unique, il ne peut y avoir 2 éléments avec la même clé. Aussi,, en balayant ta liste en col. B et en créant un élément dico ayant pour clé la valeur de chaque cellule en B, on aura à la fin un dico dont les clés seront tes valeurs en B en un seul exemplaire chacune. Et comme tu l'as vu, il est aisé d'affecter les clés à un tableau...

L'intérêt du dictionnaire est aussi que son exécution est particulièrement rapide.

J'aurais dans tous les cas procédé ainsi dans ma proposition, car cela a l'avantage de pouvoir lister les éléments parmi lesquels choisir pour la saisie dans l'InputBox, et permettre de contrôler la validité de la saisie...

Une fois là, disposant d'un tableau, j'ai trouvé qu'il était loisible de l'utiliser pour le filtrage après élimination du choix, méthode dont je savais qu'elle fonctionnait alors que tu signalais que la tienne échouait...

(Ce n'est qu'ensuite que j'ai testé car cela me chagrinait que ta méthode (tout à fait licite) ne fonctionne pas...)

Cordialement et bonne continuation.

Bonsoir Mferrand.

Je suis ravi de votre réponse pour 3 raisons:

  1. Elle a été formulée dans un français très intelligible et j'y suis sensible
  2. Elle m'a permis d'apprendre de nouvelles choses, notamment pour ce qui concerne le dictionnary, qui s'avère particulièrement utile et pratique et pour l'autre façon de lire/écrire le typage des variables
  3. Enfin, il y a dans votre réponse l'aveu, non dissimulé, d'avoir pris le temps (le temps... c'est une obsession chez moi et je sais mesurer ce que représente le temps passé pour quelqu'un d'autre) d'élaborer une réponse posée et "bienveillante", dans le sens où j'en sors, à la fin de la lecture de vos lignes, quelque peu (peu, hein, en regard de mes connaissances) grandi en VBA.

Je ne ferai pas l'affront d'omettre de remercier Éric dont la contribution me donne une astuce que je n'aurais jamais trouvée sur la toile.

Merci pour votre aide.

Bonne soirée.

Bonsoir, et merci de ton retour.

Je ne pense pas que prendre du temps pour expliquer soit du temps perdu si quelqu'un d'autre prend le temps de comprendre... et même si l'explication n'atteint personne dans l'immédiat, elle pourra toujours être repêchée...

Mais je suis sensible et il est satisfaisant de savoir qu'une explication atteint son but !

Bien qu'occitan, si j'écris en français je m'efforce toujours de ne pas produire un galimatias mi-français, mi-anglais, mi-indéfinissable...

On n'échappe pas à l'anglais dans le domaine qui nous occupe, mais j'aurais tendance à ne pas considérer les mots anglais qu'il est indispensable d'utiliser pour être précis dans les désignations comme un usage de l'anglais mais comme du code et justement des noms d'objets...

Bonne continuation.

Coralament.

Bonjour,

et la prochaine explication se fera en occitan pour préserver une part de notre patrimoine

eric

Segúr !

Tiens, j'ai trouvé une question susceptible de t'intéresser : https://forum.excel-pratique.com/excel/macro-repartition-optimale-des-charges-de-travail-t88437.html

Je n'ai pas eu le courage (et j'ai un projet perso sur le feu) de m'y attaquer

Je te remercie ! Très sympa mais je suis sur un qui s'est multiplié tout seul... (ça m'avait l'air rapide au départ, sauf que coder une fonctionnalité en laissant de côté les trois qui vont avec c'était pas très cohérent... et qui en plus me pose quelques problèmes de poids...). Je suis dedans, faut que j'aille au bout. Donc j'évite de répondre quand je sens que ça va être un peu long, je picore sur des trucs rapide ou élémentaire pour aérer les trauvaux plus lourds en cours. Et j'en ai 3 ou 4 qui étaient quasi finis mais que je ne considère pas avoir amené complètement à terme, j'essaie de ne pas les laisser s'ensevelir !

Quand à mes travaux perso, je les ai différé pourle moment, m'avaient paru trop lourds dans la période... !

Rechercher des sujets similaires à "autofilter exclusion critere filtre"