Mise en forme conditionnelle par VBA

  • Initiateur de la discussion Initiateur de la discussion David
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

David

XLDnaute Occasionnel
Bonjour à tous

J'essaie de mettre en vba 3 mises en formes conditionnelles, mais ça bloque, pour les 2 premières il me met bien les formules dans les conditions, mais ça met "pas de mise en forme conditionnelle", la couleur est en place uniquement sur la 3ème mise en forme. (voir screenshot)

Voila la formule :

Code:
Sub valid()

AdrCellule_2 = ActiveCell.Address(False, True)
col = Left(ActiveCell.Address(ColumnAbsolute:=False), (ActiveCell.Column < 27) + 2)

    moment = Cells(12, col).Value
    If moment = "m" Then
        col2 = col
    Else
        col2 = col - 1
    End If
    
    txt = col2 & "10"
    txt2 = col2 & "9"



    Selection.FormatConditions.Delete
       '*******************************
         Selection.FormatConditions.Add Type:=xlExpression, _
        Formula1:="=OU(JOURSEM(" & txt & ")=1;JOURSEM(" & txt & ")=7;" & txt2 & "=""O"")"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 49407
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = True
       
   '********************************
    Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlNotEqual, _
        Formula1:="="""""
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(2).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 15773696
        .TintAndShade = 0
    End With
    Selection.FormatConditions(2).StopIfTrue = True

        '*****************************
         Selection.FormatConditions.Add Type:=xlExpression, _
        Formula1:= _
        "=OU(" & AdrCellule_2 & "=""M"";" & AdrCellule_2 & "=""Ma"";" & AdrCellule_2 & "=""F"")"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(3).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 65535
        .TintAndShade = 0
    End With
    Selection.FormatConditions(3).StopIfTrue = True
    
       Positionligne = ActiveCell.Row
    Positioncol = ActiveCell.Column + 1
    Cells(Positionligne, Positioncol).Select
End Sub

Merci d'avance
 

Pièces jointes

  • mise_forme.JPG
    mise_forme.JPG
    43.2 KB · Affichages: 199
Re : Mise en forme conditionnelle par VBA

Salut David et le forum
Quelques remarques :
- Donner un code faux sans donner ce qu'il est supposer faire ne donne pas envie de se pencher dessus.
- Les images, j'ai arrêté de m'y intéresser à la sortie de la maternelle ! Tu as une question qui peut s'expliquer en quelques cellules. Pourquoi mettre une image et pas un fichier d'essai ?
Code:
Sub valid()
 AdrCellule_2 = ActiveCell.Address(False, True)
col = Left(ActiveCell.Address(ColumnAbsolute:=False), (ActiveCell.Column < 27) + 2)
???? T'as pas plus complexe ?
- Déjà tu commence par ActiveCell... ça limite la portée de ta macro. Autant le faire directement, ce sera plus simple.
On va dire que la cellule active est la cellule G5
AdrCellule_2 = ActiveCell.Address(False, True) => AdrCellule_2="G$2"
col = Left(ActiveCell.Address(ColumnAbsolute:=False), (ActiveCell.Column < 27) + 2)
=> Si je comprends si la colonne est inférieure à Z, Col="x$", sinon "Col=xx$". pour notre cas : Col="G$"
Pas le plus simple, mais admettont
Code:
    moment = Cells(12, col).Value
    If moment = "m" Then
        col2 = col
    Else
        col2 = col - 1
    End If
    
    txt = col2 & "10"
    txt2 = col2 & "9"
???? on ajoute des variables qui ne servent à rien (moment) et on crée un test... Col est du texte ("G$" dans mon exemple) et on veut lui enlever 1 ???

Si tu avais déclaré tes variable dans le type attendu tu aurais eu directement une incompatibilité de type.
En gros, si tu regardes tes variables, en exécutant ta macro en pas-à-pas, tu devrais voir tes erreurs.
Ou donner le but à atteindre et on devrait résoudre facilement ton problème par un code plus simple.
A+
 
Re : Mise en forme conditionnelle par VBA

Pour l'erreur, j'ai été un peu vite, il est vrai que j'ai une erreur à cause de col2 = col - 1, je n'ai fait que des tests cellule qui n'utilise que le then. Je suis entrain de modifier le code, mais ça sera pour demain je pars du boulot.

Par contre je ne vois pas ou est le problème pour col j'ai besoin de récupérer uniquement la colonne, les cellules dans les formules de mise en forme conditionnelle, utilise la même colonne mais pas la même cellule, j'isole donc la colonne. Sinon t'as quoi de plus simple pour me sortir la colonne G$ voir AA$

pour AdrCellule_2 que je mette AdrCellule_2 ou ActiveCell.Address(False, True) dans la formule de la mise en forme conditionnelle ne change pas grand chose et je ne vois pas en quoi ça limite.

Pour les images c'est dommage, ça aide parfois grandement.

Le modifie et je mettrai le fichier demain matin.

Mais bon je cherche le problème de la mise en forme, je mets bien color = xxxxx et ça ne ressort pas dans la mise en forme conditionnelle, mon vrai problème se situe la.

Merci et bonne soirée.
 
Dernière édition:
Re : Mise en forme conditionnelle par VBA

Salut David et le forum
Pour le début, on pourrait avoir
Code:
Sub valid()
Dim Cel As Range, Txt As String, Txt2 As String
Set Cel = ActiveCell
If Cells(12, Cel.Column) = "m" Then Set Cel = Cel.Offset(0, -1)
Txt = Cells(10, Cel.Column).Address(0, 1)
Txt2 = Cells(9, Cel.Column).Address(0, 1)
End Sub
Mais comme je ne sais toujours pas le but à atteindre...
A+
 
Re : Mise en forme conditionnelle par VBA

Merci pour ta soluce, je l'intègre demain matin au boulot et je mettrais un fichier en pièce jointe avec les explications.

A demain donc.

Bonne soirée
 
Dernière édition:
Re : Mise en forme conditionnelle par VBA

Bonjour à tous

Voila le fichier.
Le but : quand je lance la macro valid (ctrl + m), il faut que ça me mette les mises en formes conditionnelles telle qu'elles apparaissent sur les ligne P13:BY17. Je dois les valider une par une. ça marche presque, uniquement les couleurs qui ne veulent pas se mettre au bon endroit.

Conditition 1 et 2 pas de couleur et condition 3 se retrouve avec la couleur de la condition 1 ?????


Condition1 : couleur verte si la celllule contient M, Ma, F.
Condition2: couleur jaune si la cellule autre chose que M, Ma, F.
Condition3 : couleur grise si le jour est un samedi, un dimanche ou un jour férié (O dans ligne 9).

En esperant être assez clair.
Merci
 

Pièces jointes

Dernière édition:
Re : Mise en forme conditionnelle par VBA

Bon c'est bon j'ai trouvé.
J'avais numéroté les conditions Selection.FormatConditions(1).Interior Selection.FormatConditions(2).Interior Selection.FormatConditions(3).Interior, mais excel 2007 n'aime pas, j'ai mis Selection.FormatConditions(1).Interior aux trois conditions et ça marche.

Merci pour tout et bonne fin de journée.
 
Re : Mise en forme conditionnelle par VBA

Salut David et le forum
Conditition 1 et 2 pas de couleur et condition 3 se retrouve avec la couleur de la condition 1 ?????

Condition1 : couleur verte si la cellule contient M, Ma, F.
Condition2: couleur jaune si la cellule autre chose que M, Ma, F.
Condition3 : couleur grise si le jour est un samedi, un dimanche ou un jour férié (O dans ligne 9).
Excel fait toujours ce que tu lui demandes et quelques fois... ce que tu veux !

Sans aller très loin, ta condition 3 ne fonctionne que si la cellule est vide.
J'ai regarder la ligne 16 et ta MFC fonctionne correctement en fonction des paramètres donnés :
- cellule Vide => conditions 1 et 2 fausses condition 3 Vrai => coloriage en gris
- Cellule contenant : F, M ou Ma => condition 1 Vrai => coloriage en vert
- Cellule contenant : C, S, Sp, Cs ou Ab => condition 1 fausse, condition 2 vraie => coloriage en jaune pale.

Si tu veux que les jours fériés (ou associés) soit prioritaires, change la condition 3 et condition 1 et décale les condition 1 et 2 en 2 et 3.

Personnellement, je n'aime pas tes lignes 10 et 11 : P10
Code:
=DATE(ANNEE($O$1);MOIS($O$1);P11)
J'aurais mis :
Code:
=DATE(ANNEE($O$1);MOIS($O$1);1)
et pour P11
Code:
=P10
avec un format de cellule : j
R10 :
Code:
=P10+1
,etc...
Il n'y a que sur les cellules à partir de BT que je créerai une nouvelle formule qui tienne compte du mois. Un 31 février me gène...
A+
 
Re : Mise en forme conditionnelle par VBA

Merci pour ton aide

J'avais fait à l'origine comme tu le dis pour les dates en fonction du mois avec une simple formule +1, et cela m'avait générer un bug (dont je ne me souviens plus). Comme je suis sur le grand nettoyage de printemps je vais retenter avec une simple formule.

Pour le 31 février, tu n'as qu'une tout petite partie de mon tableau (12Mo, 12 mois, 19 centres, 200 personnes), le tableau peut être glissant et commence sur n'importe quel mois, d'ou tous les onglets avec 31 jours, mais il y a une mise en forme conditionnelle qui hachure les jours ne faisant pas partie du mois comme le 29 (année bissextile), 30 et 31 février.

Je me sers de mon tableau depuis quelques années et j'ai des problèmes depuis excel 2007, qui bizarrement n'était pas prèsent avant se début d'année.

J'utilise différente validation (saisie ou pas saisie, annulation, impression demande de congés) pour faire différente mise en forme conditionnelle et suivant la couleur ça me signale ou imprime les demandes de congés automatiquement. Je génère un fichier par centre qui s'envoi automatiquement par mail, mais depuis excel 2007 les mises en forme conditionnelle me pose problème. Si je genere un fichier centre (5mois) avec excel 2007 il fait 635 Ko, avec excel 2007 1,2 Mo et il rame à mort, je nettoie donc le tout pour le rendre a nouveau rapide et léger.
Si je supprime les mise ne forme conditionnelle sur le fichier 2007 le fichier retombe à 500 Ko, tout mon problème se situe la. Les centres utilisent excel 2003 ou 2007 et j'ai du limiter les copie coller, sinon ça ne marche carrément plus quand je consolide.

Voila j'ai encore plein de taf et je vais surement revenir !^^

Pour le jour férié, je ne veux pas qu'il soit prioritaire, si quelqu'un mets un jour de congés par erreur sur un jour férié (et ça arrive) ça le met en jaune et ça le fait apparaitre comme le nez au milieu de la figure au milieu du gris. 😉

En tous les cas merci pour ton aide, je fais les modifs que tu préconises et je verrais si ç'est mieux.

A bientôt.
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
9
Affichages
715
  • Question Question
Microsoft 365 comparaison texte
Réponses
5
Affichages
735
  • Question Question
Microsoft 365 colorer une plage
Réponses
2
Affichages
891
Réponses
2
Affichages
803
Réponses
8
Affichages
694
Réponses
22
Affichages
3 K
Retour