MFC ne semble pas fonctionner [vba]

  • Initiateur de la discussion Initiateur de la discussion grodep
  • 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 !

grodep

XLDnaute Occasionnel
bonjour à tous, je patauge toujours dans la construction de mon tableau, j'ai écrit un bout de code(surement trop long mais là n'est pas le souci du moment) pour créer une mfc sur un ensemble de cellules.
voici le code
Code:
For i = 2 To S Step 3

Cells(i, 2).Select
  With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 65535
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
        " =countif(RC(6):RC(31),RC)>3"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 5287936
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
    
Next i

en prenant pour exemple la cellule (2,2), je vérifie que la mfc est chargée et c'est bien le cas. Pourtant, si sur la ligne 2, dans la plage prévue( 6 à 31), j'inscris à 4 reprises la meme valeur que la cellule (2,2), rien ne se passe.

Quelqu'un peut-il éclairer ma lanterne?

Nb: j'aimerai également comprendre comment remplacer dans la formule countif les valeurs 6 et 31 par des variables, mais je ne trouve pas la syntaxe correcte.
Merci d'avance
 
Re : MFC ne semble pas fonctionner [vba]

Bonjour

un code avec enregistreur de macro et modifié pour variables

Code:
   For i = 2 To 10
    Cells(i, 2).Select
    Selection.FormatConditions.Delete
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
        "=NB.SI(C" & i & ":K" & i & ";B" & i & ")>3"
    Selection.FormatConditions(1).Interior.ColorIndex = 43
    Next

a adapter

pour modifier les colonnes via des variables, appliquer le priincipe retenu sur la ligne "NB.SI" : le texte est entre guillemets et les variables sans guillemets, avec des & pour concaténer
 
Re : MFC ne semble pas fonctionner [vba]

merci pour la macro, moi aussi j'avais utilisé l'enregistreur pour m'aider à la construire.
Cela étant, je ne comprends toujours pas comment remplacer les colonnes par des variables : pour les lignes, pas de problèmes, il s'agit de nombres, donc avec une boucle for to next, on balaie les plages qu'on souhaite, mais pour les "lettres" représentant les colonnes, je vois pas comment faire. Sauf à changer les formules afin d'utiliser une formule du type formulaR1C1 ="fonctionsouhaitée(RC(" & i & ".... "
 
Re : MFC ne semble pas fonctionner [vba]

bon j'ai avec l'aide d'excel-lent réussi à écrire correctement mon code, mais pour autant la cellule ne "réagit" pas lorsque la condition de la mfc est remplie
voici le code :
Code:
For i = 2 To 8 Step 3
db = 6
fn = 30
For o = 2 To 7
Cells(i, o).Select
Selection.FormatConditions.Delete
  With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 65535
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
        " =NB.SI(RC(" & db & "):RC(" & fn & "),RC)>2"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 5287936
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
    fn = fn - 1
    db = db - 1
    Next o
    Next i
telle que je pense avoir écrit la mfc, voici comment elle devrait fonctionner
exemple :
A1: chou
si en A10, A11 et A15, on trouve aussi la valeur 'chou', alors la cellule A1 est peinte en vert.

mais dans les faits, rien ne se passe...

merci à tous les contributeurs.
 
Re : MFC ne semble pas fonctionner [vba]

Re grodep, bonsoir Eric, bonsoir à toutes et à tous 🙂

Envoyé par grodep
bon j'ai avec l'aide d'excel-lent réussi à écrire correctement mon code, mais pour autant la cellule ne "réagit" pas lorsque la condition de la mfc est remplie
voici le code :
Code:
For i = 2 To 8 Step 3
db = 6
fn = 30
For o = 2 To 7
Cells(i, o).Select
Selection.FormatConditions.Delete
  With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 65535
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
        " =NB.SI(RC(" & db & "):RC(" & fn & "),RC)>2"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 5287936
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
    fn = fn - 1
    db = db - 1
    Next o
    Next i
telle que je pense avoir écrit la mfc, voici comment elle devrait fonctionner
exemple :
A1: chou
si en A10, A11 et A15, on trouve aussi la valeur 'chou', alors la cellule A1 est peinte en vert.

