formateur informatique

Liste déroulante Excel triée sans trous ni doublons

Accueil  >  Bureautique  >  Excel  >  Excel VBA  >  Liste déroulante Excel triée sans trous ni doublons
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
Sujets que vous pourriez aussi aimer :


Liste déroulante sans trous ni doublons

Certes, Excel offre des techniques pour créer des listes sans doublons, sans trous et de surcroît triées. Ces techniques ont d'ailleurs été rendues plus simples avec l'avènement d'Office 365 et la sortie de certaines de ses fonctions matricielles. Pourtant ici, nous proposons de résoudre le cas par le code VBA Excel, avec la plus grande simplicité, vous le constaterez.

Listes de données Excel triées, sans doublons et sans trous ou vides

Sur l'exemple illustré par la capture, nous travaillons à partir d'un tableau déstructuré. Il présente des lignes vides et des opérations réalisées par les commerciaux d'une entreprise. Ceux-ci peuvent intervenir à plusieurs reprises lorsqu'ils réalisent plusieurs ventes.

Au milieu de ces informations, si l'utilisateur inscrit une nouvelle opération pour un nouveau commercial, à validation, vous constatez que son nom est automatiquement intégré dans la liste de valeurs uniques sur la droite du tableau. De plus, il est parfaitement rangé à sa place dans la chronologie alphabétique. Enfin et un peu plus à droite, une liste adaptative se nourrit de ces informations dynamiques pour offrir à l'utilisateur tous les éléments disponibles, sans doublons ni trous et parfaitement ajustés.

Classeur Excel à télécharger
Pour monter cette solution VBA Excel, nous suggérons d'appuyer les travaux sur ce tableau déstructuré qui offre aussi certains atouts.
  • Télécharger le classeur liste-valeurs-uniques-triees.xlsm en cliquant sur ce lien,
  • Cliquer droit sur le fichier réceptionné,
  • En bas du menu contextuel, choisir l'option Propriétés,
  • En bas de la boîte de dialogue, cocher la case Débloquer et valider par Ok,
  • Puis, double cliquer sur le fichier déverrouillé pour l'ouvrir dans Excel,
Nous retrouvons le tableau des opérations entre les colonnes B et D. Il présente effectivement de nombreux trous. C'est donc sur la droite, en colonne F, que doit être reconstruite cette liste des noms triés, sans doublons et sans vides. Sur la droite encore, en cellule G4, une liste déroulante doit s'adapter à ce contenu importé, pour s'en nourrir. Et tout cela doit se réaliser automatiquement à validation d'une nouvelle saisie. C'est toute la magie du VBA Excel.

La source de la liste déroulante
Nous l'avons évoqué, pour que la liste déroulante se remplisse précisément des informations extraites, sans déborder donc, nous avons travaillé sa source de données avec la fonction Excel Decaler. Nous proposons de le constater.
  • Cliquer sur la cellule G4 pour la sélectionner,
  • Dans 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,
Bouton de ruban Excel pour construire une liste déroulante dynamique

Comme l'indique la zone Source de la boîte de dialogue, c'est bien la fonction Decaler qui est utilisée pour construire la source de données dynamique de cette liste déroulante :

=DECALER($F$4;;; NBVAL($F:$F)-1)

Son point de départ est la cellule F4 de la liste qui sera reconstituée par le code VBA Excel. Les deux arguments suivants du décalage en ligne et du décalage en colonne sont ignorés (;;;). Nous prélevons bien à partir de F4. C'est la hauteur qui nous intéresse. En effet, le nombre de commerciaux peut varier. Pour connaître leur nombre, nous engageons la fonction NbVal sur cette colonne F, afin de compter tous les éléments non vides qui s'y trouvent. Nous lui retranchons une unité (-1) pour ne pas considérer l'étiquette (Qui) en F3. C'est ainsi que nous obtenons la hauteur à considérer pour prélever les éléments et remplir cette liste déroulante.
  • Cliquer sur le bouton Annuler de la boîte de dialogue pour revenir sur la feuille Excel,
Vérifier la saisie en VBA
Pour déclencher l'exécution d'un code VBA à chaque fois qu'une nouvelle opération est renseignée dans le tableau à trous, nous devons créer une procédure événementielle capable de détecter cet événement de modification de cellule.
  • Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Excel,
  • Dans l'explorateur de projet, double cliquer sur l'élément Feuil1(valeursUniquesTriees),
