Mise en forme conditionnelle

Bonjour à tous.

Question sur les "mise en forme conditionnelle".

J'ai

=ET($D4>=AUJOURDHUI();$D5<=AUJOURDHUI()) =$C$4:$F$1000

Comment protéger cette formule lorsque je lance une requête qui ajute une ligne?

Résultat aprés l'ajout de la ligne 8.

[b]=ET($D4>=AUJOURDHUI();$D5<=AUJOURDHUI()) =$D$8:$F$8

=ET($D4>=AUJOURDHUI();$D5<=AUJOURDHUI()) =$C$8

=ET($D4>=AUJOURDHUI();$D5<=AUJOURDHUI()) =$C$4:$F$7;$C$9:$F$1000[/b]

Comment dois je m'y prendre pour conserver que :

=ET($D4>=AUJOURDHUI();$D5<=AUJOURDHUI()) =$C$4:$F$1000

Merci d'avance

Annette

Bonjour,

Les deux choses ne font pas bon ménage !

Soit tu n'utilises pas la mise en forme conditionnelle et procède autrement, soit tu la supprimes et la rétablis à chaque fois, selon le plus simple...

Cordialement.

Bonsoir

Merci pour la réponse claire.Pour aboutir , peut on supprimer en VBA les "mise en forme conditionnelle" de la feuille, puis la recréer en VBA? (Je n'ai que 2 " mise en forme conditionnelle" dans cette feuille.

Merci

Bonne soirée

Bonjour,

Pour supprimer :

plage.FormatConditions.Delete

plage doit inclure toutes tes plages d'application de formats conditionnels (si plusieurs distinctes), de façon à tout éliminer en une seule fois.

Pour ajouter (là, plage définit la plage d'application du format) :

plage.FormatConditions.Add(xlExpression, , "=ET($D4>=AUJOURDHUI();$D5>=AUJOURDHUI())").Interior.Color = vbRed

Là on définit pour plage un format conditionnel basé sur une formule (xlExpression), pour colorer en rouge les cellules de plage pour lesquelles la conditions est vraie.

[Formulation compacte en une seule ligne de commande]

Si ton format est différent, tu modifies bien sûr sa définition.

Si plusieurs éléments de format, tu démultiplies avec With.

Tu peux aussi affecter ta formule à une variable...

fml = "=ET($D4>=AUJOURDHUI();$D5>=AUJOURDHUI())"
With plage.FormatConditions.Add(xlExpression, , fml)
    .Interior.Color = vbYellow
    With .Font
        .Bold = True
        .Color = vbRed
    End With
End With

Là, tu définis un format cellule en jaune, caractères en gras et rouge.

(Pour des couleurs plus personnalisées, tu utilises RGB...)

Cordialement.

Bonjour du jour

La procédure suivante ne fonctionne pas. Où est l'erreur.

Merci d'avance.

Private Sub Workbook_Open()

Application.EnableEvents = False
ActiveSheet.Protect UserInterfaceOnly:=True 'evite de déprotéger la feuille
ActiveSheet.Unprotect 'déprotéger pour les actions de la procédure
debut = Range("B1") ' première ligne
fin = Range("A1")   ' dernière ligne

    Rows("2:1000").Select
    Selection.EntireRow.Hidden = True

    Rows(debut & ":" & fin).Select
    Selection.EntireRow.Hidden = False

Range("C" & debut & ":F" & fin).Select
plage.FormatConditions.Delete
fml = "=ET($D4>=AUJOURDHUI();$D5>=AUJOURDHUI())"
With plage.FormatConditions.Add(xlExpression, , fml)
    .Interior.Color = vbYellow
    With .Font
        .Bold = True
        .Color = vbRed
    End With
End With

ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:=False
Application.ScreenUpdating = True 'masque l'affichage à l'écran (fin)
Application.EnableEvents = True
    ActiveWindow.Zoom = 150

End Sub

annette

Tu te fous de moi... ! D'où sort cette procédure à la c.. !!

je pensai ........

1) A l'ouverture de la procédure mettre en affichage les lignes renseignées.

2) Remettre la "mise en forme conditionnelle" si à l'ouverture précédente il y a eu un ajout de ligne.

Bon........

Annette

On ne colle du code n'importe comment à l'intérieur d'une macro existante... mais s'il n'y avait que ça !

Démontage explicatif :

