MFC par rapport à cellule sélectionnée

Bonjour,

Je souhaite configurer une macro simple, pour mettre en avant toutes les cellules d'une feuille correspondant (précision complémentaire, seuls les 8 1er caractères m'intéresse) à la séléction actuelle.

Ci-dessous mon code en cours.

Sub Macro5()
'
' Macro5 Macro : Mise en forme conditionnelle de toutes les cellules de la feuille = à la sélection actuelle au moment de lancer la macro
' Etant novice en vba, je suis parti de l'enregistreur de macro

'

' Je souhaite remplacer "S9" par la cellule active
    Range("S9").Select

' Je souhaite copier le contenu de la cellule et ne prendre que les 8 premiers caractères
    ActiveCell.FormulaR1C1 = "K1141153 a1"
    Range("S9").Select
    Selection.FormatConditions.Add Type:=xlTextString, String:="K1141153", _
        TextOperator:=xlContains
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorDark1
        .TintAndShade = -0.14996795556505
    End With
    Selection.FormatConditions(1).StopIfTrue = False
End Sub

A vous lire

Bonsoir,

pour une réponse rapide il est préférable de mettre un fichier en support

Ceci dit j'en ai fais un en essayant de comprendre le problème.

21test-loureed.xlsm (16.84 Ko)

Il y a un bouton pour lancer la macro.

Si la correspondance des 8 premiers caractères n'est pas bonne alors il n'y a pas de couleurs

@ bientôt

LouReeD

Bonsoir,

Pour te simplifier un peu :

