XL 2013 Problème pour colorer des cellules en VBA

Jacques25

XLDnaute Occasionnel
Bonjour à tous,

Je rencontre un problème sur un code qui a marché pendant des mois/années.
J'effectue un test sur le remplissage de cellules, si ces cellules sont vides je les rempli en jaune avec le bout de code suivant :

If Range("aa3") = "" Or Range("n5") = "" Or Range("n6") = "" Or Range("at13") = "" Or Range("at14") = "" Or Range("q41") = "" Or Range("BH8") = "" Then
Range("AA3,N5,N6,AT13,AT14,Q41,BH8").Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With

Ca marche quand j'enregistre le code et dès que je ferme le fichier et le rouvre ça ne marche plus. Ca fait au moins 2 ans que ça marche et d'un coup ça ne marche plus.
Auriez vous une explication?

j'ai essayé en replaçant 65535 par vbyellow
au départ il n'y avait que le .color et ça marchait bien

question subsidiaire : est ce que la 1ère ligne peut être simplifiée If range... or range... or range...

Merci d'avance de votre aide

Jack
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous,

@Jacques25 :
Il me semble que ton code fait la chose suivante:
s'il y a au moins une cellule vide parmi les cellules AA3,N5,N6,AT13,AT14,Q41,BH8, alors on colore l'ensemble des cellules AA3,N5,N6,AT13,AT14,Q41,BH8

@JBARBE
Il me semble que ton code fait la chose suivante:
si la cellule AA3 est vide, alors on colore l'ensemble des cellules AA3,N5,N6,AT13,AT14,Q41,BH8
 

JBARBE

XLDnaute Barbatruc
Re, Bonjour mapomme,
En effet, pas essayé !
J'ai changé or par and ce qui me parait logique et ajouté !
Interior.ColorIndex = xlNone
s'il n'y a pas de couleurs dans les cellules indiquées !
Code:
Sub test()
If Range("aa3") = "" And Range("n5") = "" And Range("n6") = "" And Range("at13") = "" And Range("at14") = "" And Range("q41") = "" And Range("BH8") = "" And _
Range("aa3").Interior.ColorIndex = xlNone And Range("n5").Interior.ColorIndex = xlNone And Range("n6").Interior.ColorIndex = xlNone And _
Range("at13").Interior.ColorIndex = xlNone And Range("at14").Interior.ColorIndex = xlNone And Range("q41").Interior.ColorIndex = xlNone And Range("BH8").Interior.ColorIndex = xlNone Then
Range("AA3,N5,N6,AT13,AT14,Q41,BH8").Interior.Color = 65535
End If
End Sub
 

Pièces jointes

  • Classeur1.xls
    52.5 KB · Affichages: 17

mapomme

XLDnaute Barbatruc
Supporter XLD
Re JBARBE ;),

Pour le fun, un peu plus concis en supposant que toutes les cellules doivent être vides pour les colorer :
VB:
Sub TEST()
Range("AA3,N5,N6,AT13,AT14,Q41,BH8").Interior.Color = IIf(([N5 & AA3 & N6 & AT13 & AT14 & Q41 & BH8]) = "", vbYellow, xlNone)
End Sub
 
Dernière édition:

Jacques25

XLDnaute Occasionnel
Bonjour à tous,

J'ai eu quelques problèmes de connexion.
Merci pour vos réponses
@ sousou le End if est bien dans mon code j'ai juste oublié de le copier dans le message
Pour les autres, si une des cellules parmi celles citées est vide je dois colorer toutes les cellules citées en jaune.

Mon code marche en l'enregistrant avec l'enregistreur de macro, je ferme le fichier, je le rouvre et ça ne marche plus le code d'erreur est le suivant :
erreur d'éxecution 1004
erreur définie par l'application ou par l'objet

Merci d'avance pour vos bonnes idées.

@ plus

Jack
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,
Pour les autres, si une des cellules parmi celles citées est vide je dois colorer toutes les cellules citées en jaune.
Essayez :
VB:
Sub TEST()
Dim x, vide As Boolean
For Each x In Range("AA3,N5,N6,AT13,AT14,Q41,BH8"): vide = vide Or x = "": Next x
Range("AA3,N5,N6,AT13,AT14,Q41,BH8").Interior.Color = IIf(vide, vbYellow, xlNone)
End Sub
 