En préalable : règle 1 : on indente le code (ça permet de le lire sans effort inutile)

règle 2 : on déclare ses variable, toutes ses variables, en tête de procédure.

1er lot de code :

Private Sub Workbook_Open() 'On est dans l'évènement ouverture du classeur
    Dim debut%, fin% 'Je réserve pour insérer déclarations de variables au fur et à mesure
    Application.EnableEvents = False 'On interrompt l'interception des évènements !!!
    ' Pour le faire à l'ouverture, il doit y avoir une bonne raison, laquelle ?
    ActiveSheet.Protect UserInterfaceOnly:=True 'evite de déprotéger la feuille
    ActiveSheet.Unprotect 'déprotéger pour les actions de la procédure
    'A l'ouverture, on ne sait pas quelle est la feuille active ! sauf s'il n'y en a qu'une !
    'Mais même dans ce cas, il vaut mieux qualifier.
    'Ensuite, pourquoi protéger pour déprotéger immédiatement !
    'surtout qu'on ne reprotège pas à la fin !
    'Tout un tisse d'incohérences qui mérite d'être expliqué (et rectifié éventuellement)
    debut = Range("B1") ' première ligne
    fin = Range("A1")   ' dernière ligne
    'Qu'y a-t-il dans B1 ? Et dans A1 ?
    'La suite quand on aura déjà débrouillé ce démarrage

Les questions à éclaircir sont mises en commentaires dans le code.

Merci encore _ pour suite a donner

Private Sub Workbook_Open()
Dim debut%, fin%

'Par habitude, je joins les 3 lignes suivantes au début de mes procédures
   Application.EnableEvents = False
   ActiveSheet.Protect UserInterfaceOnly:=True 'evite de déprotéger la feuille
   ActiveSheet.Unprotect 'déprotéger pour les actions de la procédure

    Sheets("Feuil1").Select

debut = Range("B1") ' =SOMME(B2:B1000) dans  B2:B1000   =SI(ET(E3<>"";E2="");LIGNE();"")
fin = Range("A1")   ' =SOMME(A2:A1000) dans  A2:A1000   =SI(ET(D4<>"";D5="");LIGNE();"")
-
-
-
-
-
'Par habitude, je joins les 3 lignes suivantes en fin de mes procédures
ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:=False
Application.ScreenUpdating = True 'masque l'affichage à l'écran (fin)
Application.EnableEvents = True
End Sub

On évite de préférence de faire des choses par habitude, on les fait s'il est justifié qu'on les fasse.

Tu ne réponds pas à la question relative à l'évènement qui pourrait se déclencher inconsidérément... alors qu'il n'y a rien a-priori susceptible de déclencher un évènement.

Protéger-déprotéger : le simple bon sens te dit que si tu vas déprotéger, il est inutile de commencer par protéger.

On suppose donc que la feuille est protégée.

Je déduis que la feuille 1 est concernée, mais il va falloir que tu m'expliques quelles valeurs on est censé trouver en A1 et B1, car ne voyant pas ton tableau, je dirais que s'il est rempli, j'ai toujours 0 en B1 et en A1 un numéro de ligne situé 2 lignes au-dessus de la dernière ligne du tableau...

Ensuite, en attendant les éclaircissements sur ce point, ça va se corser, je n'arrête pas de le rabacher que Select ou Activate, lorsque le motif n'est pas de montrer l'objet concerné à l'utilisateur sont inutiles, nocifs et à proscrire... Je vais donc les éliminer bien sûr, mais avant il y aura à éclaircir cette manip de masquage suivie de démasquage partiel qui paraît absurde !

Sans oublier aussi (à force je vais finir par ne plus voir toutes les anomalies) que l'utilisation de Rows (qui représente des lignes entières !) suivi de EntireRow est au niveau du langage un pléonasme, on double l'appel de l'objet.

Pour tenter de comprendre mon desir, mon écriture

En modifiant la date du 28/04/2016 en 26/04/2016 on remarque l'application d'une mise en forme

6rvrvrv.xlsm (60.08 Ko)

Autre problème : l'ordre des MFC a son importance.

1) faire remonter la seconde à la place de la première et supprimer toutes les coches interrompre.

2) il me semble que ta MFC n'est pas définie complètement pour ce que tu veux :

Je pense qu'on s'en approche de plus près avec ceci :

