Mise en forme conditionnelle en VBA

bonjour à tous,

je souhaite faire une MFC en VBA.

cela se déroule bien quand mes cellules sont égale à quelle chose ( exemple: ok, non, date......)

mais je souhaite que la case soit rouge lorsque elle case n'est pas renseigné:

Sub FormatageConditionnel()
'Création de l'objet Range
Dim MaPlage As Range
Set MaPlage = Range("Tableau[[ID]:[VAB]]")

'Supprime le formatage conditionnel existant dans cette plage
MaPlage.FormatConditions.Delete

'Création de la 1er règle
MaPlage.FormatConditions.Add Type:=xlExpression, Formula1:= _
"=NBCAR(SUPPRESPACE(D1))=0"
MaPlage.FormatConditions(1).Interior.Color = vbRed

'Création de la deuxième règle
MaPlage.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
Formula1:="non"
MaPlage.FormatConditions(2).Interior.Color = vbBlue
End Sub

question:

par quoi je dois remplacer la partie en jaune afin que cette MFC puisse fonctionner

un grand merci à vous et bonnesss fetesss

très cdt

sans fichier ? c'est une supposition

"=NBCAR(SUPPRESPACE(" & MaPlage.range("D1").address & "))=0"

23essai-mfc.xlsx (10.37 Ko)

Bonjour,

merci pour cette réponse, je vous joins un fichier qui est un exemple par rapport au fichier de base.

mon but dans cette MFC est de mettre dans une certaine couleur les cases vides

merci d'avance à vous

cdt

Sub FormatageConditionnel()
     Dim sForm
     'Création de l'objet Range
     With Range("TableauR10[[age]:[code Postal]]")     'plage = ces colonnes de ce tableau
          .FormatConditions.Delete     'Supprime le formatage conditionnel existant dans cette plage

     'Création de la 1er règle
          MsgBox "l 'adresse que je veut utiliser est : " & .Cells(1).Address(0, 1)     'ligne relative, colonne absolute
          sForm = "=NBCAR(SUPPRESPACE(" & .Cells(1).Address(0, 1) & "))=0"  'votre système est francophone
          'sForm = "=lengte(spaties.wissen(" & .Cells(1).Address(0, 1) & "))=0"  'votre système est néérlandophone, mais est pour le moment commentaire
          MsgBox sForm & vbLf & "plage : " & .Address
          .FormatConditions.Add Type:=xlExpression, Formula1:=sForm     'colonne age est vide
          .FormatConditions(1).Interior.Color = vbRed

     'Création de la deuxième règle
          .FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="non"
          .FormatConditions(2).Interior.Color = vbBlue
     End With
    ActiveWorkbook.SaveAs Filename:="C:\Users\Eigenaar\Downloads\essai-mfc.xlsb" _
        , FileFormat:=xlExcel12, CreateBackup:=False
End Sub

re,

25essai-mfc.xlsb (22.36 Ko)

la plage est les colonnes C:F du tableau

re,

merci pour ce code mais je pense que je me suis mal exprimé.

si je ne me trompes pas le code actuel mais en rouge la ligne si la colonne age n'est pas rempli.

moi je souhaiterai mettre en rouge des que la case n'est pas remplit.

nb: je changerai la couleur après pour que cela n'agresse pas trop l'utilisateur, mais mon but est de mettre en relief les cases non remplit

re,

si je prends la formule mis dans la MFC via VBA:

=NBCAR(SUPPRESPACE($C3))=0

alors que je m'aimerais une formule du type:

=NBCAR(SUPPRESPACE(C3))=0

mais je ne sais pas faire

merci d'avance à toi

cdt

re,

c'est plus facile de faire cela sans VBA, non ?