Sub Macro5()
' Macro5 Macro : Mise en forme conditionnelle de toutes les cellules de la feuille = à la sélection actuelle au moment de lancer la macro
    Dim frm$
    frm = Left(ActiveCell.Value, 8)
    frm = "=GAUCHE(A1;8)=""" & frm & """"
    With ActiveSheet.UsedRange
        .FormatConditions.Delete
        With .Cells.FormatConditions.Add(xlExpression, , frm)
            .Interior.Color = RGB(217, 217, 217)
        End With
    End With
End Sub

Explications :

1) Si tu ne supprimes pas la précédente chaque fois que tu lances ta macro, cela va faire vite un méli-mélo...

2) L'enregistreur te détaillles toutes tes sélections que tu es obligé de faire en manuel, mais on peut aller droit au but en VBA !

3) Plus simple d'utiliser une formule, compte-tenu de ta formulation de condition...

4) Pour la couleur, comme tu sélectionnes dans les thèmes affichés, l'enregistreur ne renvoie pas la valeur RGB, mais il est cependant plus simple de passer par cette valeur dans le code (2 lignes de moins)

5) L'enregistreur t'ajoute la valeur par défaut des propriétés que tu n'utilises pas... Inutile de les reprendre, elles resteront à leur valeur par défaut !

Cordialement.

MFerrand a écrit :

Bonsoir,

Pour te simplifier un peu :

Sub Macro5()
' Macro5 Macro : Mise en forme conditionnelle de toutes les cellules de la feuille = à la sélection actuelle au moment de lancer la macro
    Dim frm$
    frm = Left(ActiveCell.Value, 8)
    frm = "=GAUCHE(A1;8)=""" & frm & """"
    With ActiveSheet.UsedRange
        .FormatConditions.Delete
        With .Cells.FormatConditions.Add(xlExpression, , frm)
            .Interior.Color = RGB(217, 217, 217)
        End With
    End With
End Sub

Explications :

1) Si tu ne supprimes pas la précédente chaque fois que tu lances ta macro, cela va faire vite un méli-mélo... Pas compris

2) L'enregistreur te détaillles toutes tes sélections que tu es obligé de faire en manuel, mais on peut aller droit au but en VBA ! Je comprend, me reste à apprendre la syntaxe

3) Plus simple d'utiliser une formule, compte-tenu de ta formulation de condition... idem point précedent

4) Pour la couleur, comme tu sélectionnes dans les thèmes affichés, l'enregistreur ne renvoie pas la valeur RGB, mais il est cependant plus simple de passer par cette valeur dans le code (2 lignes de moins) Compris

5) L'enregistreur t'ajoute la valeur par défaut des propriétés que tu n'utilises pas... Inutile de les reprendre, elles resteront à leur valeur par défaut ! un exemple de propriété inutile svp

Cordialement.

Merci pour vos réponses rapides !

Alors mis à part le fait que je ne comprenne pas trop la structure de vos codes, c'est quasiment la manip que je cherchais.

Comme je souhaite que les cellules "coloriées" le reste au fur et a mesure que je lance la macro sur d'autres cellules, j'ai supprimé la ligne " .FormatConditions.Delete"

Bonne journée.

Bonjour,

Le code étant plus épuré, tu devrais plus facilement comprendre chaque ligne...

Supprimer les MFC antérieures n'est pas une obligation, bien sûr ! Mais il est alors judicieux de prévoir une procédure autonome pour les supprimer, car à force d'en ajouter il y a un moment où tu ne verras plus rien... Facile : une ligne de code comme tu as pu voir : ActiveSheet.UsedRange.FormatConditions.Delete

UsedRange pointe la plage d'une feuille utilisée...

Des propriétés inutiles produites par l'enregistreur : .Pattern.ColorIndex=xlAutomatic qui t'indique que tu dotes de sa couleur par défaut (qui ne change pas si tu n'en mets pas d'autre) le motif que tu n'utilises par ailleurs pas (et qui ne va pas se mettre tout seul (grille, points, stries....) ! C'est un exemple type !

Pour TintAndShade, c'est un peu particulier, sa valeur par défaut est 0, inutile de l'avoir dans ce cas. Si tu définis les couleurs avec RGB, cette valeur est inutile. Il s'agit de variation de luminosité nuançant la couleur. Dans le cas où ta couleur est définie par le thème de couleur, il joue un rôle. Là tu le définiras pas sans l'enregistrer ! (Mais l'affectation d'une valeur RGB est tout de même plus maîtrisable).

Dans ton cas on avait aussi les rebonds : Création de la MFC, sélection, affectations des propriétés de mise en forme à cette sélection. Cela reproduit ce que tu fais manuellement. Mais en VBA, tu n'as pas besoin de passer par là : tu mémorises d'entrée avec With la MFC créée et tu poursuis sans avoir à sélectionner, une action de moins ! (donc plus rapide).

Aussi : SetFirstPriority et StopIfTrue ! Note que quand tu mets manuellement en place une MFC, tu ne te préoccupe généralement pas de ces 2 propriétés (cela peut venir après coup, quand tu en as plusieurs qui se chevauchent). Tu laisses faire Excel au départ. Il est sage de faire pareil en VBA et ne pas les mentionner.

Ce qui ne veut pas dire qu'elle sont inutiles, mais si tu as essayé de jouer sur la priorité en réordonnant tes MFC et sur l'arrêt d'appliquer les suivantes sur une même cellule lorsqu'une condition est vraie (lorsque plusieurs MFC sont concurrentielles sur la même cellule), tu sauras que ce n'est pas facile à régler manuellement et en manuel tu as l'avantage de voir sur quelle MFC tu agis.

Or en VBA, l'objet FormatConditions n'a pas de nom, seulement une index (1, 2, 3...) que tu ne maîtrises pas, la dernière entrée est la 1...

Donc : cas général, ignorer ces propriétés, et quand on a à intervenir sur des MFC existantes, on supprime et on recrée. Par ailleurs, lorsque tu as des manipulations dans ton fichier qui aboutissent à fractionner les MFC : tris, insertions ou suppressions de lignes... la solution est généralement de les supprimer et recréer (par VBA) à chaque ouverture de classeur pour que la situation demeure gérable.

Cas particulier : tu dois rentrer un lot de MFC dont certaines sont concurrentielles, tu le fais dans un ordre déterminé et tu uses éventuellement du StopIfTrue à bon escient à un moment où tu sais dans quel ordre elles sont rentrées... (ce cas est rare !)

Cordialement et bonne journée.

Bonjour le forum,

bonjour Maréchal

En fait je m'aperçois que je ne vais pas plus loin que la question posée...

Du coup je reprend en grande partie les codes envoyés, et je les laisse dans leur jus, juste en apportant mes aromates !!!

Soit ça marche (quelque fois) mais au niveau code je n'enseigne rien car je devrais à mon niveau corriger ces petites imperfections...

Veuillez m'en excuser...

@ bientôt

LouReeD

Re-re-... LouReed

re re re re ...

Hey ! c'est comme même pas moi qui ait plus de 4000 messages en moins d'un an !!!! Que dis-je presque 5000 !!!

Alors oui quand je passe je dis bonjour

@ bientôt (très ?)

LouReeD

Re

Lorsque que j'exécute successivement cette macro qui colorie les cellules, y'a t'il un "bloc note" qui sauvegarde toutes les conditions afin de pouvoir vérifier et supprimer une condition antérieur ?

Rechercher des sujets similaires à "mfc rapport selectionnee"