Validation de données sur filtre

Bonjour à tous,

Après moultes recherches, je n'arrive pas à trouver de solution.

Je souhaite faire une liste déroulante qui va chercher les données dans une liste qui est elle-même filtrée. Le problème, c'est que lorsque je sélectionne la source, cela prend l'ensemble des lignes, même celles qui sont masquées (puisque filtrées). Suis-je assez claire ?

Merci de votre aide et bonne journée !

Angélique

Bonjour Angélique le forum

un petit fichier exemple et on va essayer de te faire cela

a+

Papou

C'est vrai, ce sera plus clair !

Donc onglet Matrice : Liste complète des n° positions

Onglet Filtre : Tableau à compléter pour limiter le nombre de plage à sélectionner.

Merci !!!

Bonjour,

Une solution possible à voir :

2 plages nommées dynamiquement : la colonne de ta base qui alimente la liste déroulante (MatriceCoord) et une autre plage sur une nouvelle feuille qui constituera la liste filtrée (ListeFiltrée).

Cette dernière plage est affectée à la liste déroulante.

La petite macro ci-dessous attachée à un bouton sur la feuille, destinée à mettre à jour la liste selon filtrage.

Sub MajListeFiltrée()
    With [ListeFiltrée]
        If .Rows.Count > 1 Then .Range(Cells(2, 1), Cells(.Rows.Count, 1)).ClearContents
        [MatriceCoord].SpecialCells(xlCellTypeVisible).Copy .Cells(1, 1)
    End With
End Sub

Cordialement

Ferrand

Merci, maintenant faut que j'arrive à l'adapter à mon fichier original

Bonjour,

Pas de difficulté majeure pour ça ! Un petit truc à veiller : tu remarqueras que dans la macro je n'efface la liste filtrée pour la mettre à jour qu'à partir de la 2e ligne. En effet, si j'effaçais tout, la plage serait vide et le nom ne renverrait plus une plage, ce qui provoquerait une erreur d'exécution dans la macro : il ne serait pas possible d'utiliser le nom pour cette opération.

Donc, en nommant cette plage au départ (tu verras dans le gestionnaire de noms la façon de nommer dynamiquement des plages, si besoin), tu mets quelque chose dans la cellule A1 (ou la 1re cellule de la plage), comme "amorce" (qui disparaîtra à la première utilisation) pour faire en sorte qu'une plage à ce nom soit toujours définie.

Cordialement

Ferrand

euhhh...

QU'est-ce qu'un gestionnaire de noms à nommer dynamiquement ??

Je ne connais pas du tout les macros. Comment relier la macro envoyée à mon fichier de travail ? Ou n'importe quel fichier que j'aurai à traiter ainsi à l'avenir ?

Merci

Merci Ferrand pour ces détails ...!

J'ai renommé avec le gestionnaire de noms que j'ai trouvé

J'ai copier/Coller le bouton de macro dans mon fichier

J'ai renommer en fonction des onglets

ça marche toujours pas

Help !!

