Impossible de réinitialiser un format de police d'une MFC en VBA

27mfc-null.xlsm (66.82 Ko)

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 = Null

J'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 Sub

Je 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 = True

Cdlt

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 Sub

Cependant, 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 = Null

Dans 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 = Null

Ce 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 = Null

j'avais essayé aussi, sans succès.

Pardon, comme ceci:

MFC_Source.Font.FontStyle = Null

oui, déjà essayé

Alors, 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

18mfc-null.xlsm (66.46 Ko)

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 Sub

Cdlt

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 = Null

Merci 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.

11mfc-null-xlsb.xlsm (70.64 Ko)

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é.

Rechercher des sujets similaires à "impossible reinitialiser format police mfc vba"