Pièces jointes

  • Jacques25- Colorier si vide- v1.xlsm
    16 KB · Affichages: 12
Dernière édition:

JBARBE

XLDnaute Barbatruc
Bonjour à tous,

J'ai eu quelques problèmes de connexion.
Tu veux dire des problèmes de connexions WI-FI !
Mon code marche en l'enregistrant avec l'enregistreur de macro, je ferme le fichier, je le rouvre et ça ne marche plus le code d'erreur est le suivant :
erreur d'éxecution 1004
erreur définie par l'application ou par l'objet
Jack
Ton code et les codes apportés devraient fonctionner !
Tu dois avoir un probléme avec ton programme Excel !
Voir les mises à jour d'Excel ou :
Peut-être la SUPPRESSION ENTIÈRE du programme et sa RÉINSTALLATION va apporter quelque chose !
Bonne journée !
 

Jacques25

XLDnaute Occasionnel
Re bonjour,

Oui des problèmes de connexion Wi-fi
Je vais essayer d'intégrer le code de Ma pomme dans mon code demain, si j'ai les mêmes soucis je referai une saisie complète du code et je verrai bien.

Merci à tous d'avoir pris du temps pour me conseiller.
Bonne fin de week end à tous.

Jack
 

Jacques25

XLDnaute Occasionnel
Bonjour à tous,

Juste pour vous tenir au courant mon problème est réglé, mon code marche, c'était juste une histoire de protection d'onglet qui avait été déplacée dans le code.
Je garde bien le code de Ma pomme que je trouve beaucoup plus lisible.

Encore merci à tous
Bonne journée

Jack
 

Jacques25

XLDnaute Occasionnel
Rebonjour à tous,

Ma pomme je reviens sur ton code, pourrais tu m'expliquer sa signification, j'aime encore bien utiliser des codes que je comprends. J'ai bien compris le fond mais j'arrive pas à détailler :

Pour chaque X (que représente X) dans les cellules AA3... et là je bloque sur la fin de la ligne
For Each x In Range("AA3,N5,N6,AT13,AT14,Q41,BH8"): vide = vide Or x = "": Next x

les cellules AA3... colorées en jaune si vide est vrai sinon pas de couleur
Range("AA3,N5,N6,AT13,AT14,Q41,BH8").Interior.Color = IIf(vide, vbYellow, xlNone)

Merci de ta compréhension.
@ plus

Jack
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,
VB:
For Each x In Range("AA3,N5,N6,AT13,AT14,Q41,BH8"): vide = vide Or x = "": Next x
x est une variable de type variant. On va donc affecter à x successivement chaque cellule du range Range("AA3,N5,N6,AT13,AT14,Q41,BH8").
on va affecter à x la cellule AA3 puis N5 puis N6 puis ... etc.
vide est une variable de type boolean valant Faux ou Vrai. Au départ, par défaut, sans affectation initiale explicite, vide vaut Faux.

On va examiner successivement toute les cellules du range via la variable x.
Première cellule :vide est Faux. Si x n'est pas vide, alors x="" est Faux donc vide or x="" revient à faire vide = Faux ou Faux donc vide est Faux.
Deuxième cellule : vide est toujours à faux, si x n'est pas vide, alors x="" est Vrai donc vide or x="" revient à faire vide = Faux ou Vrai qui est égal à vrai.
Ensuite les valeurs des x suivant n'ont plus d'importance car une fois que vide est Vrai alors vide restera Vrai. En effet Vrai or Faux donne Vrai et Vrai or Vrai donne Vrai .
Donc vide sera Vrai si au moins une des cellules est vide
sinon si toute les cellules ne sont pas vides, vide restera à Faux.​

VB:
Range("AA3,N5,N6,AT13,AT14,Q41,BH8").Interior.Color = IIf(vide, vbYellow, xlNone)

On utilise la syntaxe IIF. Suivant la valeur de vide , on affecte au fond de toutes les cellules du range soit la couleur jaune (si vide est vrai soit au moins une cellule vide) soit aucune couleur (si vide est faux soit aucune cellule n'est vide))
 
Dernière édition:

Statistiques des forums

Discussions
312 084
Messages
2 085 194
Membres
102 811
dernier inscrit
caroline29260