IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Mise en forme conditionnelle par macro [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Mise en forme conditionnelle par macro
    Bonjour,
    Je souhaiterais réaliser une macro de mise en forme conditionnelle d'un tableau (une ligne complète en rouge en fonction de la valeur d'une cellule).
    J'ai donc créé une boucle, qui fonctionne pour la sélection de la ligne, mais qui n'incrémente pas automatiquement la cellule.
    Je pense que la syntaxe de la condition sur la ligne 14 est incorrecte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Sub MFC()
     
    Dim i As Integer
    Dim j As Variant
     
    For i = 3 To 10
        Rows(i).Select
        j = Range("G", i).Value
     
        'suppression conditions
        Selection.FormatConditions.Delete
        'condition auto
        'Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=$G$3=1"  (OK)
        Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=j=1"
        Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
        'mise ne forme
        With Selection.FormatConditions(1).Font
            .Bold = True
            .Italic = False
            .Color = -16776961
            .TintAndShade = 0
        End With
    Next i
     
    End Sub


    Merci pour votre aide :-)

  2. #2
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=" & j & "=1"

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Je viens d'essayer, mais il me génère une erreur 1004 à la ligne 8.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    667
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 667
    Points : 1 432
    Points
    1 432
    Par défaut
    Bonjour,

    Pourquoi passer par une macro?
    Une simple mise en forme conditionnelle suffirait:
    Si tu sélectionnes une case toute la plage sur laquelle appliquer la MFC et que celle-ci démarre en ligne 3, applique la formule:
    => Le fait de laisser le $ sur G mais pas sur 3 fait qu'Excel regardera toujours la colonne G quelle que soit la colonne sur laquelle la MFC s'applique mais dans cette colonne G, il regardera systématiquement la case de la ligne courante. C'est bien ce que tu veux non?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Oui, c'est bien cela. Je souhaite que la mise en forme de la ligne complète se fasse par rapport à la cellule G de la ligne courante, incrémentée dans la boucle. C'est pour cela que j'avais mis pour la mise en forme : G et le N° de la ligne de la boucle.

    Peut-être que je me complique...

    Quand je fais une macro à l'enregistrement, ligne par ligne, voici ce que j'obtiens et que je voudrais simplifier en faisant une boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Sub Macro2()
    '
    ' Macro2 Macro
    '
     
    '
        Rows("3:3").Select
        Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=$G$3=1"
        Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
        With Selection.FormatConditions(1).Font
            .Color = -16776961
            .TintAndShade = 0
        End With
        Selection.FormatConditions(1).StopIfTrue = False
        Rows("4:4").Select
        Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=$G$4=1"
        Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
        With Selection.FormatConditions(1).Font
            .Color = -16776961
            .TintAndShade = 0
        End With
        Selection.FormatConditions(1).StopIfTrue = False
        Rows("5:5").Select
        Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=$G$5=1"
        Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
        With Selection.FormatConditions(1).Font
            .Color = -16776961
            .TintAndShade = 0
        End With
        Selection.FormatConditions(1).StopIfTrue = False
        Rows("6:6").Select
        Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=$G$6=1"
        Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
        With Selection.FormatConditions(1).Font
            .Color = -16776961
            .TintAndShade = 0
        End With
        Selection.FormatConditions(1).StopIfTrue = False
    End Sub
    Cette macro fonctionne quand je sélectionne ligne par ligne, mais pas quand je sélectionne la plage des lignes 3 à 6...

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    667
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 667
    Points : 1 432
    Points
    1 432
    Par défaut
    ça ne marche pas à cause du $ devant le numéro de ligne dans ta formule; cf. ma proposition.
    La macro est inutile à mon avis.

  7. #7
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Sans compter que faire une macro pour 4 MFC aussi simples, c'est sortir le buldozer pour écraser une mouche.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Certes, pour 4 lignes, je m'en passe, car la mise en forme fonctionne. Mais à terme, le fichier devrait faire entre 1000 et 1500 lignes.
    Donc ma boucle ira de 3 à la fin du tableau...

    Quand j'utilise =$G3=1, si la valeur est 1, cela s'applique à toutes mes lignes, quelque soit la valeur de G4, G5,etc...

  9. #9
    Membre expérimenté
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    667
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 667
    Points : 1 432
    Points
    1 432
    Par défaut
    Si tu utilises un tableau structuré (Menu Insertion -> Tableau) et que tu lui appliques la MFC que je t'ai proposée dans l'interface Excel, la MFC s'appliquera automatiquement aux nouvelles lignes sans rien faire.


    Edit: Si tu persistes à vouloir utiliser VBA, il ne faut pas appliquer cette formule à chaque ligne unitairement sous VBA mais à toutes en une fois car sinon effectivement tu regarderas toujours la ligne 3.

  10. #10
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par Fulder Voir le message
    Quand j'utilise =$G3=1, si la valeur est 1, cela s'applique à toutes mes lignes, quelque soit la valeur de G4, G5,etc...
    Sélectionne ta ligne 3 et fais cette MFC.

    Ensuite, tu copies la ligne 3 sur les autres.
    Si tu veux conserver les valeurs des autres lignes et ne copier que le format, passe par Coller > Format.

    Ou bien, tu vas dans Mise en forme conditionnelle > Gérer les règles
    Tu sélectionnes ta règle et tu modifies la référence du champ "S'applique à" pour qu'il englobe toutes tes lignes.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Vous allez dire que j'insiste, mais j'ai trouvé une autre solution qui ne tient pas compte de la mise en forme conditionnelle et qui s'affranchi du nombre de ligne (ce fichier va être alimenté par d'autres utilisateurs qui ne maîtrisent excel qu'à minima)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Sub MFCmanu()
     
    Dim i As Integer
    Dim j As Integer
    Dim max As Long
     
    If IsEmpty(Range("A1")) = False Then
        max = Range("A1").End(xlDown).Row
        Else: max = 1
    End If
     
    For i = 3 To max
        Rows(i).Select
        j = Cells(i, 7).Value
               If j = 1 Then
                With Selection.Font
            .Bold = True
            .Italic = False
            .Color = -16776961
            .TintAndShade = 0
                End With
            Else
                With Selection.Font
            .Bold = False
            .Italic = False
            .Color = 0
            .TintAndShade = 0
                End With
            End If
    Next i
     
     
    End Sub
    Donc la macro est sur un bouton cela limite les fausses manip.
    Ce n'est peut-être pas très académique mais c'est compréhensible.

    Merci pour votre aide

  12. #12
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par Fulder Voir le message
    Donc la macro est sur un bouton cela limite les fausses manip.
    Dans la mesure où une MFC ne demande AUCUNE manip après avoir été mise en place et qu'en plus ça se remet à jour dynamiquement lorsqu'on change les données, il me semble que ça limite bien plus le risque de fausses manip.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Mise en forme conditionnelle par macro sur cellule contenant une formule
    Par Breton35 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 08/10/2015, 14h22
  2. [XL-2010] Manipuler les mises en forme conditionnelles par macro
    Par EmmanuelleC dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 03/04/2014, 17h44
  3. [XL-2010] Mise en forme conditionnelle par ligne
    Par sbricout dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 21/02/2011, 17h51
  4. mise en forme conditionnelle par Date
    Par bibi28 dans le forum IHM
    Réponses: 10
    Dernier message: 24/08/2008, 16h17
  5. Mise en forme bordure par Macro sur plage nommée
    Par tempo-lyon dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 01/10/2007, 10h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo