formateur informatique

Trier dans les catégories en gardant l'ordre des titres

Accueil  >  Bureautique  >  Excel  >  Excel VBA  >  Trier dans les catégories en gardant l'ordre des titres
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    Vidos astuces Instagram
Sujets que vous pourriez aussi aimer :


Trier par groupes

Nous avons déjà appris quelques techniques pour trier les données Excel de différentes façons. Ici, l'objectif est plus subtil. Il s'agit de trier les données à l'intérieur de chaque catégorie sans réorganiser ces dernières, bien qu'elles soient placées dans une même colonne.



Sur l'exemple illustré par la capture, nous travaillons à partir d'un tableau relatant des modèles de véhicules qui sont tous listés pas marque. Mais dans chacune de ces marques, l'organisation n'est pas cohérente et ne simplifie pas la lecture. Cependant, lorsque l'utilisateur clique sur le bouton Trier, tous les modèles sont réorganisés alphabétiquement à l'intérieur de leur catégorie, sans que l'ordonnancement de ces dernières ne change.

Ce développement est d'autant plus intéressant que cette spécificité serait fastidieuse à mettre en place avec les fonctionnalités naturelles d'Excel, à plus forte raison si les catégories sont nombreuses.

Classeur Excel à télécharger
Nous proposons de travailler à partir d'un classeur dans lequel des données sont présentées par catégorie.
  • Télécharger le classeur trier-dans-les-entetes.xlsm en cliquant sur ce lien,
  • Cliquer droit sur le fichier réceptionné,
  • En bas du menu contextuel, choisir la commande 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 pour l'ouvrir dans Excel,
Nous retrouvons les modèles de véhicules rangés dans leur catégorie avec leur prix. Mais à l'intérieur de chaque catégorie, les informations ne sont pas organisées alphabétiquement. Les entêtes des catégories quant à eux, se différencient des autres données par un fond plus sombre mais surtout par un style gras. C'est ce changement de style que nous exploiterons dans le code VBA, pour différencier les sections à organiser indépendamment.

Au clic sur le bouton
Sur la droite du tableau, vous notez la présence d'un bouton. C'est au clic sur ce dernier que la réorganisation par groupe, doit s'opérer. Il est déjà attaché à une procédure et nous proposons de le constater.
  • Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Excel,
Vous devez y constater la présence de la procédure trierParGroupes. Si ce n'est pas le cas, dans l'explorateur de projet sur la gauche, vous devez cliquer sur l'élément Module1.

Les variables
C'est un traitement doublement récursif que nous devons entreprendre. Une première boucle doit parcourir toutes les cellules de la première colonne. A l'intérieur de cette boucle, une autre doit poursuivre son traitement tant qu'aucun style gras n'est détecté. C'est ainsi que nous saurons que les modèles appartiennent à la même marque et que nous connaîtrons les bornes des plages à trier. Pour cela, nous avons tout d'abord besoin d'un jeu de variables.
  • Dans les bornes de la procédure, ajouter les déclarations et affectations suivantes :
...
Dim i As Integer
Dim debut As Byte: Dim fin As Byte
Dim feuille As Worksheet

Set feuille = Worksheets("trierGroupes")
i = 4
...


Nous déclarons les trois premières variables comme des entiers (Integer et Byte). La première (i) doit suivre le traitement de la première boucle, au fil des cellules parcourues. Les deux suivantes (debut et fin) doivent permettre de mémoriser les bornes de chaque catégorie, pour organiser les tris indépendants. La dernière est un objet de type feuille (Worksheet). Son rôle est de prendre possession de la feuille sur laquelle les données doivent être réorganisées. En cas de multiples feuilles sur le classeur, étant donné que nous codons depuis un module indépendant, elle permettra d'éviter toute ambiguïté.

D'ailleurs et dans l'enchaînement, nous initialisons (Set) l'objet feuille sur la feuille trierGroupes. Puis, nous calons le compteur de la boucle parent sur la première ligne du tableau à étudier, la ligne 4.

Parcourir le tableau
Les variables étant déclarées et initialisées, il est temps d'enclencher la boucle devant parcourir toutes les cellules du tableau, donc tant qu'aucune cellule vide n'a été détectée. En effet, c'est le test que nous devons exécuter puisque nous ne connaissons pas la borne de fin. C'est donc une boucle While qui est à l'honneur.
  • A la suite du code, créer la boucle suivante :
...
Do While feuille.Cells(i, 3).Value <> ""

i = i + 1
Loop
MsgBox i
...


A partir de la colonne C (3) et de la ligne 4, nous entamons un traitement récursif tant que la cellule en cours d'analyse héberge bien un contenu (Cells(i, 3).Value <> ""). Bien sûr, pour déplacer l'étude sur la ligne du dessous, à chaque passage dans la boucle, nous incrémentons la variable de boucle (i = i + 1). A l'issue et à titre de vérification, nous affichons le résultat à l'écran, grâce à la fonction MsgBox.

Maintenant, si vous cliquez sur le bouton de la feuille Excel, vous obtenez une réponse convaincante. La ligne 22 est ene ffet la première ligne vide après le tableau.

