Mise en forme conditionnelle par VBA

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: 193

Gorfael

XLDnaute Barbatruc
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+
 

David

XLDnaute Occasionnel
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:

Gorfael

XLDnaute Barbatruc
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+
 

David

XLDnaute Occasionnel
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:

David

XLDnaute Occasionnel
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

  • mise_en_forme.xls
    59 KB · Affichages: 96
  • mise_en_forme.xls
    59 KB · Affichages: 99
  • mise_en_forme.xls
    59 KB · Affichages: 99
Dernière édition:

David

XLDnaute Occasionnel
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.
 

Gorfael

XLDnaute Barbatruc
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+
 

David

XLDnaute Occasionnel
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: