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