Sub FormatageConditionnel()
     Dim sForm
     'Création de l'objet Range
     With Range("TableauR10")     'plage = ces colonnes de ce tableau
          .FormatConditions.Delete     'Supprime le formatage conditionnel existant dans cette plage

     'Création de la 1er règle
          MsgBox "l 'adresse que je veut utiliser est : " & .Cells(1).Address(0, 1)     'ligne relative, colonne absolute
          sForm = "=NBCAR(SUPPRESPACE(" & .Cells(1).Address(0, 0) & "))=0"  'votre système est francophone
          'sForm = "=lengte(spaties.wissen(" & .Cells(1).Address(0, 0) & "))=0"  'votre système est néérlandophone, mais est pour le moment commentaire
          MsgBox sForm & vbLf & "plage : " & .Address
          .FormatConditions.Add Type:=xlExpression, Formula1:=sForm     'colonne age est vide
          .FormatConditions(1).Interior.Color = vbRed

     'Création de la deuxième règle
          .FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="non"
          .FormatConditions(2).Interior.Color = vbBlue
     End With
End Sub

un grand merci à vous c génial

petite question très bête:

sommes nous limité dans le nb de MCF en VBA.

à partir de 6 j'ai un message d'erreur de type: erreur d'exécution type"9"

merci à vous

re,

6 MFCs, ce n'est pas beaucoup, non, cela n'est pas la cause, il manque quelque chose avec la formule ou ... de votre 6ième MFC. Difficile à dire quoi exactement ! Vous savez le réaliser manuellement ?

Un exemple bête avec 100 MFCs presque similaires, simplement pour vous montrer que le nombre n'est pas la problème.

24essai-mfc.xlsb (23.49 Ko)
Sub FormatageConditionnel()
     Dim sForm
     'Création de l'objet Range
     With Range("TableauR10")     'plage = ces colonnes de ce tableau
          .FormatConditions.Delete     'Supprime le formatage conditionnel existant dans cette plage

     'Création de la 1er règle
          For i = 1 To 100
               sForm = "=NBCAR(SUPPRESPACE(" & .Cells(i, i).Address(0, 0) & "))=0"     'votre système est francophone
               'sForm = "=lengte(spaties.wissen(" & .Cells(i, i).Address(0, 0) & "))=0"     'votre système est néérlandophone, mais est pour le moment commentaire
               .FormatConditions.Add Type:=xlExpression, Formula1:=sForm     'colonne age est vide
               .FormatConditions(i).Interior.Color = RGB(WorksheetFunction.RandBetween(0, 255), WorksheetFunction.RandBetween(0, 255), WorksheetFunction.RandBetween(0, 255))
          Next
     'Création de la deuxième règle
     '     .FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="non"
     '     .FormatConditions(2).Interior.Color = vbBlue
     End With
End Sub

bonjour

24essai-mfc.xlsx (11.59 Ko)

je pense bien que cela doit venir de moi

je vous joins mon erreur afin de pouvoir progresser

merci à vous

cdt

re,

c'est un "xlsx", donc sans VBA et je supposes que le dernier MFC était le problème. Il a maintenant le couleur vert. Si ce n'était pas cela, veuillez m'expliquer ce qu'il manque.

17essai-mfc-1.xlsx (17.34 Ko)

Bonsoir,

par rapport au premier message et fichier joint au troisième, je vous propose ceci :

Sub FormatageConditionnel()
    'Création de l'objet Range
    Dim MaPlage As Range
    Set MaPlage = Range("Tableau")

    'Supprime le formatage conditionnel existant dans cette plage
    MaPlage.FormatConditions.Delete

    'Création de la 1er règle
    MaPlage.FormatConditions.Add Type:=xlExpression, Formula1:="=NBCAR(SUPPRESPACE(" & Replace(MaPlage.Cells(1, 1).Address, "$", "") & "))=0"
    MaPlage.FormatConditions(1).Interior.Color = vbRed

    'Création de la deuxième règle
    MaPlage.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="non"
    MaPlage.FormatConditions(2).Interior.Color = vbBlue
End Sub

J'ai mis un "Replace" afin de supprimer les "$" dans l'adresse de la première cellule de donnée du tableau structuré ayant pour nom "Tableau".

Car en effet, vous aviez mis A1 je crois dans votre formule ou D1, mais la "première" cellule de la MFC est A3, du moins sur le fichier joint...

@ bientôt

LouReeD

Oui bon ben en fait j'arrive après la bagarre

