mise en forme conditionnelle Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
a
an.pi
Membre fidèle
Membre fidèle
Messages : 254
Inscrit le : 15 mai 2008
Version d'Excel : 2007 FR

Message par an.pi » 25 avril 2016, 10:59

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

Comment dois je m'y prendre pour conserver que :
=ET($D4>=AUJOURDHUI();$D5<=AUJOURDHUI()) =$C$4:$F$1000
Merci d'avance
Annette
Le Bon et le Rapide s’excluent mutuellement.
De la discussion jaillit la lumière.
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'171
Appréciations reçues : 446
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 25 avril 2016, 13:24

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.
a
an.pi
Membre fidèle
Membre fidèle
Messages : 254
Inscrit le : 15 mai 2008
Version d'Excel : 2007 FR

Message par an.pi » 25 avril 2016, 18:02

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 :oops:
Le Bon et le Rapide s’excluent mutuellement.
De la discussion jaillit la lumière.
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'171
Appréciations reçues : 446
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 26 avril 2016, 04:46

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.
a
an.pi
Membre fidèle
Membre fidèle
Messages : 254
Inscrit le : 15 mai 2008
Version d'Excel : 2007 FR

Message par an.pi » 26 avril 2016, 06:11

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
Modifié en dernier par an.pi le 26 avril 2016, 07:58, modifié 1 fois.
Le Bon et le Rapide s’excluent mutuellement.
De la discussion jaillit la lumière.
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'171
Appréciations reçues : 446
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 26 avril 2016, 06:40

Tu te fous de moi... ! D'où sort cette procédure à la c.. !!
a
an.pi
Membre fidèle
Membre fidèle
Messages : 254
Inscrit le : 15 mai 2008
Version d'Excel : 2007 FR

Message par an.pi » 26 avril 2016, 07:57

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
Le Bon et le Rapide s’excluent mutuellement.
De la discussion jaillit la lumière.
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'171
Appréciations reçues : 446
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 26 avril 2016, 08:19

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.
a
an.pi
Membre fidèle
Membre fidèle
Messages : 254
Inscrit le : 15 mai 2008
Version d'Excel : 2007 FR

Message par an.pi » 26 avril 2016, 09:03

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
Le Bon et le Rapide s’excluent mutuellement.
De la discussion jaillit la lumière.
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'171
Appréciations reçues : 446
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 26 avril 2016, 10:11

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.
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message