Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Listes liées et saisie automatique
Sur une
base de données référençant des villes associées à des codes postaux, nous souhaitons proposer la construction de
listes déroulantes dépendantes . Pour plus d'efficacité, l'utilisateur doit pouvoir saisir seulement les premiers chiffres du code postal. Dès lors, une
liste déroulante doit s'auto-générer en lieu et place pour suggérer tous les codes postaux correspondants. A sélection, une seconde liste doit se remplir des villes attachées.
Et pour ce faire, il n'est pas question de produire des calculs intermédiaires de repérage. Ce sont une fois encore les
calculs matriciels , capables d'analyser les plages de données, qui doivent extraire et restituer ces informations à exploiter.
Source et présentation de la problématique
Pour mener cette étude, une base de données des communes est nécessaire. Nous proposons de la récupérer.
Le classeur de réception est composé de deux feuilles nommées respectivement
Saisie-Listes et
bdd . En cellule B4 de la
feuille Saisie-Listes , l'utilisateur doit donc saisir les premiers chiffres d'un code postal. Une
liste déroulante doit s'auto-générer pour lui permettre de préciser et terminer la saisie. Dès lors, une liste déroulante dépendante doit se remplir automatiquement en
cellule D4 . Elle doit offrir les villes associées au code postal désigné.
Entre les colonnes I et K, vous notez la présence de plages d'extraction. Elles doivent être nourries par les
formules matricielles pour l'extraction des codes postaux et des villes dépendant de la saisie inachevée en cellule B4.
Ces correspondances doivent être établies par rapport à une source de données. Il s'agit de la seconde feuille de ce classeur.
En bas de la fenêtre Excel , cliquer sur l'onglet bdd pour activer sa feuille,
De nombreuses villes de la région PACA (04, 05, 06, 13, 83 et 84) y sont référencées. Remarque importante, elles sont triées par ordre alphabétique croissant. Des codes postaux sont associés à ces villes. Beaucoup de villes appartiennent à un même département, reconnu par les deux premiers chiffres du code postal. De même, un même code postal, codé sur 5 chiffres, peut très bien référencer plusieurs villes.
Si vous déployez la
zone Nom en haut à gauche de la
feuille Excel , vous notez que les colonnes de ce tableau sont identifiées. Les codes postaux sont reconnus par une plage nommée
cp tandis que les villes sont repérées par une plage nommée
ville . Bien entendu, nous exploiterons ces noms dans la construction des
formules matricielles .
Saisie intuitive des codes postaux
Pour produire une
liste de choix capable d'émettre des suggestions en fonction des premiers caractères tapés, nous devons réaliser l'
extraction des codes postaux en colonne I. Cette
extraction doit se faire sans l'appui des calculs intermédiaires de repérage. Nous devons donc bâtir une
formule matricielle capable d'analyser récursivement l'ensemble des informations contenues dans les plages de cellules. Bien sûr, la
fonction Index est nécessaire. Mais pour repérer les lignes à regrouper des codes postaux concordants, nous devons exploiter la
fonction Grande.Valeur . Sa plage d'action est nécessairement conditionnelle. Elle doit vérifier que les premiers chiffres tapés correspondent aux premiers chiffres des codes postaux à extraire.
En bas de la fenêtre Excel, cliquer sur l'onglet Saisie-Listes pour revenir sur sa feuille,
Sélectionner la plage de cellules I4:I30 par exemple,
Ainsi, nous prévoyons une hauteur capable de restituer un assez grand nombre de données, en cas de saisie très peu aboutie.
Taper le symbole égal (=) pour initier la formule matricielle ,
Inscrire la fonction de gestion des anomalies suivie d'une parenthèse, soit : SiErreur( ,
Comme vous le savez, une fonction d'extraction répond par un message d'erreur en cas de recherche infructueuse. Nous devons gérer ces parasites pour ne pas les restituer.
Saisir la fonction d'extraction suivie d'une parenthèse, soit : Index( ,
Désigner les codes postaux de la base de données par le nom de plage, soit : cp ,
Ce sont bien les codes postaux concordants que nous souhaitons extraire. Donc la recherche doit être réalisée dans cette colonne.
Taper un point-virgule (;) pour passer dans l'argument des positions cherchées à trouver,
Inscrire la fonction des grandes valeurs suivie d'une parenthèse, soit : Grande.Valeur( ,
Saisir la fonction conditionnelle suivie d'une parenthèse, soit : Si( ,
Nous le disions, l'extraction des codes postaux à regrouper en fonction des lignes repérées est soumise à condition. Elle doit vérifier la correspondance avec les chiffres saisis par l'utilisateur. Et la longueur de ces caractères tapés varie. Ce critère doit donc être en mesure d'analyser les chaînes sur une séquence variable.
Taper la fonction pour extraire les premiers caractères d'une chaîne, soit : Gauche( ,
Désigner de nouveau la colonne des codes postaux par son nom, soit : cp ,
Nous sommes dans un
raisonnement matriciel . En guise de texte à tronquer, nous passons l'ensemble de la colonne à la
fonction Gauche . Notre
formule matricielle saura analyser chacun des CP Ã la recherche de correspondances. Encore faut-il aboutir le
critère .
Taper un point-virgule (;) pour passer dans l'argument de la longueur à analyser,
Inscrire la fonction comptant les caractères suivie d'une parenthèse, soit : NbCar( ,
Désigner le code postal saisi par l'utilisateur en cliquant sur sa cellule B4 ,
Fermer la parenthèse de la fonction NbCar ,
Fermer la parenthèse de la fonction Gauche ,
Taper le symbole égal (=) pour annoncer la condition à satisfaire,
Désigner de nouveau le code postal saisi par l'utilisateur en cliquant sur sa cellule B4 ,
Ainsi, quel que soit le nombre de chiffres tapés par l'utilisateur, le critère s'ajuste automatiquement. Dans ce
raisonnement matriciel et grâce aux
fonctions Gauche et
NbCar , l'analyse est effectuée sur la colonne des codes postaux à la recherche de ceux qui commencent par les mêmes chiffres saisis.
Taper un point-virgule (;) pour passer dans la branche Alors de la fonction Si ,
Saisir la fonction trouvant les positions en ligne, suivie d'une parenthèse, soit : Equiv( ,
En guise de valeur cherchée, désigner de nouveau la colonne des codes postaux, soit : cp ,
Taper un point-virgule (;) pour passer dans l'argument du tableau de recherche,
Désigner la même colonne, soit : cp , pour une recherche matricielle croisée,
Taper un point-virgule suivi du chiffre zéro, soit : ;0 , pour une recherche exacte,
La
fonction Equiv recherchant tous les codes postaux sur cette même plage des codes postaux est censée retourner les positions de toutes les concordances trouvées. Par défaut, chaque ligne concorde. Mais cette recherche est contrainte par le critère de la
fonction Si . Seules les positions pour lesquelles les CP débutent bien par les chiffres saisis seront repérés.
Fermer la parenthèse de la fonction Equiv ,
Puis, taper un point-virgule (;) pour passer dans la branche Sinon de la fonction Si ,
Inscrire deux guillemets ('') pour ignorer la valeur analysée en cas de non correspondance,
Ces guillemets vont se situer au milieu des résultats concordants. C'est tout l'intérêt de la
fonction Grande.Valeur . En guise de rang, nous allons lui passer une
matrice virtuelle de la même hauteur que la
base de données . Toutes les positions effectives et concordantes avec ces rangs seront extraites et regroupées.
Fermer la parenthèse de la fonction Si ,
Taper un point-virgule (;) pour passer dans l'argument du rang de la fonction Grande.Valeur ,
Inscrire la fonction donnant la ligne d'une cellule suivie d'une parenthèse, soit : Ligne( ,
En guise de cellule donc, nous allons lui passer une
matrice à construire. Dans ce
raisonnement matriciel , toutes les positions seront analysées sur la base d'un seul et même calcul.
Inscrire la fonction d'interprétation suivie d'une parenthèse, soit : Indirect( ,
Saisir le chiffre 1 suivi du symbole deux points entre guillemets, soit : '1:' ,
Nous définissons ainsi le point de départ de la
matrice virtuelle à interpréter, à partir de la première ligne soit la plus grande valeur pour les rangs à faire correspondre.
Ajouter le caractère de concaténation (&) pour annoncer la borne inférieure de la matrice ,
Saisir la fonction comptant les lignes d'un tableau, suivie d'une parenthèse, soit : Lignes( ,
Attention, cette fonction est le pluriel de son homologue Ligne.
Désigner de nouveau la plage des codes postaux par son nom, soit : cp ,
De fait, nous calibrons une
matrice virtuelle partant de la première ligne pour le rang le plus fort et s'étendant jusqu'à la dernière ligne de la base de données pour le rang potentiellement le plus faible.
Fermer la parenthèse de la fonction Lignes ,
Fermer la parenthèse de la fonction Indirect ,
Fermer la parenthèse de la fonction Ligne ,
Fermer la parenthèse de la fonction Grande.Valeur ,
Fermer la parenthèse de la fonction Index ,
La
matrice passée en premier paramètre de la
fonction Index ne représente qu'une seule colonne. De fait, il n'est pas nécessaire de renseigner le troisième argument de cette fonction. Il concerne précisément la position en colonne. La
fonction Index se dirigera naturellement sur cette unique rangée.
Taper un point-virgule (;) pour passer dans le deuxième argument de la fonction SiErreur ,
Inscrire deux guillemets ('') pour ignorer le retour en cas d'anomalie,
Fermer la parenthèse de la fonction SiErreur ,
Enfin, valider nécessairement la formule matricielle par le raccourci CTRL + MAJ + Entrée ,
En l'absence de donnée fournie en cellule B4, tous les codes postaux concordent et sont restitués.
En cellule B4, taper les trois premiers chiffres suivants : 837 ,
Nous désignons ainsi des codes postaux pour le département du Var mais dont la précision n'est pas complétée. A validation, vous remarquez que tous les codes postaux commençant précisément par ces trois chiffres sont extraits et regroupés, grâce à la
fonction Grande.Valeur .
La syntaxe de la formule matricielle que nous avons bâtie est la suivante :
=SIERREUR(INDEX(cp; GRANDE.VALEUR(SI(GAUCHE(cp; NBCAR(B4))=B4; EQUIV(cp; cp; 0); ''); LIGNE(INDIRECT('1:' & LIGNES(cp))))); '')
Liste déroulante intuitive
Nous devons maintenant exploiter ces extractions à la volée pour proposer une liste de suggestions intuitives en cellule B4. L'utilisateur n'aura plus qu'à la déployer pour cliquer sur le code postal complet, constitué des premiers chiffres inscrits, pour le valider. Mais le nombre de ces codes extraits varie selon la demande. En conséquence, la plage de cellules devant nourrir la
liste déroulante intuitive doit être dotée d'une hauteur variable pour s'adapter au contenu extrait. La technique, nous la connaissons bien désormais. Elle consiste premièrement à attribuer un nom à la première cellule de la plage d'extraction. Puis, elle consiste à retravailler ce nom avec la
fonction Decaler pour la rendre extensible en hauteur. Cette hauteur dépend du nombre de données extraites. Nous pouvons les comptabiliser notamment avec la
fonction Nb.Si .
Sélectionner le premier code extrait en cliquant sur sa cellule I4 ,
Dans la zone Nom en haut à gauche de la feuille, taper l'intitulé : ecp ,
Valider nécessairement ce nom par la touche Entrée pour qu'il soit pris en compte,
En haut de la fenêtre Excel , cliquer sur l'onglet Formules pour activer son ruban,
Dans la section Noms définis du ruban, cliquer sur le bouton Gestionnaire de noms ,
Dans la boîte de dialogue qui suit, cliquer sur le nom ecp pour le sélectionner,
En haut de la boîte de dialogue, cliquer sur le bouton Modifier ,
Dans la zone Fait référence à , adapter la syntaxe comme suit :
=Decaler('Saisie-Listes'!$I$4; 0; 0; Nb.Si('Saisie-Listes'!$I:$I; '>*<')-2)
Nous exploitons donc la
fonction Excel Decaler . En premier argument, nous lui passons le point de départ de la plage de cellules variable. Les deux arguments suivants sont figés à 0. En effet, par rapport à ce point de départ, nous ne souhaitons observer de décalage ni en ligne, ni en colonne. Le dernier argument est le plus précieux. C'est lui qui ajuste la hauteur de la plage en fonction de son contenu. Et ce contenu est dénombré grâce à la
fonction Nb.Si appliquée sur l'intégralité de la colonne I (
'Saisie-Listes'!$I:$I ). Le critère est spécifique (
'>*<' ). Il permet de comptabiliser toutes les cellules réellement non vides. En effet, certaines le sont en apparence mais portent un calcul. Elles doivent être ignorées. Nous retranchons enfin deux unités à ce décompte. Cette colonne propose deux titres qu'il faut exclure du comptage.
Valider l'expression en cliquant sur le bouton Ok,
Puis, fermer le gestionnaire de noms en cliquant sur le bouton Fermer ,
Maintenant, il s'agit de donner vie à cette
liste déroulante .
Cliquer sur la cellule B4 pour la sélectionner,
En haut de la fenêtre Excel , cliquer sur l'onglet Données pour activer son ruban,
Dans la section Outils de données du ruban, cliquer sur le bouton Validation des données ,
L'onglet Options de la boîte de dialogue doit être actif.
Dans la zone Autoriser, choisir Liste ,
Dans la zone source, établir la correspondance avec la plage variable, comme suit : =ecp ,
Un réglage est encore nécessaire. Nous souhaitons autoriser l'inscription des premiers chiffres des codes postaux. Or par défaut, une
liste déroulante n'autorise aucune saisie qui n'est pas contenue dans les valeurs de la liste. Nous devons
débrider cette liste de choix .
Cliquer sur l'onglet Alerte d'erreur de la boîte de dialogue,
Puis, décocher la case : Quand des données non valides sont tapées,
Valider ces réglages en cliquant sur le bouton Ok de la boîte de dialogue,
Il est temps de tester la fonction dynamique et auto-ajustable de cette
liste déroulante .
En cellule B4, taper les trois premiers chiffres d'un code postal, comme : 834 ,
Puis, cliquer sur la flèche de la liste déroulante pour la déployer,
A ce stade, vous notez la présence de doublons. Rien d'anormal pour l'instant. Rappelons-le, c'est une unique formule d'extraction qui produit ces résultats ajustés aux premiers caractères saisis. La vocation de la colonne CP Uniques est de purger ces redondances. Mais, nous nous en soucierons plus tard.
Extraire les villes d'un code postal
Désormais, pour produire l'extraction des villes associées au code postal validé dans la liste déroulante ou inscrit complètement, nous devons de nouveau nous passer des calculs de repérage intermédiaires. La
fonction Index est certes nécessaire. Et c'est la
fonction Petite.Valeur qui doit lui fournir les indices de lignes des villes concordantes. Dans un
raisonnement matriciel , elle a la capacité de regrouper ces données extraites. En effet, elles ne s'enfilent pas les unes derrière les autres dans la
base de données . Cette dernière est triée dans l'
ordre alphabétique croissant pour les villes et non pour les codes postaux.
Sélectionner une plage suffisante pour l'extraction des villes, par exemple K4:K30 ,
Taper le symbole égal (=) pour initier la formule matricielle ,
Inscrire la fonction pour gérer les anomalies, suivie d'une parenthèse, soit : SiErreur( ,
Saisir la fonction d'extraction suivie d'une parenthèse, soit : Index( ,
Désigner la colonne des villes de la base de données par son nom, soit : ville ,
Taper un point-virgule (;) pour passer dans l'argument de l'indice de ligne,
Comme vous le savez, en guise d'indice de ligne, nous allons lui passer tous les rangs potentiels correspondant aux villes repérées par le code postal. Et c'est toujours le raisonnement matriciel qui offre ces prouesses.
Inscrire la fonction des petites valeurs suivie d'une parenthèse, soit : Petite.Valeur( ,
Inscrire la fonction conditionnelle suivie d'une parenthèse, soit : Si( ,
En effet, la plage d'action pour extraire les villes associées, est soumise à condition. Elle dépend du code postal validé.
Désigner la plage des codes postaux par son nom, soit : cp ,
Taper le symbole égal (=) pour annoncer la condition à satisfaire,
Cliquer sur le code postal validé, soit sur la cellule B4 ,
Taper un point-virgule (;) pour passer dans la branche Alors de la fonction Si ,
Inscrire la fonction pour les lignes des valeurs cherchées, suivie d'une parenthèse, soit : Equiv( ,
Désigner la colonne des villes par son nom, soit : ville ,
Taper un point-virgule (;) pour passer dans l'argument du tableau de recherche,
Désigner de nouveau la colonne des villes par son nom, soit : ville ,
Ainsi, grâce au critère émis par la
fonction Si , nous cherchons toutes les
correspondances matricielles sur les villes. A chaque fois qu'une ville est effectivement repérée en regard du code postal saisi, la
fonction Equiv retourne la position en ligne de la ville à extraire. Et ce sont les rangs de la
fonction Petite.Valeur , à définir bientôt, qui permettront de les pointer et de les regrouper.
Taper un point-virgule suivi du chiffre zéro, soit : ;0 , pour une recherche exacte,
Fermer la parenthèse de la fonction Equiv ,
Taper un point-virgule (;) pour passer dans la branche Sinon de la fonction Si ,
Inscrire deux guillemets ('') pour ignorer la ville en cas de non concordance,
Fermer la parenthèse de la fonction Si ,
Taper un point-virgule (;) pour passer dans l'argument du rang pour la fonction Petite.Valeur ,
Saisir la fonction donnant la ligne d'une cellule suivie d'une parenthèse, soit : Ligne( ,
Inscrire la fonction d'interprétation de plages suivie d'une parenthèse, soit : Indirect( ,
En effet, nous allons construire une matrice de toutes pièces. Elle doit être interprétée pour faire référence à ces lignes en guise de rangs. En guise de cellule, ce sont toutes celles d'une
matrice virtuelle de même hauteur que la
base de données que nous allons lui passer. De cette manière, tous les rangs sans exception, seront considérés.
Saisir le chiffre 1 suivi du symbole deux points entre guillemets, soit : '1:' ,
Ainsi, nous renseignons le point de départ de la
matrice virtuelle . Elle débute à partir de la première ligne qui fait référence au premier rang à concorder avec la première position trouvée pour la ville correspondante.
Taper le caractère de concaténation pour annoncer la borne inférieure de la matrice ,
Inscrire la fonction comptant les lignes d'un tableau, suivie d'une parenthèse, soit : Lignes( ,
Attention, contrairement à son homologue, cette fonction doit être saisie au pluriel.
Désigner la colonne des codes postaux par son nom, soit : cp ,
Fermer la parenthèse de la fonction Lignes ,
Fermer la parenthèse de la fonction Indirect ,
Fermer la parenthèse de la fonction Ligne ,
Fermer la parenthèse de la fonction Petite.Valeur ,
Fermer la parenthèse de la fonction Index ,
En effet, le dernier argument de la
fonction Index n'est pas utile à renseigner. Il concerne l'indice de colonne pour l'extraction. Or, nous n'avons défini qu'une seule colonne pour la recherche, celle des villes. Donc, la fonction Index pointera naturellement dessus.
Taper un point-virgule (;) pour passer dans le second argument de la fonction SiErreur ,
Inscrire deux guillemets ('') pour garder le résultat vierge en cas d'anomalie,
Fermer la parenthèse de la fonction SiErreur ,
Enfin, valider nécessairement la formule matricielle par le raccourci CTRL + MAJ + Entrée ,
Aucun résultat n'apparaît pour l'instant. Rien de plus normal, nous n'avons encore validé aucun code postal.
Déployer la liste déroulante en cellule B4 ,
Puis, cliquer sur l'un des codes postaux proposés,
Cette fois, toutes les villes concordantes apparaissent. De plus, elles sont parfaitement regroupées et ce, grâce à une unique
formule matricielle . Sa syntaxe est la suivante :
{=SIERREUR(INDEX(ville; PETITE.VALEUR(SI(cp=B4; EQUIV(ville; ville; 0); ''); LIGNE(INDIRECT('1:' & LIGNES(cp))))); '')}
Il nous reste à créer la liste dynamique des villes associées aux codes postaux. Il suffit de répliquer les techniques précédentes.
Cliquer sur la cellule K4 pour la sélectionner,
Dans la zone Nom , en haut à gauche de la feuille, taper l'intitulé : eville ,
Valider ce nom par la touche Entrée du clavier pour qu'il soit pris en compte,
En haut de la fenêtre Excel, cliquer sur l'onglet Formules pour activer son ruban,
Dans la section Noms définis du ruban, cliquer sur le bouton Gestionnaire de noms ,
Dans la boîte de dialogue qui suit, cliquer sur le nom eville pour le sélectionner,
Dans la zone Fait référence à , adapter sa syntaxe comme suit :
=Decaler('Saisie-Listes'!$K$4; 0; 0; Nb.Si('Saisie-Listes'!$K:$K; '>*<')-1)
La syntaxe est identique à la précédente. Le décompte est cette fois réalisé sur la colonne K des villes. Comme cette dernière ne propose qu'un seul titre, nous ne retranchons qu'une unité à ce calcul.
Cliquer sur l'icône à la coche verte pour valider la syntaxe,
Puis, cliquer sur le bouton Fermer du gestionnaire de noms pour revenir sur la feuille Excel ,
Sélectionner la cellule D4 devant recevoir la liste déroulante dynamique ,
En haut de la fenêtre Excel, cliquer sur l'onglet Données pour activer son ruban,
Dans la section Outils de données du ruban, cliquer sur le bouton Validation des données ,
Dans la zone Autoriser de la boîte de dialogue qui suit, choisir Liste ,
Dans la zone Source, établir la correspondance avec la plage dynamique comme suit : =eville ,
Puis, cliquer sur le bouton Ok de la boîte de dialogue pour valider la liaison,
Cette fois, il n'est en effet pas nécessaire de débrider la liste déroulante dans la mesure où le choix de la ville est strict.
Désormais, si vous déployez la
liste déroulante des villes, seules celles qui sont attachées au code postal sélectionné en amont, sont proposées. Nous avons donc réussi à créer des
listes déroulantes dépendantes , sans calculs intermédiaires et ce, grâce aux
formules matricielles .
Eliminer les doublons de l'extraction
Une fois de plus, pour éliminer les doublons et extraire les valeurs uniques avec une seule formule, nous devons enclencher un
calcul matriciel . Et comme il s'agit d'une technique que nous avons démontrée et détaillée dans une formation récente, nous proposons de directement livrer la syntaxe. Nous allons exercer l'analyse sur une plage de cellules qui progresse en même temps que le calcul. Donc la présélection des résultats est à exclure.
Sélectionner la cellule J4 ,
Taper la formule suivante :
=SI(ESTNA(EQUIV(0; NB.SI(J$3:J3; ecp); 0)); ''; INDEX(ecp; EQUIV(0; NB.SI(J$3:J3; ecp); 0)))
La valider nécessairement par le raccourci clavier CTRL + MAJ + Entrée ,
Puis, tirer la poignée vers le bas jusqu'en ligne 30 par exemple,
Comme vous pouvez le voir, tous les doublons sont effectivement éradiqués. Le résultat est d'autant plus flagrant si vous tapez seulement les trois premiers chiffres d'un CP en B4, comme par exemple : 834.
La
fonction EstNa permet de tester si le calcul de repérage émet une erreur. Ce calcul de repérage est effectué par la
fonction Equiv . Mais pour renvoyer les positions, un dénombrement est réalisé grâce à la
fonction Nb.Si . Elle effectue son analyse sur la plage du calcul qui progresse en même temps que la formule est répliquée. Elle cherche à savoir si le code postal du précédent
calcul matriciel a déjà été extrait. Si une erreur est effectivement générée, la cellule est ignorée. Dans le cas contraire, l'extraction est engagée avec la
fonction Index selon le même protocole. La valeur 0 passée en premier paramètre de la
fonction Equiv est un booléen qui signifie Faux. Lorsqu'elle est confirmée par la
fonction Equiv , elle indique que le code postal n'a pas déjà été extrait car pas dénombré. Ensuite, il convient de rendre dynamique cette plage pour la liaison avec la
liste déroulante des codes postaux.
Il s'agit d'attribuer un intitulé à la cellule J4 : ecpu par exemple,
De retravailler cet intitulé depuis le gestionnaire de noms avec la fonction Decaler ,
=Decaler('Saisie-Listes'!$J$4; 0; 0; Nb.Si('Saisie-Listes'!$J:$J; '>*<')-1)
Puis, de modifier le lien de la liste déroulante en B4 : =ecpu ,
Dès lors, nous obtenons bien une liste déroulante suggérant les codes postaux uniques et correspondant aux premiers chiffres tapés par l'utilisateur.