formateur informatique

Trier les tableaux par le code Visual Basic

Accueil  >  Bureautique  >  Excel  >  Excel VBA  >  Trier les tableaux par le code Visual Basic
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 :


Trier les tableaux en VBA Excel

Dans cette formation, nous allons apprendre à trier les données d'un tableau Excel par le code Visual Basic. L'intérêt est de pouvoir offrir dynamiquement, des organisations de données et des vues différentes. Comme nous le verrons dans la prochaine formation, consistant à créer le jeu du pendu sous Excel, l'intérêt est tout trouvé. Par un tri changeant de la source de données, nous proposerons les termes à retrouver, de façon aléatoire. Ainsi, d'une partie à une autre, le joueur sera testé sur de nouvelles questions.

Tableau Excel à trier par le code Visual Basic

Le tableau présenté par la capture ci-dessus est d'ailleurs la source de données pour ce jeu du pendu, sur le thème des anciens dessins animés.

Générer le code par une macro automatique
Comme toujours, pour reproduire toutes les manipulations nous proposons de récupérer le classeur d'origine. Vous notez l'extension xlsm de ce classeur afin de pouvoir gérer le code Visual Basic. La formation pour débuter la programmation en VBA Excel, nous avait appris à afficher le ruban développeur et à créer des macros automatiques, pour nous inspirer du code transcrit.

Nous souhaitons trier le tableau sur l'une de ses trois colonnes. Bien entendu, les autres colonnes doivent être liées dans le tri.
  • Cliquer sur l'onglet Développeur en haut de la fenêtre Excel pour afficher son ruban,
  • Sur la gauche, dans la section Code, cliquer sur le bouton Enregistrer une macro,
  • Dans la boîte de dialogue qui suit, nommer la macro : trier_tableau,
  • Puis, cliquer sur le bouton Ok,
A ce stade, Excel enregistre la moindre de nos actions afin de les transcrire en code VBA. Nous devons donc réaliser les manipulations strictement nécessaires. Pour être trié, un tableau doit d'abord être sélectionné.
  • Cliquer sur la première cellule du tableau, soit B2,
  • Tout en maintenant la touche MAJ (Shift) enfoncée, cliquer sur la dernière cellule, soit D42,
  • Puis, cliquer sur l'onglet Accueil en haut de la fenêtre Excel pour activer son ruban,
  • Dans la section Edition sur la droite du ruban, cliquer sur le bouton Trier et filtrer,
  • Dans la liste, choisir Tri personnalisé,
Tri avancé et personnalisé sur tableau Excel

Une boîte de dialogue apparaît. Comme en atteste la figure ci-dessus et la sélection recalibrée automatiquement, Excel a pris conscience de la présence d'une ligne d'entête, à ne pas intégrer dans le tri. Un tri sur la colonne dont le titre est Expression, soit la troisième colonne du tableau, est proposé. Nous allons conserver cette suggestion. Mais nous allons préférer un tri décroissant à un tri croissant.
  • Dans la liste déroulante de la section Ordre, choisir De Z à A, soit décroissant,
  • Valider ce choix en cliquant sur le bouton Ok,
Les données sont instantanément réorganisées selon un tri décroissant sur la colonne Expression. Comme nous le constatons, les deux autres colonnes du tableau sont liées dans cette réorganisation. En d'autres termes, la colonne expression n'a pas été triée indépendamment des colonnes Num et Définition. Le tri étant terminé, nous devons impérativement arrêter l'enregistrement de la macro. Nous pourrons ensuite consulter le code ainsi produit pour le comprendre, l'adapter et le faire évoluer.
  • Cliquer sur l'onglet Développeur en haut de la fenêtre pour activer son ruban,
  • Dans la section Code sur la gauche du ruban, cliquer sur le bouton Arrêter l'enregistrement,
La macro et son code Visual Basic existent désormais mais ne sont pas matérialisés. Nous allons établir la liaison à l'aide d'un bouton.
  • Dans la section Contrôles du ruban Développeur, cliquer sur le bouton Insérer,
  • Sélectionner le premier contrôle en haut à gauche de la liste, soit le bouton,
  • Puis, tracer un rectangle sur la feuille, à droite du tableau, pour le matérialiser,
  • Dans la boîte de dialogue qui surgit, sélectionner la macro trier_tableau,
  • Puis, cliquer sur Ok,
  • Modifier l'intitulé du bouton en : Trier le tableau,
  • Cliquer dans une cellule vide pour désélectionner le bouton,