BsAlv, le fait de mettre Cells(0,0) permet de retirer automatiquement les "$" ?

Va falloir que je l'enregistre celle-là !

@ bientôt

LouReeD

bonsoir,

désolé mauvais fichier

cdt

20essai-mfc.xlsb (13.77 Ko)

Bonsoir,

voilà avec le code de BsAlv simplifié :

21essai-mfc.xlsb (15.19 Ko)

@ bientôt

LouReeD

bonjour LouReeD, JeromeB, le fil,

mon code est fait en néerlandais et puis traduit, pour vous montrer la système, donc plus tard vous n'avez pas besoin de tout le "if...then...else ...endif", seulement la partie "else"

Pour les couleurs et patterns, le plus facile est d'utiliser le recorder des macros en changeant une cellule en le format désiré et de copier et coller le résultat de la macro. La même chose avec la formule et puis pour les addresses des cellules (relatives ou absolutes), il faut créer un string et le coller dans la macro. ET ... quand on a un " dans la formule, il faut le doubler !!!

    Sub FormatageConditionnel()
     'Création de l'objet Range
     Dim b, s, s1
     b = (Application.UserName = "BSA")     'l'ordinateur de BSA ?

     With Range("TableauR10")
          s = .Cells(1).Address(0, 0)  'addresse relative de la première cellule de cette plage

          .FormatConditions.Delete     'Supprime le formatage conditionnel existant dans cette plage

     '******************* Création de la 1er règle **************************
          If b Then
               .FormatConditions.Add Type:=xlExpression, Formula1:="=LENGTE(SPATIES.WISSEN(" & s & "))=0"       'colonne age est vide
          Else
               .FormatConditions.Add Type:=xlExpression, Formula1:="=NBCAR(SUPPRESPACE(" & s & "))=0"     'colonne age est vide
          End If
          With .FormatConditions(.FormatConditions.Count).Interior     'dans les parenthèses le plus grand numéro des FC (donc le dernier)
               .Color = RGB(255, 10, 10)     'sorte de rouge, 'à modifier
               .Pattern = xlCrissCross     'sorte de pattern
          End With

     '******************* Création de la 2ième règle **************************
          If b Then
               .FormatConditions.Add Type:=xlExpression, Formula1:="=OF(" & s & "=""non"";" & s & "=""Nok"")"
          Else
               .FormatConditions.Add Type:=xlExpression, Formula1:="=OU(" & s & "=""non"";" & s & "=""Nok"")"
          End If
          .FormatConditions(.FormatConditions.Count).Interior.Color = RGB(255, 0, 0)

     '******************* Création de la 3ième règle **************************
          s1 = .Cells(1, 7).Address(0, 0)     'addrese relative de la cellulle ligne 1, colonne 7 de cette plage
          With .Columns(7)     'uniquement la 7ième colonne !!!!
               If b Then
                    .FormatConditions.Add Type:=xlExpression, Formula1:="=VANDAAG()-" & s1 & "> 682"
               Else
                    .FormatConditions.Add Type:=xlExpression, Formula1:="=AUJOURDHUI()-" & s1 & "> 682"
               End If
               .FormatConditions(.FormatConditions.Count).Interior.Color = RGB(255, 255, 0)
          End With

     '******************* Création de la 4ième règle **************************
          s2 = .Cells(1, 9).Address(0, 0)     'addrese relative de la cellulle ligne 1, colonne 9 de cette plage
          With .Columns(9)     'uniquement la 9ième colonne !!!!
               If b Then
                    .FormatConditions.Add Type:=xlExpression, Formula1:="=VANDAAG()-" & s2 & "> 540"
               Else
                    .FormatConditions.Add Type:=xlExpression, Formula1:="=AUJOURDHUI()-" & s2 & "> 540"
               End If
               .FormatConditions(.FormatConditions.Count).Interior.Color = RGB(0, 255, 0)
          End With

     End With
End Sub
34essai-mfc-3.xlsb (24.33 Ko)

Bonjour,