mais dans les faits, rien ne se passe...

Prenons l'exemple pour la 1ère exécution de ta boucle :

i = 2
db = 6
fn = 30
o = 2

Tu sélectionnes Cells(i, o), i.e. Cells(2, 2) soit la cellule B2.

Décortiquons la formule de ton format conditionnel :

" =NB.SI(RC(" & db & "):RC(" & fn & "),RC)>2"

Elle est syntaxiquement correcte et compte tenu des valeurs de db et fn, cela donne :

" =NB.SI(RC(6):RC(30),RC)>2"

En vérifiant la formule de ton format conditionnel avec la cellule B2 active, tu liras :

=NB.SI(H2:AF2,B2)>2

Tu as indiqué les colonnes relatives à la colonne B : début 6 colonnes plus loin, soit colonne H, et fin 30 colonnes plus loin, soit colonne AF, le tout sur la même ligne R.

Or, tu écris :
telle que je pense avoir écrit la mfc, voici comment elle devrait fonctionner
exemple :
A1: chou
si en A10, A11 et A15, on trouve aussi la valeur 'chou', alors la cellule A1 est peinte en vert.

Pour que cela soit le cas, il faudrait que tu commences à la colonne 1, ligne 1 pour ta formule conditionnelle, or elle est inscrite en colonne 2, ligne 2 (je l'ai déjà ecrit : B2). De plus, tu cherches dans les lignes sous la cellule qui contient ta MFC alors que ton code fait rechercher dans les colonnes à droite de celle-ci.

Je pense qu'il faut un peu revoir ta copie.

Pour info (au cas où) :

Cells(Ligne, Colonne)

RC signifie Row/Column (ligne/colonne).

Si tu souhaites chercher dans les lignes sous ta cellule à MFC, il faut que tu utilises R(décalage)C et non RC(décalage).

Bon courage 🙂

@+
 
Re : MFC ne semble pas fonctionner [vba]

Bonjour

juste une réponse pour les colonnes, exemple

i = 2
a = Chr(64 + i)

si i = 2, a prend alors la valeur B
on peut recomposer les colonnes de cette façon

là je file bosser
 
Re : MFC ne semble pas fonctionner [vba]

Je ne dirais qu'un seul mot : saucisse!!!
suis vraiment une grosse tache ..

désolé pour ces ennuis imaginaires

et merci à eric S pour cette nouvelle solution
 
Dernière édition:
Re : MFC ne semble pas fonctionner [vba]

bon ben, corrigé afin que la mfc s'applique aux lignes et non aux colonnes(vraiment quelle burne!!), la mfc ne fonctionne toujours pas. Si joint un fichier avec le bout de code récalcitrant au cas où une bonne ame pourrait y jeter un oeil...
merci d'avance

NB: je précise a toute fin utile qu'il est enregistré à partir d'xl 2007 au format 97-2003
 

Pièces jointes

Re : MFC ne semble pas fonctionner [vba]

Re 🙂

bon ben, corrigé afin que la mfc s'applique aux lignes et non aux colonnes(vraiment quelle burne!!), la mfc ne fonctionne toujours pas. Si joint un fichier avec le bout de code récalcitrant au cas où une bonne ame pourrait y jeter un oeil...
merci d'avance

NB: je précise a toute fin utile qu'il est enregistré à partir d'xl 2007 au format 97-2003

Ok, pour ta version d'XL. Je n'ai pas toutes ces options dans FormatConditions mais peu importe pour l'exemple. Une question avant de te proposer un code : as-tu une version française d'XL2007 ou américaine (anglaise) ?

@+

PS : dans ton exemple, ce sont bien les colonnes qui sont à prendre en compte puisque les valeurs sont sur la même ligne 😉
 
Re : MFC ne semble pas fonctionner [vba]

Re 🙂



Ok, pour ta version d'XL. Je n'ai pas toutes ces options dans FormatConditions mais peu importe pour l'exemple. Une question avant de te proposer un code : as-tu une version française d'XL2007 ou américaine (anglaise) ?
il s'agit d'une version américaine que j'ai patché en français. Ce qui est étrange effectivement, c'est qu'en utilisant l'enregistreur de macro, il m'a parfois donné la formule avec nb.si et parfois avec counta. Je n'ai pas fait suffisament d'essai pour débrouiller cette histoire. peut etre devrais je fouiller de ce coté pour voir si cela fonctionne avec l'un ou avec l'autre.

PS : dans ton exemple, ce sont bien les colonnes qui sont à prendre en compte puisque les valeurs sont sur la même ligne 😉
raaa mais c'est pas possible d'être aussi neuneu et de s'embrouiller à ce point... donc OUI c'est bien sur les colonnes que doit jouer ma mfc, puisque les cellules à vérifier sont toutes sur la meme ligne 😛*
 
Re : MFC ne semble pas fonctionner [vba]

Salut,

voir si cela convient.
J'ai supprimé les lignes, version 2007, qui ne fonctionnaient pas avec la mienne !
Code:
Sub TESTMFC()
  For li = 2 To 15 Step 3
    For col = 2 To 8
      Cells(li, col).Select
      Selection.FormatConditions.Delete
      Selection.Interior.Color = 65535
      Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
        "=NB.SI($I$" & li & ":$M$" & li & ";" & Chr(64 + col) & li & ")>1"
      Selection.FormatConditions(1).Interior.Color = 5287936
    Next
  Next
End Sub
 

Pièces jointes

Re : MFC ne semble pas fonctionner [vba]

et bien grand merci ça fonctionne parfaitement! mais, car il y a toujours un mais..
je souhaite que cette formule prenne en compte des variables, car la plage à explorer sera de taille variable selon les cas.
M'inspirant de ta formule, j'ai tenté de remplacer "I" et "M" par des variables en utilisant chr, ce qui fonctionne jusqu'à ... la limite de l'utilisation de chr : il n'y a aucun charcode pour désigner AA, AB, etc,etc ! du coup je suis dans la mouise..
faut il procéder à du bricolage en mettant deux chr accolés basés sur un modulo 26 du style Chr(64+2) & Chr(64+20) si je veux désigner la colonne BT ?
du style (en prenant pour exemple j, la variable qui détermine la dernière colonne de la plage à prendre en compte) :
Code:
j=53
i = WorksheetFunction.RoundDown((j / 26), 0)
S = j - i * 26
.Value = Chr(64 + i) & Chr(64 + S)

c'est pas que ça me gene de faire comme ça, mais bon c'est vraiment du code bricolé à la p'tite semaine, je suis sur que y a mieux à faire, mais c'est hors de mon maigre champ de connaissances actuelles...

merci en tout cas pour le débugage de ma mfc, je retiendrais que visiblement on ne peut pas appliquer une formule de type RC pour des mfc.
 
Dernière édition:
Re : MFC ne semble pas fonctionner [vba]

Quand je dis que ça bricole !! voilà le résultat final pour réussir à mettre en place une mfc sur un nombre de cellules variables, dans un nombre de lignes et de colonnes variables également sur des plages de cellules également variables...
Code:
aa = aa - 1
col1 = WorksheetFunction.RoundDown((j / 26), 0)
    col2 = j - col1 * 26
    If col2 = 0 Then col2 = 1
If j > 26 Then
    
    For i = 2 To S Step 2
    For o = 2 To aa
        Cells(i, o).Select
         Selection.FormatConditions.Delete
        Selection.Interior.Color = 65535
         Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
          "=NB.SI($" & Chr(65 + aa) & "$" & i & ":$" & Chr(64 + col1) & Chr(64 + col2) & "$" & i & ";" & Chr(64 + o) & i & ")>=1"
        Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 5287936
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
          "=NB.SI($" & Chr(65 + aa) & "$" & i & ":$" & Chr(64 + col1) & Chr(64 + col2) & "$" & i & ";" & Chr(64 + o) & i & ")>=3"
        Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 255
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
        Next o
     Next i
Else:
For i = 2 To S Step 2
    For o = 2 To aa
        Cells(i, o).Select
         Selection.FormatConditions.Delete
        Selection.Interior.Color = 65535
         Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
          "=NB.SI($" & Chr(65 + aa) & "$" & i & ":$" & Chr(64 + j) & "$" & i & ";" & Chr(64 + o) & i & ")>=1"
        Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 5287936
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
     Selection.Interior.Color = 65535
         Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
          "=NB.SI($" & Chr(65 + aa) & "$" & i & ":$" & Chr(64 + j) & "$" & i & ";" & Chr(64 + o) & i & ")>=3"
        Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 255
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
        Next o
     Next i
End If
aa = aa + 1

dire que certains sont capables de remplacer tout ce fouillis par quelques lignes adroitement écrites...
mais bon, au moins ça fonctionne, c'est un bon début !!

encore merci à tous les contributeurs
 
Re : MFC ne semble pas fonctionner [vba]

Bonjour le fil, bonjour à toutes et à tous 🙂

Envoyé par grodep
Quand je dis que ça bricole !! voilà le résultat final pour réussir à mettre en place une mfc sur un nombre de cellules variables, dans un nombre de lignes et de colonnes variables également sur des plages de cellules également variables...
Code:
aa = aa - 1
col1 = WorksheetFunction.RoundDown((j / 26), 0)
    col2 = j - col1 * 26
    If col2 = 0 Then col2 = 1
If j > 26 Then
    
    ' Instructions

         Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
          "=NB.SI($" & Chr(65 + aa) & "$" & i & ":$" & _
          Chr(64 + col1) & Chr(64 + col2) & "$" & i & ";" & Chr(64 + o) & i & ")>=1"
    ' Autres instructions

    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
          "=NB.SI($" & Chr(65 + aa) & "$" & i & ":$" & _
          Chr(64 + col1) & Chr(64 + col2) & "$" & i & ";" & Chr(64 + o) & i & ")>=3"

    ' Dernières instructions du If j > 26 Then

Else
    
    ' Instructions du Else

         Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
          "=NB.SI($" & Chr(65 + aa) & "$" & i & ":$" & _
          Chr(64 + col1) & Chr(64 + col2) & "$" & i & ";" & Chr(64 + o) & i & ")>=1"
    ' Autres instructions du Else

    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
          "=NB.SI($" & Chr(65 + aa) & "$" & i & ":$" & _
          Chr(64 + col1) & Chr(64 + col2) & "$" & i & ";" & Chr(64 + o) & i & ")>=3"

    ' Dernières instructions du Else

End If
aa = aa + 1

Voici une alternative à ton code :

1) tu déclares une variable supplémentaire StrCol As String, et juste après l'instruction :

