Impossible de réinitialiser un format de police d'une MFC en VBA
Bonjour,
Je souhaite réinitialiser le format de police (et seulement le format de police) d'une MFC par macro.
Voici la ligne d'instruction que j'ai codé par exemple pour la propriété Gras :
MFC_Source.Font.Bold = NullJ'ai fourni un fichier xlsm en pièce jointe.
J'ai donné tout le détail directement sur la feuille de calcul :
- copie d'écran de la définition de la MFC avant et après exécution de la macro
- En ligne 19 à 22, les différents cas (Sans MFC, Avec MFC, Attendu après macro, MFC après macro).
Après exécution de la macro, on devrait avoir une réinitalisation du Style ("Gras" dans la MFC d'origine) , au lieu de cela, le Style est passé à "Normal".
De ce fait, le style "Italique" définie pour la plage (hors MFC) n'est pas conservé quand la condition de la MFC est vérifiée : les valeurs 100 et 120 sont en police "Normal" après Macro, elle devrait être comme la valeur 80 "en italique".
Voici le code complet de la macro
Sub TestPBMFC_Null()
' Changer le Format Font.Bold d'une MFC
' Problème pour affecter NULL (équivalent du bouton Effacer de la fenêtre "Format de cellule"
' J'ai mis en commentaires toutes les lignes qui m'ont juste permis d'afficher par msgbox
' les valeurs avant et après exécution dans tous les cas de figure
'----------------------------
' MFC_Source.Font.Bold = Vrai
'----------------------------
' Valeur Avant Valeur Après
' Vrai Vrai
' Faux Vrai
' Null Vrai
'----------------------------
' MFC_Source.Font.Bold = Null
'----------------------------
' Valeur Avant Valeur Après Valeur Attendue
' Vrai Faux Null
' Faux Faux Null
' Null Faux Null
Dim MFC_Source As FormatCondition
Dim Range_Source As Range
Dim Message As String
Dim Valeur As Variant
Sheets("Brouillon").Activate
Range("$E20:$E22").Select
Set Range_Source = Selection
For i = 1 To Range_Source.FormatConditions.Count
'Message = "MFC_Source.Font.Bold = Null" & vbCrLf
Set MFC_Source = Range_Source.FormatConditions(i)
'If IsNull(MFC_Source.Font.Bold) Then Valeur = "Null" Else Valeur = MFC_Source.Font.Bold
'Message = Message & "Avant -> " & Valeur & vbcrl
MFC_Source.Font.Bold = Null
'MFC_Source.Font.Bold = True
'If IsNull(MFC_Source.Font.Bold) Then Valeur = "Null" Else Valeur = MFC_Source.Font.Bold
'Message = Message & vbCrLf & _
"Après -> " & Valeur
'MsgBox Message
Next i
Fin:
Set Range_Source = Nothing
Set MFC_Source = Nothing
End SubJe cherche une solution par exemple qui correspondrait au bouton Effacer en bas à droite de la fenêtre "Format de cellule" de définition d'une MFC.
Merci d'avance
Bonjour,
SI j'ai bien compris:
MFC_Source.Font.Bold = False
MFC_Source.Font.Italic = TrueCdlt
Bonjour Arturo, et merci pour votre intérêt à mon problème
Vous n'avez pas bien compris mon problème, voici quelques compléments qui vont j'espère vous éclairer :
Par défaut, donc sans codage de MFC, la police de caractères est Italique - Normal
Dans la MFC d'origine, si la condition est vérifiée (valeur comprise entre 100 et 150),
- la cellule passe avec la Police Gras et le Fond en Rouge. Voir Cellules E20 à E22
Ce que je souhaite modifier en VBA , si la condition est vérifiée (valeur comprise entre 100 et 150),
- la cellule passe avec le Fond en Rouge sans modification de la police par défaut (donc conservation de l'italique). Voir Cellules G20 à G22
Ce que se passe avec mon code VBA "MFC_Source.Font.Bold = Null", si la condition est vérifiée (valeur comprise entre 100 et 150),
- la cellule passe avec le Fond en Rouge, la police passe en Normal. Voir Cellules I20 à I22
Pour bien voir ce qui se passe, successivement sur E20, G20, I20, faire :
Mise En Forme Conditionnelle -> Gérer les Règles -> Modifier la règle -> Format -> Police
Observer les Styles dans chaque cas :
MFC d'origine : E20 Gras
MFC attendu : G20 Aucun
MFC après Macro : I20 Normal
Bonjour,
Bon, pour une question de lisibilité, je n'ai conservé que l'essentiel de la macro:
Sub TestPBMFC_Null()
Dim Plage_MFC As Excel.Range, FC As Excel.FormatCondition
Application.ScreenUpdating = False
Sheets("Brouillon").Activate
Set Range_Source = Selection
Range("$E20").Select
Set Plage_MFC = Range("$E20:$E22") 'plage d'application de la MFC
Plage_MFC.FormatConditions.Delete 'Effacement des précédentes MFC
Set FC = Plage_MFC.FormatConditions.Add(Type:=xlExpression, Formula1:="=ET(E20>=100;E20<=150)") 'Formule appliquée
FC.Font.Bold = False 'police normal
FC.Interior.Color = RGB(255, 0, 0) 'Couleur rouge
FC.Font.Italic = True
Fin:
Set FC = Nothing
Set Plage_MFC = Nothing
End SubCependant, ce qui suit ne me paraît pas très clair, dans le dernier post, vous écrivez:
Ce que se passe avec mon code VBA "MFC_Source.Font.Bold = Null", si la condition est vérifiée (valeur comprise entre 100 et 150),
- la cellule passe avec le Fond en Rouge, la police passe en Normal. Voir Cellules I20 à I22
et dans le premier post:
Après exécution de la macro, on devrait avoir une réinitalisation du Style ("Gras" dans la MFC d'origine) , au lieu de cela, le Style est passé à "Normal".
*******************************************************************************************************************
Peu importe ce que vous voulez faire, avec le code que je vous ai fourni, il vous sera facile de l'adapter à votre guise.
Cdlt
Bonjour Arturo,
merci encore d'avoir réfléchi à mon problème.
Votre code ne correspond malheureusement pas à ma recherche :
il ne s'agit pas pour moi de coder en dur une règle MFC mais, pour une MFC existante, quelque soit sa définition, mais de modifier uniquement ses caractéristiques format, et en particulier, les caractéristiques de police (Gras, Italique ...).
Et çà bloque donc quand je souhaite réinitialiser une caractéristique, par exemple,
MFC_Source.Font.Bold = NullDans ma demande, je n'ai pas donné le pourquoi du besoin : Je souhaite copier le format appliqué d'une MFC source vers une MFC destination. C'est à dir ce que l'on positionne en faisant pour une règle MFC : Modifier la règle -> Format -> et sur l'onglet "Police" sélectionner le Style souhaité.
Et donc dans mon cas, lorsqu'un style est déjà présent, le mettre à vide, ce que l'on peut faire avec le bouton Effacer.
Pour la compréhension de mon précédent message, je vous invite à ouvrir et comparer les MFC de chaque cellule E20, G20, I20.
Et constater les différences des cellules E21, G21, I21 (où la condition est vraie) pour ce qui concerne la mise en italique.
En I21, j'attends Non Gras (ce qui est le cas) mais Italique (ce qui n'est pas le cas) à cause du style qui est passé à Normal et non vide (comme attendu).
La règle ne doit pas toucher la caractéristique Italique, seulement la caractéristique Gras.
MFC_Source.Font.Bold = NullCe ne peut être que "True" ou "false" et pas "Null"
C'est bien là mon problème :
Quand j'affecte null, çà passe à false (pisté avec le débogueur VBA).
MAIS, si vous faites dans Excel : Modifier la règle -> Format -> et sur l'onglet "Police" Bouton Effacer , çà passe bien à null.
C('est donc pour moi un bug d'Excel probablement dû au fait que la structure d'une MFC avec toutes ses propriétés est redéfinie en fonction du type de la MFC. Je sens que je ne suis pas clair. Vous pouvez regarder dans la fenêtre espion la structure d'une MFC en fonction de son type (expression, nuance de couleurs, jeux d'icones ...), les propriétés forlula1, operator ... oudes valeurs correctes ou qqchose du genre "méthode non gérée ...
Je crois comprendre ce que désirez, c'est le style de police qu'il faut mettre à null
MFC_Source.style = Nullj'avais essayé aussi, sans succès.
Pardon, comme ceci:
MFC_Source.Font.FontStyle = NullAlors, pour le moment j'ai plus d'idée.
Je reprends ma demande initiale par l'envoi d'un nouveau fichier qui va, j'espère, faciliter la lecture et la compréhension.
J'ai mis le maximum d'informations utiles dans la feuille :
- Copie des fenêtres de définition de la MFC d'origine
- En F23, une description avec des flèches qui renvoient sur les cellules ou images)
- Les différents formats (sans MFC, Avec la MFC d'origine, Attendu après macro, Test Macro) sont affichés en ligne 19 à 22 pour faciliter la comparaison.
- J'ai ajouté 2 boutons :
Réinitialisation pour Relancer le Test : La plage I19:I21 a sa MFC repositionnée avec Style Gras
Macro Bold -> Null : La MFC de la plage I19:I21 devrait être avec le Style à Vide
Bonjour,
En mettant" Bold" et "Italique" à "False", on obtient ce que vous souhaitez, exemple avec votre code modifié:
Sub TestPBMFC_Null()
On Error Resume Next
'*************************************************************************************
Dim Plage_MFC As Excel.Range, FC1 As Excel.FormatCondition, FC2 As Excel.FormatCondition
Range("I20").Select
Set Plage_MFC = Range("I20:I22")
Plage_MFC.FormatConditions.Delete
Set FC1 = Plage_MFC.FormatConditions.Add(Type:=xlExpression, Formula1:="=ET(I20>=100;I20<=150)")
FC1.Interior.Color = RGB(255, 0, 0)
FC1.Font.Color = RGB(0, 0, 0)
'les 2 conditions suivantes inhibent tous les styles
FC2.Font.Italic = False
FC2.Font.Bold = False
Set FC2 = Plage_MFC.FormatConditions.Add(Type:=xlExpression, Formula1:="=I20<100")
FC2.Interior.Color = RGB(255, 255, 255)
FC2.Font.Color = RGB(0, 0, 0)
FC2.Font.Italic = True
FC2.Font.Bold = False
Set Plage_MFC = Nothing
Set FC1 = Nothing
Set FC2 = Nothing
End SubCdlt
Bonjour,
non, ce n'est pas ce que je souhaite faire. Je vous rappelle une de mes réponses précédentes
il ne s'agit pas pour moi de coder en dur une règle MFC mais, pour une MFC existante, quelque soit sa définition, mais de modifier uniquement ses caractéristiques format, et en particulier, les caractéristiques de police (Gras, Italique ...).
Donc pas de Delete et de recréation de la MFC (Le code doit pouvoir s'appliquer sans connaitre les caractéristiques de la MFC) mais seulement
MFC_Source.Font.Bold = NullMerci quand même
bonjour clr, Arturo83,
il y a 2 MFCs maintenant et le valeur de C15 a une importance !!! Modifiez la par exemple en 1 ou 2 ou un autre valeur.
Votre macro n'a qu'à modifier C15.
Bonjour Bart,
c'est une astuce qui dans d'autres cas pourrait être intéressante mais ne correspond pas à mon besoin. Je rappelle une réponse précédente
il ne s'agit pas pour moi de coder en dur une règle MFC mais, pour une MFC existante, quelque soit sa définition, mais de modifier uniquement ses caractéristiques format, et en particulier, les caractéristiques de police (Gras, Italique ...).
Donc pas de Delete et de recréation de la MFC (Le code doit pouvoir s'appliquer sans connaitre les caractéristiques de la MFC)
par exemple, c20:c22 sont les formats avant MFC et ces formats doivent donc être ceux conservés si la condition n'est pas vérifiée (pour la caractéristique Italique, non italique). Essayez par exemple de passer c20:c22 à Italique puis non italique => I20:I22 devraient avoir la m^me caractéristique (Italique non Italique) que c20:c22.
De plus, ma demande rentre dans un cadre plus large de gestion des MFC (copie de MFC - copie uniquement de mise en forme d'une MFC vers un autre ...)
Etr je ne peux évidemment pas passer par l'astuce que vous proposez.
Merci quand même
vous pouvez faire tout ce que vous voulez, le format conditionel, en cas que c'est vrai, est toujours supérieur au format normal. Donc en VBA il n'y a pas de possibilité de sursauter cela. Il faut le faire dans le MFC.
Je ne veux pas ergoter, mais je persiste par rapport à ce que j'ai indiqué par ailleurs, Faire Font.bold = Null et avoir en sortie = False est une anomalie VBA, donc de Microsoft. Anomalie mineure qui vient s'ajouter à une longue liste.
Excel reste un outil très puissant qui ne cesse de m'étonner avec parfois des bizarreries.
J'ai une version 2016 Famille et ne bénéficie pas des versions 365, sans cesse améliorées, je pense en particulier à la fonction RECHERCHEX bien plus performante que RECHERCHEV. Mais je n'ai pas envie de raquer 2 fois ...
re,
vous pensez trop difficile, trop compliqué.