Commençons au début : mettre des noms (à des cellules, à des plages de cellules et bien d'autres éléments est une faculté d'Excel bien pratique qui permet d'utiliser le nom à la place d'une référence qui peut parfois s'avérer longue. Et dans le cas où la référence varie, le nom ne variant pas, son utilisation demeure pérenne.

Au cas particulier de ta liste, si tu mets comme référence de ta liste de validation =ListeFiltrée (ou un autre nom de ton choix, si tu en as donné un autre), les données de liste filtrée peuvent changer, la longueur de la liste peut varier, mais le même nom correspondra toujours à la liste actuelle...

Pour les noms (en mettre, en supprimer, voir...) tu vas sur l'onglet Formules. Presque au milieu du ruban tu as l'icône Gestionnaire de noms (pour l'ouvrir). Pour ajouter un nom : Nouveau dans le gestionnaire, ou la commande Définir un nom à côté de l'icône.

Pour qu'un nom recouvre une référence dynamique (c'est à dire qui peut varier) : on utilise une fonction qui permet à Excel de recalculer la plage à chaque fois.

=DECALER(CellSupérieureGauchePlage;;;NBVAL(ColonnePlageToujoursServie);NbCols'ilyalieu)

On indique comme référence de plage décalée la cellule supérieure gauche (toujours la 1re cellule permettant de référencer une plage dans Excel). Les 2 vides qui suivent (=0) indiquent qu'on ne décale pas cette cellule, ni en lignes, ni en colonnes. L'argument suivant évalue le nombre de lignes de la plage dans une colonne dont on est sûr qu'il n'y aura aucun "vide" avec NBVAL (si tu nommes une plage à partir de la ligne 2, la ligne 1 étant réservée aux intitulés de champs, il faudra diminuer de 1 la valeur renvoyée par NBVAL qui aura compté cet intitulé). Enfin le nombre de colonnes (qu'on peut omettre s'il n'y en a qu'une) qu'on peut faire varier de façon analogue.

Dans ta base, il est souhaitable aussi de la nommer. Au cas particulier je n'ai nommé que la colonne que tu utilisais. Mais tu peux la nommer en entier, ou y mettre plusieurs noms selon les parties les plus utilisées. On peut de toute façon à partir d'un nom accéder à toute partie de la plage, voire une seule cellule, avec un décalage approprié (mais il est souhaitable de nommer les parties que tu utilises le plus fréquemment pour un accès direct avec le seul nom...). Si ta base est finie et ne variera pas, tu le peux nommer en plage fixe, sinon la référence dynamique est généralement la meilleure solution.

La Macro. D'abord, une macro c'est du texte, qu'on appelle code parce que chaque ligne représente une instruction ou une commande à exécuter. L'exécuteur est un interpréteur de commande, qui va la lire, et faire ce qui est écrit. Pour qu'il puisse la trouver, elle doit figurer sur une feuille texte particulière (pour que l'interpréteur la trouve) appelée Module. S'agissant simplement de texte, on peut aisément le copier là où il est, pour aller le coller dans un Module.

Ces opérations se passent dans l'éditeur VBA. On y accède par l'onglet Développeur (qu'il faut activer le cas échéant car il ne l'est pas par défaut), icône Visual Basic tout à fait à gauche (le raccourci clavier Alt+F11 permet d'y accéder dans toutes les versions d'Excel).

Une fois rendue dans l'éditeur tu verras dans un volet Projet à gauche, mention de ton classeur (et éventuellement des autres classeurs ouverts) avec une liste en dessous des objets qui le composent (feuilles de calcul et classeur lui-même tant que tu n'y a pas adjoins d'autres éléments). Un double clic sur le nom d'une feuille ou sur ThisWorkbook (le classeur) ouvre un module, celui qui est propre à l'objet, dans lequel on programme ou on peut insérer des macros particulières, dites évènementielles, car elles se lancent automatiquement lors de la survenance d'évènements spécifiques dans l'objet concerné (par exemple ouverture ou fermeture du classeur, changement de valeur d'une cellule ou déplacement de la sélection dans une feuille, etc.).

Les macros ordinaires se placent dans des modules standards. Lorsqu'il n'y en a pas, il convient d'en insérer : menu Insertion > Module ou Clic droit dans le volet Projet en regard du classeur et Insertion > Module.

Ayant inséré un tel module, tu peux y écrire ou y coller une macro.

La macro peut y être collée et ne réclamera que peu d'adaptation si tu es dans la même configuration. Seuls les noms de plage peuvent changer, c'est toi qui décides des noms que tu mets, et il suffit donc de mettre les bons dans la macro.