A ce stade, si nous cliquons sur le bouton que nous venons de créer, rien de spectaculaire ne se produit. Le tableau est sélectionné par le code VBA attaché au bouton, mais son tri ne change pas. Tout cela est fort logique puisque la macro a pour but de trier décroissant le tableau sur la colonne Expression. Or, les données sont déjà ainsi triées.

Associer un code VBA de macro automatique à un bouton de feuille Excel

Modifier le code Visual Basic généré par une macro Excel
Nous devons en effet accéder au code VBA de la macro attachée au bouton. Nous pourrons ainsi le consulter et comprendre les méthodes employées afin d'essayer de l'adapter pour atteindre nos objectifs, à savoir enclencher des tris aléatoires.
  • Cliquer droit sur le bouton Trier le tableau,
  • Dans le menu contextuel, choisir Affecter une macro,
  • Dans la boîte de dialogue qui apparaît, cliquer sur le bouton Modifier,
Nous basculons ainsi dans l'éditeur de code Visual Basic, entre les bornes de la procédure trier_tableau, soit le code de la macro attachée au bouton. Si la bascule automatique dans l'éditeur VBA ne s'opère pas, vous pouvez réaliser le raccourci clavier ALT + F11.

Code Visual Basic Excel pour trier tableau généré automatiquement par Macro

Les deux premières instructions retranscrivent des actions réalisées à la souris pendant l'enregistrement de la macro. Il s'agit de la sélection de la cellule B2, et d'un défilement vertical (Scroll) pour atteindre les cellules du bas. Ces deux lignes sont inutiles.
  • Supprimer les deux instructions suivantes du code VBA :
Range('B2').Select
ActiveWindow.SmallScroll Down:=24


La troisième instruction en revanche est essentielle : Range('B2:D42').Select. Il s'agit de la sélection complète du tableau à trier. L'objet VBA Excel Range permet de désigner une plage de cellules passée en paramètre, soit B2:D42. Sa méthode Select comme son nom l'indique, permet de sélectionner la plage de cellules désignée par l'objet Range.

La quatrième instruction retranscrit de nouveau un défilement réalisé à la souris où à l'aide de l'ascenseur vertical. Elle n'est donc pas utile.
  • Supprimer l'instruction suivante du code VBA :
ActiveWindow.SmallScrollDown:=-48

Puis vient une ligne de code particulière :

ActiveWorkbook.Worksheets('Mots').Sort.SortFields.Clear

La méthode Clear permet de supprimer tous les objets SortFields stockés. Il s'agit des préférences de tris mémorisés. Comme nous débutons un nouveau tri, il convient en effet de les supprimer d'abord. Donc nous conservons cette instruction.

L'instruction qui suit est fondamentale :

ActiveWorkbook.Worksheets('Mots').Sort.SortFields.AddKey := Range('D3:D42'), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal

C'est elle qui définit sur quelle colonne et dans quel ordre est effectué le tri, grâce à la méthode Add de la collection SortFields. Cette méthode propose un grand nombre d'arguments dont la colonne de tri : Key := Range('D3:D42'). La colonne D est bien la colonne des expressions. Notez l'absence de la ligne 2 exclue du tri, puisqu'il s'agit du titre de la colonne. On y trouve aussi l'indication sur l'ordre du tri : Order:=xlDescending. Il est bien décroissant comme nous l'avions paramétré.

Le bloc With qui suit est lui aussi fondamental. C'est lui qui indique, entre autres, quelles sont les colonnes liées dans le tri, grâce à la méthode SetRange :.SetRange Range('B2:D42'). Tout le tableau est ainsi concerné par la réorganisation pour laquelle le tri est défini sur la colonne D.

With ActiveWorkbook.Worksheets('Mots').Sort
.SetRange Range('B2:D42')
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With