=ET($D4>=AUJOURDHUI();OU($D5<AUJOURDHUI();ET($D4=AUJOURDHUI();$D5=AUJOURDHUI())))

Avec celle-ci tu évites d'avoir à la fois aujourd'hui et le jour suivant mis en forme. Tu n'as qu'aujourd'hui et dans ce cas tous les aujourd'hui, ou bien le prochain jour mais juste la 1re ligne si plusieurs sont sur le même jour.

Ce n'est peut-être pas ça, mais cela me choquait d'avoir 2 jours différents signalés.

OK pour la MFC.

Maintenant lorsque j'ajoute une date. Comment ne pas emplifier le nombre de lignes de MFC.

Une copie de la procédure me conviendrai.

Avec les réponses je fais un pas supplémentaire dans l'ecriture VBA

Annette

Retour sur ta macro :

Private Sub Workbook_Open()
    Dim plage As Range, fml As String
    Sheets("Feuil1").Unprotect
    Set plage = Sheets("Feuil1").Range("C4:F1000")
    plage.FormatConditions.Delete
    fml = "=ET($D4>=AUJOURDHUI();OU($D5<AUJOURDHUI();ET($D4=AUJOURDHUI();$D5=AUJOURDHUI())))"
    With plage.FormatConditions.Add(xlExpression, , fml)
        .Interior.Color = vbYellow
        With .Font
            .FontStyle = "Bold Italic"
            .Color = vbRed
        End With
    End With
    fml = "=$D4>AUJOURDHUI()"
    With plage.FormatConditions.Add(xlExpression, , fml).Font
        .FontStyle = "Bold Italic"
        .Color = vbBlue
    End With
    'Sheets("Feuil1").Protect DrawingObjects:=False, Contents:=True, Scenarios:=False
    Sheets("Feuil1").Activate
    ActiveWindow.Zoom = 150
End Sub

Si la feuille doit être protégée, réactiver la protection...

Les autres éléments étaient inutiles :

EnableEvents : pas d'interaction avec la feuille, donc pas de possibilités d'évènements, et de plus il n'y en a aucun de programmé...

ScreenUpdating : il peut être utile de le mettre à False pendant le déroulement, lorsqu'il y a une interaction avec la feuille entrainant une mise à jour de l'affichage, ce n'est pas le cas ici. Si on l'a mis à False, on le remet à True à la fin.

Les sélections auraient constitué une interaction avec la feuille, mais étant inutiles, on s'en dispense...

On active la feuille, à la fin seulement, pour assurer qu'à l'ouverture ce soit bien celle-ci qui s'affiche (dans ce cas, activer est un service au bénéfice de l'utilisateur !)

J'en oublie certainement...

Bon courage.


Effectivement, à l'ouverture ça ne suffit pas, donc en faire une procédure autonome, à transférer dans Module1 :

Sub RéactiveMFC()
    Dim plage As Range, fml As String
    Sheets("Feuil1").Unprotect
    Set plage = Sheets("Feuil1").Range("C4:F1000")
    plage.FormatConditions.Delete
    fml = "=ET($D4>=AUJOURDHUI();OU($D5<AUJOURDHUI();ET($D4=AUJOURDHUI();$D5=AUJOURDHUI())))"
    With plage.FormatConditions.Add(xlExpression, , fml)
        .Interior.Color = vbYellow
        With .Font
            .FontStyle = "Bold Italic"
            .Color = vbRed
        End With
    End With
    fml = "=$D4>AUJOURDHUI()"
    With plage.FormatConditions.Add(xlExpression, , fml).Font
        .FontStyle = "Bold Italic"
        .Color = vbBlue
    End With
    'Sheets("Feuil1").Protect DrawingObjects:=False, Contents:=True, Scenarios:=False
End Sub

A l'ouverture cela devient :

Private Sub Workbook_Open()
    RéactiveMFC
    Sheets("Feuil1").Activate
    ActiveWindow.Zoom = 150
End Sub

Et mettre : RéactiveMFC à la fin de la procédure saut (qui ne me paraît pas remplir tout à fait son office, mais j'ai assez bouffé de Select aujourd'hui)...

9anpi-rvrvrv.xlsm (62.49 Ko)

Merci beaucoup pour le temps passer. Je clos le dossier, la procédure fonctionne .Pour le reste des améliorations je m'en passerai pour l'instant.

Annette

Rechercher des sujets similaires à "mise forme conditionnelle"