merci pour ce retour, je vais travailler pour comprendre le code notamment lorsque sur une MCF je souhaite mettre 2 conditions du type:

.........>540 ==> case en jaune mais si .......>682==> case en rouge

cependant, petit question que veut dire:

Application.UserName = "BSA"

un grand merci à vous

amicalement

pour répondre a mon besoin sur votre code je l'ai modifier comme cela:

s1 = .Cells(1, 7).Address(0, 0) 'addrese relative de la cellulle ligne 1, colonne 7 de cette plage
With .Columns(7) 'uniquement la 7ième colonne !!!!
.FormatConditions.Add Type:=xlExpression, Formula1:="=AUJOURDHUI()-" & s1 & "> 682"
.FormatConditions(.FormatConditions.Count).Interior.Color = vbRed
.FormatConditions(.FormatConditions.Count).StopIfTrue = False
End With
With .Columns(7) 'uniquement la 7ième colonne !!!!
.FormatConditions.Add Type:=xlExpression, Formula1:="=AUJOURDHUI()-" & s1 & "> 540"
.FormatConditions(.FormatConditions.Count).Interior.Color = vbYellow
'
End With

cela fonctionne mais cette formulation est elle la plus simple?

merci à vous

cdt

bonjour,

avec votre essai.

Je penses que c'est presque le plus simple, comme on reste dans la 7ième colonne les 2 lignes suivantes peuvent disparaitre

End With
With .Columns(7) 'uniquement la 7ième colonne !!!!

Comme j'avais écrit la code sur mon ordinateur néerlandophone, VBA vérifie le "username" et le mien est "BSA". Comme ca, il savait qu'il devait prendre la ligne néerlandophone dans les "IF...EndIF"

super merci j'ai adapter et simplifier les lignes => merci à vous.

je continue a avancer et j'ai pu faire plusieurs MCF qui fonctionnent parfaitement.

petit bloquage :

'******************* Création de la 5ième règle recyclage PSE1**************************
S3 = .Cells(1, 57).Address(0, 0) 'addrese relative de la cellulle ligne 3, colonne 57 de cette plage
With .Columns(57) 'uniquement la 57ième colonne recyclage PSE1!!!!

.FormatConditions.Add Type:=xlExpression, Formula1:="=AUJOURDHUI()-" & S3 & "> 1050"
.FormatConditions(.FormatConditions.Count).Interior.Color = vbRed
.FormatConditions(.FormatConditions.Count).StopIfTrue = False

.FormatConditions.Add Type:=xlExpression, Formula1:="=AUJOURDHUI()-" & S3 & "> 930"
.FormatConditions(.FormatConditions.Count).Interior.Color = vbYellow

End With
'******************* Création de la 5 bis règle recyclage PSE1**************************
S31 = .Cells(1, 56).Address(0, 0) 'addrese relative de la cellulle ligne 3, colonne 56 de cette plage

If IsEmpty(S3) = True Then
With .Columns(56) 'uniquement la 56ième colonne recyclage PSE1!!!!

.FormatConditions.Add Type:=xlExpression, Formula1:="=AUJOURDHUI()-" & S31 & "> 1050"
.FormatConditions(.FormatConditions.Count).Interior.Color = vbRed
.FormatConditions(.FormatConditions.Count).StopIfTrue = False
MsgBox "vide"
End With
With .Columns(56)
.FormatConditions.Add Type:=xlExpression, Formula1:="=AUJOURDHUI()-" & S31 & "> 930"
.FormatConditions(.FormatConditions.Count).Interior.Color = vbYellow
End With
Else: MsgBox "non vide"
End If

mon but dans la seconde partie serait de dire si la case "X" de la colonne 57 est vide alors MFC de la cellule juxtaposé à la case " X-1" de la colonne 56=> MFC.

si la case X de la colonne 57 est remplit alors pas de MFC pour la Case "X-1" de la colonne56

je souhaite utiliser la variable S3 que vous avez créé mais cela ne fonctionne pas trop bien .

je ne sais pas si je suis très claire

merci d'avance à vous

cdt

Rechercher des sujets similaires à "mise forme conditionnelle vba"