Un bloc With, comme nous l'avions appris dans la formation pour débuter la programmation sous Excel, permet d'énumérer les méthodes et propriétés d'un objet VBA, afin d'optimiser les lignes de code. La propriété Header notamment (.Header = xlYes) confirme bien la présence d'entêtes à ne pas inclure dans le tri. La propriété MatchCase (.MatchCase = False) ainsi réglée, permet d'ignorer les différences de casse (Majuscules-Minuscules), dans le tri. L'emploi de SortMethod concerne les langues asiatiques. Il est inutile pour nous.
  • Dans le bloc With, supprimer l'instruction suivante :
.SortMethod= xlPinYin

Enfin, la méthode Apply permet d'appliquer le tri sur le tableau, selon tous les paramètres définis en amont.

Nous allons tester les effets d'une petite modification dans le code VBA sur le résultat du tri du tableau sur la feuille Excel. L'instruction concernée est celle située avant le bloc With, permettant de définir la colonne et l'ordre de tri.
  • Modifier le paramètre Key:=Range('D3:D42'), par : Key:=Range('C3:C42'),
  • De même, modifier le paramètre Order:=xlDescending par : Order:=xlAscending,
  • Enregistrer les modifications (CTRL + S),
Ainsi, en même temps que nous changeons la colonne de tri qui devient la colonne C des définitions, nous changeons son ordre qui devient croissant.
  • Basculer sur la feuille Excel (ALT + F11),
  • Cliquer dans une cellule vide pour désélectionner le bouton,
  • Et enfin, cliquer sur le bouton Trier le tableau,
Changer ordre et colonne de tri de tableau Excel par code VBA

Les modifications imposées par le code VBA se visualisent aussitôt. Le tableau est désormais trié croissant sur la colonne C des définitions. De plus, toutes les autres colonnes restent liées dans le tri, grâce aux instructions du bloc With. En revanche, la sélection complète du tableau est conservée active à l'issue du traitement, ce qui apparaît disgracieux. Pour pallier le défaut, il suffit d'ajouter à la fin du code, une instruction permettant d'activer une cellule isolée, la cellule A1 par exemple.
  • Basculer dans l'éditeur de code VBA,
  • A la fin de la procédure, avant le End Sub, ajouter la ligne suivante :
Range('A1').Select

L'instruction est triviale. Comme toujours, l'objet Range permet de pointer sur la cellule dont la référence est passée en paramètre. Sa méthode Select permet d'activer sa cellule. Si vous cliquez de nouveau sur le bouton de la feuille Excel, vous remarquez que la sélection du tableau est bien désactivée à la fin du tri.

Trier les données aléatoirement
Comme nous l'avons évoqué au début de ce support, les raisons et intérêts de trier un tableau au hasard, sont multiples. Dans notre cas, il s'agit d'une préparation de l'application du jeu du pendu que nous souhaitons développer sous Excel. Nous souhaitons que les mots à trouver, soient dévoilés aléatoirement au joueur.

Nous pouvons faire varier le tri sur trois colonnes et pour chacune d'entre elles, modifier l'ordre, croissant ou décroissant. 6 possibilités de tris s'offrent à nous. Nous proposons donc de générer un nombre aléatoire entier, compris entre les chiffres 1 et 6. Ainsi, selon la valeur retournée, un tri correspondant sera enclenché. Dans la formation précédente, nous avons d'ailleurs appris à générer un nombre aléatoire entier, compris entre une valeur minimum et une valeur maximum, grâce à la fonction VBA Rnd. En s'instruisant de l'aide en ligne, nous apprenons la syntaxe suivante :

Int((upperbound - lowerbound + 1) * Rnd + lowerbound)

Upperbound représente la plus grande valeur (6 dans notre cas) tandis que lowerbound représente la plus petite (1 dans notre cas). Une fois les opérations faites, nous en déduisons que le calcul suivant : nb_alea = (6 * Rnd + 1), doit retourner un nombre entier aléatoire compris entre 1 et 6 inclus. La fonction VBA Int permet de retourner la partie entière du nombre qui lui est passé en paramètre. Ce nombre aléatoire doit être manipulé pour enclencher les tris. Pour cela, il doit d'abord être stocké dans une variable à déclarer.
  • Basculer dans l'éditeur de code VBA (ALT + F11),
  • En début de procédure, avant toute ligne de code, ajouter les instructions suivantes :