Détecter la borne inférieure du tableau en VBA Excel

Les bornes des catégories
Au premier passage dans cette boucle, nous sommes placés sur le point de départ de la première catégorie. Nous devons analyser les cellules tour à tour, par le biais d'une seconde boucle, tant qu'un style gras n'est pas détecté. Ainsi, nous connaîtrons la borne de fin de la première plage à trier. Au prochain passage dans la boucle parent, nous serons naturellement propulsés dans les données de la catégorie suivante. Ces processus itératifs imbriqués, vont nous permettre de déceler la longueur de toutes les plages à trier indépendamment, soit dans leur propre catégorie.
  • Inscrire une apostrophe (') devant le Msgbox pour le passer en commentaire,
  • Dans la première boucle, créer la seconde boucle suivante :
...
Do While feuille.Cells(i, 3).Value <> ""
debut = i
Do While feuille.Cells(i, 3).Font.Bold = False And feuille.Cells(i, 3).Value <> ""
i = i + 1
Loop
fin = i - 1

i = i + 1
Loop
...


Tout d'abord, nous prélevons le point de départ de la plage à trier (debut = i). Nous allons le comprendre très vite, à chaque passage dans cette boucle, la variable i va être incrémentée à plusieurs reprises de sorte qu'à chaque nouveau passage dans la boucle parent, l'indice soit calé sur la première ligne de la nouvelle catégorie. Ensuite, nous enclenchons une nouvelle boucle vérifiant que la cellule en cours d'analyse n'est pas en gras (Font.Bold = False), et dans le même temps, qu'elle n'est pas vide (Value <> ""), cela va de soi. Lorsque ce double test est vérifié, nous incrémentons simplement la variable i de la boucle parent. De fait, lorsque cette seconde boucle prend fin, nous sommes calés sur une cellule en gras, soit sur une marque. Nous prélevons donc la borne de fin de la plage à trier (fin = i - 1). Nous venons de sortir du groupe, donc nous sommes placés sur le nouveau titre, c'est pourquoi nous retranchons une unité. Et comme la variable i de la boucle parent est incrémentée avant d'entamer le nouveau passage, le curseur (debut = i), est directement placé sur les données de la catégorie suivante. C'est ainsi, dans ce processus doublement récursif, que toutes les informations des groupes sont analysées indépendamment.

Trier les données par catégorie
Mais pour que ces bornes (debut et fin) puissent être exploitées avant d'être réinitialisées, après la seconde boucle et avant le prochain passage de la boucle parent, un tri doit être exercé sur ces limites détectées pour ordonner les informations dans la catégorie étudiée.
  • Dans la boucle parent, avant l'incrémentation de la variable i, ajouter ces instructions VBA :
...
Do While feuille.Cells(i, 3).Value <> ""
debut = i
Do While feuille.Cells(i, 3).Font.Bold = False And feuille.Cells(i, 3).Value <> ""
i = i + 1
Loop
fin = i - 1

feuille.Sort.SortFields.Clear
feuille.Sort.SortFields.Add feuille.Range("C" & debut & ":C" & fin)
With feuille.Sort
.SetRange feuille.Range("C" & debut & ":D" & fin)
.Header = xlNo
.Apply
End With


i = i + 1
Loop
...


Nous commençons par effacer (Clear) les préférences d'un précédent potentiel tri. Grâce à la collection SortFields et sa méthode Add exercée sur la méthode Sort de la feuille, nous définissons la clé de tri pour la catégorie en cours, entre les bornes de début et de fin (feuille.Range("C" & debut & ":C" & fin)). Dans ce contexte et nous le verrons, c'est la colonne C qui décide et la colonne D suivra. Ensuite, nous engageons un bloc With pour ne pas répéter à plusieurs reprises l'objet feuille et sa méthode Sort. Grâce à la méthode SetRange, nous définissons la plage à trier entre les colonnes C et D selon les bornes de début et de fin, pour les lignes. En réglant la propriété Header à xlNo, nous indiquons qu'il n'y a pas d'entête à considérer. Enfin, avec la méthode Apply, nous engageons les tris récursifs sur les catégories, selon ces préférences dynamiques.

Le code VBA est déjà terminé. Mais avant de le tester, il nous reste un dernier réglage opportun à opérer. Au fil de l'analyse, le curseur de l'affichage va se déplacer avec les cellules pour finir sur la première ligne vide située après le tableau. Pour apprécier le résultat des tris ordonnés par catégories, il convient de remonter l'affichage en haut de la feuille. Pour cela, il suffit simplement de sélectionner une cellule de la première ligne par le code VBA.
  • Après la boucle parent, ajouter l'instruction suivante :
...
Loop
'MsgBox i
Range("A1").Select
End Sub
...


Trier les données dans les catégories par le code VBA Excel

Maintenant, si vous revenez sur la feuille Excel et que vous cliquez sur le bouton Trier, vous avez le plaisir de constater que toutes les données sont réorganisées alphabétiquement dans leur catégorie, sans que les catégories elles-mêmes ne soient impactées.

 
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