Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Colorier une ligne sur deux
Dans les pas de l'
astuce VBA Excel précédente, nous souhaitons ajouter une autre fonctionnalité intéressante au tableur, si toutefois vous choisissez d'enregistrer son code dans le modèle (Le Personal.xlsb). Un clic sur un bouton doit automatiquement
colorier une ligne sur deux dans un tableau présélectionné. L'objectif est de simplifier la lecture et l'interprétation des
tableaux longs .
Classeur Excel à télécharger
Pour développer ce nouvel outil, nous suggérons d'appuyer l'étude sur un
classeur offrant un
tableau long , donc dédié.
Nous découvrons un tableau recensant des activités de sorties. Il est fait de cinq colonnes et de plusieurs centaines de lignes. Sur la droite de ce tableau, vous notez la présence d'un
bouton ActiveX intitulé
Colorier .
Ce
bouton est déjà associé à une
procédure de code mais elle est encore vide pour l'instant ou presque, et nous allons vite nous en rendre compte.
La procédure attachée au bouton
Pour terminer la présentation, nous proposons d'atteindre cette procédure attachée à ce bouton.
Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Excel ,
Nous affichons ainsi la feuille de code VBA associée à la feuille de ce classeur. Nous y découvrons la présence de la
procédure colorier_Click . Effectivement, elle n'est pas tout à fait vide.
Private Sub colorier_Click()
'.Interior.ThemeColor = xlThemeColorAccent6
'.Interior.TintAndShade = 0.799981688894314
'.Font.ThemeColor = xlThemeColorAccent6
'.Font.TintAndShade = -0.249977111117893
End Sub
Quelques lignes sont en commentaires puisqu'elles sont préfixées d'une apostrophe. Elles sont issues d'une
macro automatique pour attribuer une couleur de fond et une couleur de police personnalisées aux cellules, ici en l'occurrence aux cellules des lignes intercalées. Comme les suites de chiffres sont complexes à reproduire, nous jugeons pertinent de livrer un code lui-même offert par Excel.
Les variables VBA
Il est temps de mettre les mains dans le
code VBA . Et comme il est de coutume, nous devons commencer par
déclarer les variables utiles au développement. Elles sont au nombre de deux. La première doit piloter le tableau sélectionné par l'utilisateur avant son clic sur le bouton. La seconde doit permettre de parcourir ses lignes.
Dans la procédure, avant les commentaires, ajouter les déclarations et l'affectation suivante :
...
Dim tableau As Range: Dim ligne As Range
Set tableau = Selection
...
Nous créons
deux objets de type Range (tableau et ligne) pour représenter des plages ou à défaut une seule ligne ou encore une seule cellule. Grâce à l'
objet VBA Selection , nous initialisons (Set) le premier objet sur la sélection, donc sur le tableau sur lequel il est question de formater une ligne sur deux.
Parcourir chaque ligne du tableau
Maintenant que le tableau est matérialisé, nous pouvons engager une
boucle For Each pour parcourir chacune de ses lignes. Nous le verrons, l'idée sera de déceler les
lignes paires et les
lignes impaires pour savoir quelles sont celles à faire ressortir une fois sur deux. A ce titre, le
VBA propose l'
opérateur Mod qui s'exploite un peu comme la fonction du même nom dans
Excel . Il réalise la division entre deux nombres (Ici, l'indice de ligne par le chiffre 2). Il indique s'il existe un reste à cette division. Si tel est le cas, nous saurons qu'il s'agit d'une ligne impaire.
A la suite du code, ajouter les lignes VBA suivantes :
...
If tableau.Rows.Count > 5 Then
For Each ligne In tableau.Rows
Next ligne
Else
MsgBox "Vous devez sélectionner toutes les cellules (CTRL + A) du tableau à formater.", vbInformation
End If
...
Nous engageons tout d'abord un test sur le
nombre de lignes que compte le tableau sélectionné. Arbitrairement mais judicieusement, s'il n'offre pas plus de cinq lignes (tableau.Rows.Count > 5), nous jugeons que le traitement n'en vaut pas la peine. Nous l'avortons (else) et nous en informons l'utilisateur par le biais d'une
boîte de dialogue grâce à la
fonction VBA MsgBox .
Lorsque le critère est honoré en revanche, nous engageons une
boucle parcourant
chaque ligne (For Each ligne) du tableau (In tableau.Rows).
Détecter les lignes impaires
Grâce à cette
boucle , nous allons maintenant pouvoir analyser l'indice de chaque ligne parcourue. S'il s'agit d'une
ligne impaire et qu'il ne s'agit pas de la
ligne d'entête , celle des titres de colonnes, nous devons la formater. Dans le cas contraire, nous ne devons pas la transformer. Et comme nous l'annoncions précédemment, nous devons engager l'
opérateur VBA Mod pour réaliser la division par 2 sur l'indice de la ligne en cours. Si un reste est retourné, nous saurons qu'il s'agit d'une ligne impaire et nous pourrons agir en conséquence.
Dans la boucle For Each, ajouter le code VBA suivant :
...
If ligne.Row Mod 2 = 1 And ligne.Row <> tableau.Cells(1, 1).Row Then
With ligne
End With
End If
...
Nous engageons donc un
double test dans une
instruction conditionnelle . Nous vérifions tout d'abord qu'il existe un
reste à la division du
numéro de la ligne en cours d'analyse par le
chiffre 2 , signifiant qu'il s'agit d'une
ligne impaire . Dans le même temps, nous nous assurons que cette ligne n'est pas la
ligne d'entête du tableau . Elle doit garder sa mise en forme. Pour cela, nous exploitons une astuce découverte lors du volet précédent en appliquant l'
objet Cells sur la
plage de cellules représentant le tableau. De cette manière, nous pointons relativement sur ses cellules. Dans ce contexte, l'objet Cells(1, 1), ne désigne pas la cellule de la première ligne et de la première colonne de la feuille. Il pointe sur la première cellule du tableau. Nous exploitons alors la
propriété Row sur cette cellule pour la comparer à la
ligne en cours d'analyse par la boucle.
Enfin et lorsque ces conditions sont honorées ensemble (And), nous engageons la construction d'un
bloc With sur l'objet représentant la
ligne en cours . De cette manière et comme vous le savez, sans répéter le nom de l'objet, nous allons pouvoir lister ses attributs à régler.
Mise en forme des lignes impaires
Maintenant que les
lignes impaires sont décelées, il ne nous reste plus qu'à coller les réglages actuellement en commentaires dans le
bloc With . Nous changerons ainsi l'aspect de ces lignes pour les différencier des
lignes paires avec des teintes de vert.
Sélectionner le bloc des instructions en commentaires,
Dans la barre d'outils en haut de l'éditeur, cliquer sur le bouton Ne pas commenter ce bloc ,
Vous pouvez aussi retirer les apostrophes en préfixes manuellement.
Couper ces lignes (CTRL + X) puis les coller (CTRL + V) dans le bloc With ,
Il est maintenant temps de tester le fonctionnement de ce code.
Enregistrer les modifications (CTRL + S) et basculer sur la feuille (ALT + Tab),
Cliquer dans l'une des cellules du tableau, par exemple D8 ,
Puis, réaliser le raccourci clavier CTRL + A pour le sélectionner complètement,
Dès lors, cliquer sur le bouton Colorier ,
Instantanément et comme vous pouvez l'apprécier,
toutes les lignes impaires à l'exception de la ligne d'entête, se parent d'une couleur verte pour produire une
alternance simplifiant considérablement le repérage dans ce tableau dense.
Une fois encore, si vous collez ce code dans un module du modèle (Personal.xlsb) et que vous l'associez à un bouton dans un ruban personnalisé, cet outil sera disponible pour produire ces alternances sur n'importe quel tableau de n'importe quel classeur Excel.
Et le code VBA que nous avons bâti pour un résultat utile et efficace reste relativement simple :
Private Sub colorier_Click()
Dim tableau As Range: Dim ligne As Range
Set tableau = Selection
If tableau.Rows.Count > 5 Then
For Each ligne In tableau.Rows
If ligne.Row Mod 2 = 1 And ligne.Row <> tableau.Cells(1, 1).Row Then
With ligne
.Interior.ThemeColor = xlThemeColorAccent6
.Interior.TintAndShade = 0.799981688894314
.Font.ThemeColor = xlThemeColorAccent6
.Font.TintAndShade = -0.249977111117893
End With
End If
Next ligne
Else
MsgBox "Vous devez sélectionner toutes les cellules (CTRL + A) du tableau à formater.", vbInformation
End If
End Sub