Dim nb_alea As Byte

nb_alea = (6 * Rnd + 1)
MsgBox nb_alea


Nous déclarons tout d'abord la variable nb_alea comme un entier court (Byte). Le Byte permet de stocker une valeur comprise entre 0 et 255, soit largement au-dessus des capacités nécessaires pour envisager 6 déclinaisons de tris. Puis, nous affectons cette variable à la valeur générée par la syntaxe permettant de produire un entier aléatoire. La fonction MsgBox qui suit est temporaire. Elle permet de réaliser un petit contrôle afin de nous assurer que le nombre est bien borné tel que nous le souhaitons.
  • Enregistrer les modifications et basculer sur la feuille Excel,
  • Cliquer sur le bouton Trier le tableau,
Une boîte de dialogue, commandée par la fonction VBA MsgBox apparaît. Elle affiche bien un nombre entier compris entre 1 et 6. Si nous validons cette boîte de message et réitérons l'opération, nous obtenons quasi-systématiquement un nombre différent, toujours entier et toujours compris entre les bornes définies dans le code VBA.

Produire et afficher un nombre aléatoire en VBA Excel compris entre deux valeurs entières
  • Revenir dans l'éditeur de code Visual Basic,
  • Supprimer la ligne du MsgBox,
Il s'agit désormais d'exploiter cette valeur issue du hasard, pour générer des tris aléatoires. C'est l'instruction VBA sur la colonne et l'ordre detri, avant le bloc With que nous devons adaptée selon le cas. Et ces cas peuvent s'énumérer facilement grâce à l'instruction VBA Select Case.
  • Remplacer l'instruction de tri située avant le bloc With par le code suivant :
Select Case nb_alea
Case 1: ActiveWorkbook.Worksheets('Mots').Sort.SortFields.Add Key:=Range('C3:C42'), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
Case 2: ActiveWorkbook.Worksheets('Mots').Sort.SortFields.Add Key:=Range('C3:C42'), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
Case 3: ActiveWorkbook.Worksheets('Mots').Sort.SortFields.Add Key:=Range('D3:D42'), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
Case 4: ActiveWorkbook.Worksheets('Mots').Sort.SortFields.Add Key:=Range('D3:D42'), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
Case 5: ActiveWorkbook.Worksheets('Mots').Sort.SortFields.Add Key:=Range('B3:B42'), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
Case 6: ActiveWorkbook.Worksheets('Mots').Sort.SortFields.Add Key:=Range('B3:B42'), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
End Select


Selon chaque cas (Case), nous faisons varier le tri soit sur la colonne, soit sur l'ordre.
  • Enregistrer les modifications et basculer sur la feuille Excel,
  • Cliquer plusieurs fois de suite sur le bouton Trier le tableau,
Comme nous le constatons, à chaque clic, selon la valeur générée aléatoirement, le tri sur le tableau change, grâce à l'instruction Select Case et l'adaptation des paramètres de tris. Le code complet de la procédure que nous avons ainsi générée est le suivant :

Sub trier_tableau()
Dim nb_alea As Byte

nb_alea = (6 * Rnd + 1)

Range('B2:D42').Select
ActiveWorkbook.Worksheets('Mots').Sort.SortFields.Clear

Select Case nb_alea
Case 1: ActiveWorkbook.Worksheets('Mots').Sort.SortFields.Add Key:=Range('C3:C42'), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
Case 2: ActiveWorkbook.Worksheets('Mots').Sort.SortFields.Add Key:=Range('C3:C42'), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
Case 3: ActiveWorkbook.Worksheets('Mots').Sort.SortFields.Add Key:=Range('D3:D42'), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
Case 4: ActiveWorkbook.Worksheets('Mots').Sort.SortFields.Add Key:=Range('D3:D42'), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
Case 5: ActiveWorkbook.Worksheets('Mots').Sort.SortFields.Add Key:=Range('B3:B42'), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
Case 6: ActiveWorkbook.Worksheets('Mots').Sort.SortFields.Add Key:=Range('B3:B42'), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
End Select

With ActiveWorkbook.Worksheets('Mots').Sort
.SetRange Range('B2:D42')
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.Apply
End With

Range('A1').Select
End Sub


 
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