aa = aa - 1

tu ajoutes ces 2 lignes de code :

StrCol = IIf((j + 1) \ 26 > 0, Chr((j + 1) \ 26 + 64), "")
StrCol = StrCol & Chr(j - ((j + 1) \ 26) * 26 + 64)

et au lieu d'écrire

Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
"=NB.SI($" & Chr(65 + aa) & "$" & i & ":$" & _
Chr(64 + col1) & Chr(64 + col2) & "$" & i & ";" & Chr(64 + o) & i & ")>=1"

tu remplaces , dans l'expression :

Chr(64 + col1) & Chr(64 + col2)

par StrCol, ainsi :

Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
"=NB.SI($" & Chr(65 + aa) & "$" & i & ":$" & _
StrCol & "$" & i & ";" & Chr(64 + o) & i & ")>=1"

Et tu as une expression générique qui t'évite le If j > 26 Then ... Else ... End If.

@+

EDIT : J'avais mis "Col" au lieu de j

EDIT 2 : Je n'y avais pas fait attention, mais je suppose que Chr(65 + aa) est une erreur et doit être remplacé par Chr(64 + aa)
 
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

  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
1 K
Réponses
9
Affichages
767
  • Question Question
Microsoft 365 comparaison texte
Réponses
5
Affichages
759
  • Question Question
Microsoft 365 colorer une plage
Réponses
2
Affichages
923
Réponses
22
Affichages
3 K
Réponses
8
Affichages
1 K
Retour