Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
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.
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
...
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.