Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Ligne et colonne de la cellule cliquée
Avec cette nouvelle
astuce VBA Excel , il est question de voir comment il est possible de
surligner en couleur la
ligne et la colonne complètes de la
cellule cliquée dans un tableau. L'intérêt est simple. Il s'agit de mettre en évidence les informations à débattre lors de présentations.
Sur l'exemple illustré par la capture, lorsque l'utilisateur clique sur une cellule précise d'un tableau, la sélection est étendue jusqu'aux bornes de ce dernier, aussi bien en largeur qu'en hauteur, pour faire ressortir en jaune l'intégralité de la ligne et de la colonne concernées.
Classeur Excel à télécharger
Pour la découverte de cette trouvaille, nous suggérons d'appuyer l'étude sur un
classeur abritant un tableau de données assez volumineux.
Nous découvrons le tableau fidèle à celui de la présentation. Il archive des activités de sorties catégorisées notamment par départements.
Code VBA au changement de sélection
Le premier enjeu consiste à faire réagir les cellules du tableau
au clic de l'utilisateur dans une cellule.
VBA Excel offre des
gestionnaires d'événements . L'un d'entre eux détecte le
changement de sélection , soit ces fameux clics dans ces cellules de coordonnées différentes. C'est ainsi qu'il peut déclencher l'exécution d'un
code VBA au gré des actions de l'utilisateur sur la feuille. Pour débuter, nous proposons de créer cette
procédure événementielle .
Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Excel ,
Dans l'explorateur de projet sur la gauche, double cliquer sur l'élément Feuil1 (Naviguer) ,
Ainsi, nous affichons au centre de l'écran, la
feuille de code VBA associée aux données du
tableau Excel .
En haut de la feuille de code, déployer la liste déroulante de gauche,
Dans les propositions, choisir l'élément Worksheet ,
Cet élément désigne une feuille, en l'occurrence ici, la feuille 1 nommée Naviguer. Et c'est ainsi que nous créons la
procédure événementielle Worksheet_SelectionChange . Son code se déclenchera Ã
chaque changement de sélection , donc Ã
chaque clic dans une nouvelle cellule. Vous notez qu'un élément lui est passé en paramètre. Il se nomme
Target et il est de
type Range (Plage ou cellule). Il représente la cellule cliquée. Grâce à lui, nous allons pouvoir connaître ses coordonnées.
La déclaration des variables
Pour surligner la ligne et la colonne entières de la cellule désignée, nous avons besoin de connaître la ligne et la colonne de la cellule active mais aussi les lignes et colonnes des cellules situées aux extrémités, aussi bien à l'horizontale qu'à la verticale. Et pour cela, nous devons commencer par
déclarer les variables destinées à recevoir ces informations.
Dans les bornes de la procédure, ajouter les déclarations de variables suivantes :
...
Dim ligneActive As Integer: Dim colonneActive As Integer
Dim ligneDeb As Byte: Dim ligneFin As Integer
Dim colonneDeb As Byte: Dim colonneFin As Byte
...
Nous déclarons six variables comme des entiers, parfois en entiers courts pour les indices de colonne et la première ligne du tableau et en entiers longs pour les indices de ligne et aussi pour la ligne active.
Code VBA au clic dans le tableau seulement
Maintenant et avant de songer Ã
affecter ces variables , nous devons penser Ã
optimiser les ressources . Ce code ne doit pas être déclenché inutilement. Il doit réagir si et seulement si la
cellule cliquée appartient bien au tableau de données. Celui-ci est nommé
bdd . Vous pouvez le constater en déployant la
zone Nom en haut à gauche de la
feuille Excel .
Après les variables, donc à la suite du code, ajouter l'instruction conditionnelle suivante :
...
If Not Intersect(Target, [bdd]) Is Nothing Then
End If
...
La
fonction Intersect porte bien son nom. Nous lui passons deux plages en paramètres, celle de la cellule cliquée et celle du tableau reconnu par son nom (bdd). Elle indique simplement s'il existe une ou des cellules à l'
intersection , soit portant les mêmes coordonnées. Grâce à la double négation (Not et Is Nothing), nous nous assurons que cette
intersection existe bien, en d'autres termes que la cellule cliquée appartient bien au tableau. C'est seulement à cette condition que nous pouvons poursuivre le traitement, d'où la nécessité d'une
instruction conditionnelle .
Réinitialiser les couleurs du tableau
Poursuivons ! Comme nous allons modifier la couleur de la ligne et de la colonne pour la cellule cliquée, avant chaque nouveau clic, nous devons commencer par restituer les couleurs d'origine. Le plus simple est d'agir sur la plage complète (bdd) du tableau, sans se soucier des cellules précisément à réattribuer.
Dans l'instruction conditionnelle, ajouter les deux lignes VBA suivantes :
...
[bdd].Interior.Color = Range("A1").Interior.Color
[bdd].Font.Color = Range("A1").Font.Color
...
Nous descendons simplement jusqu'Ã la
propriété enfant Color pour le
fond (Interior) et le
texte (Font) de chaque cellule du tableau. Et nous leur attribuons les réglages d'usine en prélevant arbitrairement ceux de la
cellule A1 .
Ligne et colonne de la cellule cliquée
Il est temps de prélever les
indices de ligne et de colonne de la cellule cliquée . Pour cela, l'
objet Target passé en paramètre de la
procédure événementielle offre les
propriétés dédiées.
A la suite du code, toujours dans le If , ajouter les deux instructions VBA suivantes :
...
ligneActive = Target.Row
colonneActive = Target.Column
...
Ce sont les
propriétés Row et Column qui renvoient respectivement les
numéros de ligne et de colonne pour la
cellule cliquée . Nous les stockons dans les
variables ligneActive et colonneActive .
Lignes et colonnes aux extrémités
A partir de ce point de départ, nous devons étendre la sélection pour obtenir les indices des cellules en début et fin de ligne mais aussi en début et fin de colonne. Pour cela, il suffit d'exploiter la
propriété End que nous avons découverte récemment. Elle permet de pointer sur une extrémité à désigner par rapport à un point de départ.
A la suite du code et toujours dans le If , ajouter les instructions VBA suivantes :
...
colonneDeb = Target.End(xlToLeft).Column
colonneFin = Target.End(xlToRight).Column
ligneDeb = Target.End(xlUp).Row + 1
ligneFin = Target.End(xlDown).Row
...
Pour la
colonne de départ (colonneDeb), nous passons le
paramètre xlToLeft à la
propriété End de l'
objet Target . Nous décelons ainsi la
première colonne du tableau dont nous prélevons l'indice avec la
propriété Column . De la même façon, nous décelons la
colonne de fin (colonneFin) grâce au
paramètre xlToRight . Ce sont ensuite et respectivement les
valeurs xlUp et xlDown qui donnent les indices de ligne aux extrémités (ligneDeb et ligneFin). Notez néanmoins que nous ajoutons une unité à la ligne de départ (+1) pour ignorer la ligne de titre.
Surligner la ligne et la colonne
Maintenant que toutes les
coordonnées sont connues, nous allons pouvoir exploiter l'
objet Range pour délimiter les plages définissant la ligne et la colonne dont il s'agit de changer de couleur.
Toujours à la suite du code et dans le If , ajouter les quatre instructions VBA suivantes :
...
Range(Cells(ligneActive, colonneDeb), Cells(ligneActive, colonneFin)).Interior.Color = vbYellow
Range(Cells(ligneDeb, colonneActive), Cells(ligneFin, colonneActive)).Interior.Color = vbYellow
Range(Cells(ligneActive, colonneDeb), Cells(ligneActive, colonneFin)).Font.Color = vbBlack
Range(Cells(ligneDeb, colonneActive), Cells(ligneFin, colonneActive)).Font.Color = vbBlack
...
Nous définissons tout d'abord la couleur de fond pour la ligne active qui part de la première cellule du tableau (Cells(ligneActive, colonneDeb)) et s'étend jusqu'à la dernière (Cells(ligneActive, colonneFin)). Cette couleur est un jaune (vbYellow). Nous faisons de même pour la colonne active. Puis, pour ces deux même rangées, nous forçons la couleur du texte (Font.Color) sur du noir (vbBlack).
Enregistrer les modifications (CTRL + S) et basculer sur la feuille Excel (ALT + Tab),
Dès lors, cliquer à l'intérieur du tableau,
Comme vous pouvez le voir, la ligne et la colonne complètes de la cellule sélectionnée, sont instantanément mises en valeur.
Gérer les exceptions
Cependant des anomalies existent et nous devons les gérer. Si vous cliquez sur la dernière colonne du tableau (Colonne F), le débogueur se déclenche.
Comme nous sommes déjà placés sur la dernière colonne du tableau, la méthode de déplacement ne parvient pas à la déceler.
De même et après avoir réinitialisé le programme avec le bouton Stop, si vous cliquez sur une cellule de la première colonne, la sélection déborde pour considérer la cellule située juste avant le tableau.
Un autre souci survient également en désignant une cellule de la dernière ligne du tableau. Bref, ce sont les cellules aux extrémités qui sont incriminées. Pour corriger ces dysfonctionnements, il convient d'adapter le programme comme suit (Les nouvelles lignes sont en gras) :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim ligneActive As Integer: Dim colonneActive As Integer
Dim ligneDeb As Byte: Dim ligneFin As Integer
Dim colonneDeb As Byte: Dim colonneFin As Byte
colonneFin = 0: ligneFin = 0
If Not Intersect(Target, [bdd]) Is Nothing Then
[bdd].Interior.Color = Range("A1").Interior.Color
[bdd].Font.Color = Range("A1").Font.Color
ligneActive = Target.Row
colonneActive = Target.Column
colonneDeb = Target.End(xlToLeft).Column
If (Cells(ligneActive, colonneDeb).Value = "") Then
colonneDeb = colonneActive
End If
On Error GoTo gererColonne
colonneFin = Target.End(xlToRight).Column
gererColonne:
If (colonneFin = 0) Then colonneFin = colonneActive
ligneDeb = Target.End(xlUp).Row + 1
On Error GoTo gererLigne
ligneFin = Target.End(xlDown).Row
gererLigne:
If (ligneFin = 0) Then ligneFin = ligneActive
Range(Cells(ligneActive, colonneDeb), Cells(ligneActive,colonneFin)).Interior.Color = vbYellow
Range(Cells(ligneDeb, colonneActive), Cells(ligneFin, colonneActive)).Interior.Color = vbYellow
Range(Cells(ligneActive, colonneDeb), Cells(ligneActive, colonneFin)).Font.Color = vbBlack
Range(Cells(ligneDeb, colonneActive), Cells(ligneFin,colonneActive)).Font.Color = vbBlack
End If
End Sub
Nous initialisons d'abord les variables de fin pour voir si elles évoluent (colonneFin = 0:ligneFin = 0). Si la cellule pour la colonne de départ est vide (If(Cells(ligneActive, colonneDeb).Value = "")), nous en concluons que l'utilisateur a cliqué dans la première colonne du tableau et que le programme a retenu la cellule vide d'avant. Donc, nous réinitialisons la colonne de départ sur la colonne active (colonneDeb = colonneActive), soit la première du tableau. Si une erreur est générée lors de l'affectation de la colonne de fin, nous déclenchons un gestionnaire d'erreur (On Error GoTo gererColonne) qui renvoie à l'étiquette gererColonne. Cette étiquette intervient après la tentative d'affectation. Dans ces conditions, nous réaffectons la colonne de fin sur la colonne active (gererColonne:If (colonneFin = 0) Then colonneFin = colonneActive), soit la dernière du tableau. De la même façon, lorsqu'une erreur est rencontrée lors de l'affectation de la ligne de fin (On Error GoTo gererLigne), nous la réaffectons sur la ligne active, soit sur la dernière ligne du tableau.
Désormais, quel que soit l'endroit sur lequel vous cliquez dans le tableau, ce sont bien la ligne et la colonne complètes qui sont mises en surbrillance, sans que plus aucune erreur ne soit générée.