Celle-ci ne comporte que 2 lignes de commande (le With... End With sert à ne pas répéter le nom de la plage qu'on met à jour, qui interviendrait sinon 3 fois dans la 1re ligne et 1 fois dans la 2e). La première ligne de commande efface la liste antérieure, sous condition qu'il y plus d'une ligne dans la plage, comme déjà vu. La deuxième copie la liste dans la base après filtrage en ne prenant en compte que les cellules visibles, pour la coller à l'emplacement de la liste. Donc à part les noms, le reste ne devrait pas varier.

Tu peux sûrement te débrouiller avec ça, mais n'hésite pas à venir poser la question si tu as un doute.

Cordialement

Ferrand


Si tu as copié le bouton, il faut ensuite lui attacher la macro dans le classeur.

Pour le reste, si tu as adapté la constitution des noms à ton classeur, vérifie que cela correspond bien.

Aussi : ton classeur (avec macro) devra être enregistré en .xlsm.

Et il faut que tes paramètres autorisent l'exécution des macros.

Re Ferrand Angélique le forum

voilà sans le bouton de mise à jour

a+

Papou

Ouh ! j'ai suivi toutes les infos mais j'ai toujours un message d'erreur :

"Erreur d’exécution 424"

Je crois que je me loupe sur l'histoire "de nommer la 1ere cellule A1 qui disparaît après", Je ne comprend pas bien le principe

Je joint le fichier de base ce sera plus simple...sachant qu'il me faudra faire la même manip pour les 4 onglets "Positions..."

Merci encore pour cette aide précieuse !


Avec le fichier c'est mieux


Fichier trop lourd ;-(

J'ai rêvé ton message sur l'erreur 424 ? Je ne le vois plus.

Il faut taper une lettre ou n'importe quoi dans la 1re cellule (A1 si c'est celle là), de façon qu'au démarrage la plage ne soit pas vide, et donc non définie et inexistante pour la macro.

Ensuite, tu n'as plus à t'en occuper, il y aura toujours quelque chose.


Je ne vois pas de fichier.

et bien j'ai écris quelquechose mais toujours erreur 424 ...


Le fichier est trop lourd, et étrangement, je supprime des onglets mais il fait toujours le même poids

J'ai la poisse aujourd'hui !

Alors il doit y avoir une autre erreur qui empêche l'identification.

Pour le fichier : http://www.cjoint.com et tu colles le lien dans prochain post.

Je ne sais pas ce qu'il y avait ! J'ai renommé la plage en Coord pour que ça finisse par marcher.

Rien d'anormal pourtant. Quelque chose dans la définition de la plage qu'on a pas vu ?

https://www.cjoint.com/c/EHrphA78Dby

Super ! Merci beaucoup !!!

Je n'ai plus qu'à démultiplier sur mes 4 onglets !!!

Bonne soirée !!

Bonjour,

Suite de la macro ....j'ai réussi sur 3 des 4 onglets

Curieusement, je fais exactement la même manip, et cela ne veut rien savoir pour le dernier ! J'ai supprimé les onglets, les noms dans "gestionnaire des noms" et tout refait.... le filtre fonctionne, mais au lieu d'afficher le contenu des cellules, cela affiche "#REF"...

en fait j'ai un affichage fantôme d'un 1/4 de seconde des bonnes cellules puis #REF.

J'ai comparé le format de cellules, c'est le même

Si quelqu'un a la solution, je suis preneuse !!!

Bonne journée !

Angélique

Bonjour,

Sub MajListeFiltrée()
    With [ListeFiltréeDLL]
        If .Rows.Count > 1 Then .Range(Cells(2, 1), Cells(.Rows.Count, 1)).ClearContents
        [CoordDLL].SpecialCells(xlCellTypeVisible).Copy
        .Cells(1, 1).PasteSpecial xlPasteValues
    End With
End Sub

Ce qui est curieux, c'est que cela n'ait pas le même effet pour les autres !

Cordialement

Ferrand

Parfait !

Ce qui est curieux, c'est que cela ai sauté dans la macro

Bref ! ça marche !!!

Merci encore !

Rechercher des sujets similaires à "validation donnees filtre"