XL 2016 [VBA] Comment imbriquer ces 2 subs

shanon7

XLDnaute Junior
Bonjour ! Toujours dans ma formation en VBA, j'en arrive à un exercice que je ne parviens pas à faire :

Ecrire une procédure qui colorie une cellule en rouge si elle est vide et en bleu sinon à chaque fois que l’utilisateur double clic sur une cellule du classeur

J'ai décomposé le problème en 2 temps :
1) Dans un module de code, j'ai écrit la sub suivante :
Sub essai()
If IsEmpty(ActiveCell.Value) = True Then
ActiveCell.Interior.Color = RGB(255, 0, 0)
End Sub

2) Dans le module de code associé au workbook, j'ai écrit la private sub suivante :
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
Target.Interior.Color = RGB(0, 0, 255)
End Sub

Mon problème est que je ne parviens pas à imbriquer ces 2 écritures de manière à les avoir dans un seul et unique code. Je suis d'autant plus bloquée que j'ai un bout de code écrit dans un module, et un autre bout de code écrit dans un autre module et en plus qui est une procédure évènementielle. En bref, je suis assez perdue !

Merci d'avance,

Shanon
 

soan

XLDnaute Barbatruc
Inactif
Bonjour Shanon,

je te propose ce code VBA :

VB:
Option Explicit

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
  Dim cf&: Cancel = True
  With Target
    If .CountLarge > 1 Then Exit Sub
    If IsEmpty(.Value) Then cf = RGB(255, 0, 0) Else cf = RGB(0, 0, 255)
    .Interior.Color = cf
  End With
End Sub

à toi d'essayer. ;)

soan
 

shanon7

XLDnaute Junior
Bonjour,

Merci pour votre réponse

Toutefois avec ce morceau de code la cellule se colorie en rouge seulement quand je double click sur une cellule vide. Comment faire pour qu'elle se colorie en rouge au bout d'un seul click, juste parce qu'elle est vide? (et en revanche les cellules non vides doivent être bleues au double click). C'est à dire que la première partie du code ne dépend pas de l'évènement, tandis que la seconde partie en dépend, c'est ça que je ne parviens pas à réaliser.
 

soan

XLDnaute Barbatruc
Inactif
cf est une variable ; je l'ai appelée ainsi pour couleur fond ; si ça avait été la couleur du texte, je l'aurais appelée ct ; mais bien sûr on peut appeler les variables comme on veut, à ces 2 conditions : ne pas utiliser un keyword (mot-clé) de VBA et respecter la syntaxe pour les noms de variables ; car certains caractères sont interdits, comme par exemple « / », « \ », ou « : ».


nouveau code VBA, qui n'a pas besoin de la variable cf :
VB:
Option Explicit

Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
  Cancel = True
  With Target
    If .CountLarge = 1 And IsEmpty(.Value) Then .Interior.Color = RGB(255, 0, 0)
  End With
End Sub

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
  Cancel = True
  With Target
    If .CountLarge = 1 And Not IsEmpty(.Value) Then .Interior.Color = RGB(0, 0, 255)
  End With
End Sub

il n'y a pas d'événement sur le clic gauche ; j'ai donc fait sur le clic droit ; clic droit sur une cellule vide : en rouge ; double-clic sur une cellule non vide : en bleu.

soan​
 

soan

XLDnaute Barbatruc
Inactif
Option Explicit oblige le programmeur a déclarer explicitement toutes les variables utilisées dans le code VBA ; ça semble être un inconvénient, car ça oblige à plus de rigueur, mais en fait, c'est un gros avantage car ça permet d'éviter des erreurs de variables ; par exemple, si une variable est mal orthographiée par inadvertance, la compilation butera dessus, et le programmeur en sera averti ; sans Option Explicit, ça aurait créé une nouvelle variable avec des conséquences aléatoires ; de plus, il y a une vérification des types de variables, donc certaines erreurs d'incompatibilité de type peuvent être détectées ; plus d'infos détaillées sur ce post ; clique sur le lien bleu, puis lis à partir de la 2ème ligne continue (en dessous).

soan​
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonsoir le fil

[En passant]
[A titre illustratif]​
[Et pour la satisfaction des vbaistes curieux]​
Code:
Private Sub Worksheet_SelectionChange(ByVal T As Range)
If T.Count > 1 Then Exit Sub
T.Interior.Color = Switch(Len(T) > 0, vbBlue, Len(T) = 0, vbRed)
End Sub
[/En passant]​
[/A titre illustratif]​
[/Et pour la satisfaction des vbaistes curieux]
 

soan

XLDnaute Barbatruc
Inactif
Bonsoir Staple,

j'ai l'impression que tu as zappé ce post ! 😜 shanon7 tient à 2 subs : une sub pour mettre du rouge sur une cellule vide par clic droit (au début, elle avait demandé par simple clic, mais y'a pas d'événement pour clic gauche) ; une sub pour mettre du bleu sur une cellule non vide par double-clic ; je suis bien persuadé que ta sub marche correctement, mais désolé : elle me semble incompatible avec la demande initiale. 😁 :rolleyes: (sans vouloir te décevoir ; mébon, ça servira pour la satisfaction des lecteurs vbaistes curieux)

soan
 

soan

XLDnaute Barbatruc
Inactif
ah, ok, j'ai compris : c'est le « [A titre illustratif] » (donc c'est valable même si c'était pas la demande initiale)

et mon IIf() au lieu du Switch(), c'est pas mal, non ? 😜 (ça met un seul test au lieu de deux tests)

soan
 

Discussions similaires

Réponses
29
Affichages
955
Réponses
7
Affichages
370
Réponses
0
Affichages
155

Statistiques des forums

Discussions
312 310
Messages
2 087 127
Membres
103 479
dernier inscrit
Compta