Ainsi, nous affichons la feuille de code VBA associée à la feuille Excel, au centre de l'écran,
  • En haut de cette feuille de code, déployer la liste déroulante de gauche,
  • Dans les propositions, choisir l'objet Worksheet,
C'est ainsi que nous créons la procédure événementielle Worksheet_SelectionChange. Mais, nous ne souhaitons pas intervenir au changement de sélection sur la feuille mais au changement de valeur dans l'une des cellules de la colonne D.
  • Pour cela, en haut de la feuille de code, déployer la liste déroulante de droite,
  • Dans les propositions, choisir l'événement associé intitulé Change,
Procédure VBA Excel au changement de valeur dans une des cellules de la feuille

Cette fois, nous créons la procédure événementielle Worksheet_Change. C'est bien celle qui nous intéresse. Donc, la précédente peut être supprimée.

Contrôler la cellule modifiée
L'objet Target passé en paramètre de la procédure représente la cellule modifiée. C'est elle qui déclenche l'événement. Mais, nous devons nous assurer qu'il s'agit bien d'une modification entreprise sur la colonne D, celle des commerciaux. Ainsi, nous n'exécuterons pas inutilement le code VBA. Pour cela et nous en avons l'habitude, nous pouvons exploiter la fonction Intersect dans une instruction conditionnelle. Nous devons établir si l'intersection entre cette cellule et une plage de la colonne D, conduit bien à un résultat. ...
If Not Intersect([D4:D500], Target) Is Nothing Then

End If
...


Nous prévoyons large sur cette colonne D (D4:D500) pour considérer l'ajout potentiel de nouveaux commerciaux à la suite du tableau. Si l'intersection de cette plage avec la cellule modifiée n'est pas nulle (Not ... Is Nothing), nous en concluons qu'un commercial a bien été intégré dans une ligne d'opération. Dans ces conditions (Then), nous choisissons de poursuivre le traitement. Le cas échéant et implicitement, il est avorté.

Filtrer et trier les données
Maintenant, c'est la fonctionnalité Excel de filtre avancé que nous proposons de piloter par le code VBA pour extraire les noms des commerciaux sans doublons. Sur une plage de cellules, c'est la méthode AdvancedFilter qui permet d'exercer ces filtres particuliers. Concernant les tris, il s'agit de la méthode Sort.
  • Dans l'instruction conditionnelle, ajouter les deux lignes VBA suivantes :
...
[D3:D500].AdvancedFilter xlFilterCopy, , [F3], True
[F4:F500].Sort [F4]
...


Comme le veut cette fonctionnalité (AdvancedFilter), les étiquettes sources (D3) et de destination (F3) doivent avoir strictement le même nom. C'est le cas ici (Qui). C'est ainsi qu'Excel fait la correspondance pour réorganiser les données d'une plage à une autre. Avec le paramètre xlFilterCopy, nous réalisons la copie de la plage D3:D500 sur laquelle la méthode est appliquée. Nous ignorons le deuxième paramètre (,,) car nous n'avons aucun critère à émettre. En troisième argument, nous désignons le point de départ de la copie sur la cellule F3 pour établir la correspondance entre les étiquettes. En quatrième et dernier argument, avec le booléen True, nous demandons de réaliser une extraction sans doublons.

Et comme nous engageons un tri sur la plage résultante (que nous prévoyons large elle aussi : F4:F500) dans la foulée, nous réorganisons ces données uniques extraites dans l'ordre alphabétique croissant. Nous engageons la clé de tri sur la première donnée de cette rangée (F4).

Remarque : pour une solution sécurisée, il conviendrait de vérifier que la cellule saisie n'est pas numérique, car elle ferait planter le tri. Pour cela, il suffit d'exploiter la fonction VBA IsNumeric sur l'objet Target dans une instruction conditionnelle.
  • Enregistrer les modifications (CTRL + S) et basculer sur la feuille (ALT + Tab),
  • Sur une ligne vide, ajouter un montant en colonne C,
  • Enfoncer la touche Tab pour atteindre la cellule voisine en colonne D,
  • Dès lors, saisir un nouveau nom et valider par la touche Entrée du clavier,
Comme vous pouvez l'apprécier, il est automatiquement intégré et rangé dans la liste sans doublons en colonne F. Dans le même temps, il est naturellement intégré dans la liste déroulante, grâce à la fonction Decaler, utilisée en source de données. Il en va de même, si vous saisissez des opérations de nouveaux commerciaux. En revanche, si vous enregistrez une nouvelle vente pour un commercial déjà existant, il est ignoré, comme nous le souhaitions.

 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn