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 :

Alternance de couleur quand valeur change [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Femme Profil pro
    Ingénieur supply chain
    Inscrit en
    Mai 2015
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur supply chain
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2015
    Messages : 125
    Par défaut Alternance de couleur quand valeur change
    Bonjour tout le monde,

    J'ai cherché sur internet mais je n'arrive à avoir ce que je veux ni à adapter les codes... J'ai un tableau allant de A à S, le nombre de lignes varies. En colonne E, j'ai mes numéros de commande qui se suivent. Je souhaite qu'il y ai une alternance entre gris et blanc quand le numéro de commande change. Voici un exemple :

    Nom : Capture.PNG
Affichages : 1403
Taille : 6,3 Ko

    Pouvez-vous m'aider?

    Par VBA ou MEFC !

    Merciii !

  2. #2
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    Bonjour,

    Avec MFC :
    - FREQUENCE pour compter le nombre de valeurs distinctes précédentes
    - MOD pour alterner 0/1

    Une expression qui ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =0=MOD(SOMME(SI(FREQUENCE(INDIRECT("A2:A" & EQUIV($A2;$A:$A;0));INDIRECT("A2:A" & EQUIV($A2;$A:$A;0)))>0;1));2)

  3. #3
    Membre confirmé
    Femme Profil pro
    Ingénieur supply chain
    Inscrit en
    Mai 2015
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur supply chain
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2015
    Messages : 125
    Par défaut
    Bonjour Arkham,

    merci pour ta réponse.

    J'ai testé le code en le mettant dans la MFC sur "Utiliser une formule pour déterminer pour quelles cellules le format sera appliqué". J'ai mis ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =0=MOD(SOMME(SI(FREQUENCE(INDIRECT("E2:E" & EQUIV($E2;$E:$E;0));INDIRECT("E2:E" & EQUIV($E2;$E:$E;0)))>0;1));2)
    Résultat : toute la page se met de la couleur choisi dans le format

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =MOD(SOMME(SI(FREQUENCE(INDIRECT("E2:E" & EQUIV($E2;$E:$E;0));INDIRECT("E2:E" & EQUIV($E2;$E:$E;0)))>0;1));2)
    Résultat : aucun résultat, pas de changement

    Peux-tu m'aider? Merci

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Bonjour,

    Et bien, une mise en forme condit avec Equation devrait le faire facilement
    Du style (Excel anglais)

  5. #5
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    @vinc_bilb : ton code indique les ruptures, mais ne permet pas de distinguer les blocs identiques pour appliquer une alternance de couleur

    @SixteenVBA : commence par mettre la formule dans une cellule pour visualiser le résultat du calcul

  6. #6
    Membre confirmé
    Femme Profil pro
    Ingénieur supply chain
    Inscrit en
    Mai 2015
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur supply chain
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2015
    Messages : 125
    Par défaut
    J'ai mis ma formule dans une cellule et le résultat est "vrai"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =0=MOD(SOMME(SI(FREQUENCE(INDIRECT("E2:E" & EQUIV($E2;$E:$E;0));INDIRECT("E2:E" & EQUIV($E2;$E:$E;0)))>0;1));2)
    Comment je dois l'interpréter? Merci

  7. #7
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Rebonjour

    En colonne E, j'ai mes numéros de commande qui se suivent.
    => si c'est effectivement trié, une simple MFC pour indiquer les changements de commande (voir exemple donné) suffit et c'est beaucoup plus simple

  8. #8
    Membre confirmé
    Femme Profil pro
    Ingénieur supply chain
    Inscrit en
    Mai 2015
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur supply chain
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2015
    Messages : 125
    Par défaut
    @vinc_bilb , quel MFC appliqué? Car comme je l'ai dit plus haut, la propositon @Arkham46 ne fonctionne pas où alors je ne sais pas l'adapter.

    Merci

  9. #9
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    @SixteenVBA : il faut regarder le résultat sur l'ensemble des lignes. Ma formule fonctionne chez moi mais il faut bien la mettre en place pour que l'indice de ligne soit incrémenté. Si tu mets la formule sur une cellule en ligne 2 et que tu tires la formule sur l'ensemble des ligne, est-ce que tu vois l'alternance de vrai/faux ?


    @vinc_bilb : c'est quoi "une simple MFC pour indiquer les changements de commande" ?
    Penses-tu a un séparateur avec une bordure ?
    Cela pourrait être une alternative.

  10. #10
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    sinon solution pure VBA
    soit dans le module de la feuille
    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
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim i&
        With ActiveSheet
        If Target.Column = 1 Then    'colonne a ADAPTER!!!!!!!!
            .Cells(1, 1).Interior.Color = RGB(230, 230, 230)    ' couleur grise a adapter
            For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
                If .Cells(i, 1).Offset(-1).Value = .Cells(i, 1).Value Then
                    .Cells(i, 1).Interior.Color = .Cells(i - 1, 1).Interior.Color
                Else
                    .Cells(i, 1).Interior.Color = IIf(.Cells(i - 1, 1).Interior.Color = vbWhite, RGB(230, 230, 230), vbWhite)
                End If
            Next
        End If
    End With
    End Sub
    soit dans le module thisworkbook
    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
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim i&
        With Sheets(1) ' sheets a ADAPTER!!!!!!!!
        If Target.Column = 1 Then    'colonne a ADAPTER!!!!!!!!
            .Cells(1, 1).Interior.Color = RGB(230, 230, 230)    ' couleur grise a adapter
            For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
                If .Cells(i, 1).Offset(-1).Value = .Cells(i, 1).Value Then
                    .Cells(i, 1).Interior.Color = .Cells(i - 1, 1).Interior.Color
                Else
                    .Cells(i, 1).Interior.Color = IIf(.Cells(i - 1, 1).Interior.Color = vbWhite, RGB(230, 230, 230), vbWhite)
                End If
            Next
        End If
    End With
    End Sub
    meme si tu reviens modifier une precedente cellule les couleurs se remettent en place
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  11. #11
    Membre confirmé
    Femme Profil pro
    Ingénieur supply chain
    Inscrit en
    Mai 2015
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur supply chain
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2015
    Messages : 125
    Par défaut
    @Arkham46 non le resultat est vrai partout, et l'incrémentation est bien présente comme tu peux le voir sur la capture ci-dessous :

    Nom : Capture.PNG
Affichages : 1349
Taille : 19,6 Ko

    Ou alors j'ai loupé quelque chose?

    @patricktoulon je teste ça tout de suite !

  12. #12
    Membre confirmé
    Femme Profil pro
    Ingénieur supply chain
    Inscrit en
    Mai 2015
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur supply chain
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2015
    Messages : 125
    Par défaut
    @Arkham46 ta proposition pour la MFC donne ceci :

    Nom : Capture.PNG
Affichages : 1279
Taille : 13,6 Ko

    Donc on constate que ca marche presque ! J'ai mis en jaune les problèmes car plus simple que de l'expliquer par des phrases.

  13. #13
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    Ma première formule fonctionne uniquement pour des valeurs numériques.
    Ta colonne était de type texte sur la première capture, je n'avais pas vu.
    Pour du texte, c'est un peu plus complexe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =0=MOD(SOMME(SI(FREQUENCE(EQUIV(INDIRECT("E2:E" & EQUIV($E2;$E:$E;0));INDIRECT("E2:E" & EQUIV($E2;$E:$E;0));0);EQUIV(INDIRECT("E2:E" & EQUIV($E2;$E:$E;0));INDIRECT("E2:E" & EQUIV($E2;$E:$E;0));0))>0;1));2)
    Avec cette formule tu peux gérer la mise en couleur alternée.
    Sur ta dernière capture écran, tu as du décaler d'une ligne. Il ne faut pas appliquer la mise en forme depuis la première ligne mais depuis la deuxième.

    Sinon si une solution de mise en évidence avec un séparateur te convient, la formule de détection de rupture de vinc_bilb suffit.

  14. #14
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    normal que ca ne fonctionne pas il faut adapter la ligne (5) aussi cells(1,5) a la place cells(1,1)c'est la cellule pilote pour toutes les autres
    Nom : demo2.gif
Affichages : 1343
Taille : 665,3 Ko
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  15. #15
    Membre expérimenté
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2011
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2011
    Messages : 163
    Par défaut
    Bonjour,

    Sinon en VBA, ça peut donner quelquechose comme ça :

    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
    Sub Couleur_Alternee()
    Cellule_debut = "E2"
    Colonne = Range(Cellule_debut).Column
    Ligne_debut = Range(Cellule_debut).Row
    Ligne_fin = Range("E65000").End(xlUp).Row - 1
    For i = Ligne_debut To Ligne_fin
        couleur_fond = Cells(i, Colonne).Interior.Color
        If couleur_fond = RGB(255, 255, 255) Then couleur_alterne = RGB(217, 217, 217) Else couleur_alterne = RGB(255, 255, 255)
        If Cells(i + 1, Colonne).Value = Cells(i, Colonne).Value Then
        Cells(i + 1, Colonne).Interior.Color = couleur_fond
        Else
        Cells(i + 1, Colonne).Interior.Color = couleur_alterne
        End If
    Next
    End Sub
    ++

    Edit : pas assez rapide, lol ... et le code de Patrick et bien plus "propre" !

  16. #16
    Membre confirmé
    Femme Profil pro
    Ingénieur supply chain
    Inscrit en
    Mai 2015
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur supply chain
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2015
    Messages : 125
    Par défaut
    @Cachlab super ton code ! J'ai pu l'insérer directement dans mon VBA déjà existant !!

    Je vais abuser en te demandant comment le modifier pour que ca mette la ligne complete de couleur et non pas que la cellule?

    Merci aux autres également, vos codes marchent, mais celui-ci s'adapte plus facilement à mon code existant !

  17. #17
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par Cachlab Voir le message
    Edit : pas assez rapide, lol ... et le code de Patrick et bien plus "propre" !
    non pas plus propre je m'embarasse pas avec des variables puisqu'elle seraient utilisées que la
    c'est juste un raisonnement

    sinon ton code et le mien c'est exactement la meme chose :ton code peut avoir des avantages dans un autre contexte

    Je vais abuser en te demandant comment le modifier pour que ca mette la ligne complete de couleur et non pas que la cellule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cells(i+1,colonne).entirerow.interior.color=......
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 23/10/2014, 12h06
  2. Réponses: 6
    Dernier message: 23/07/2012, 11h13
  3. executer une macro quand on change la valeur d'une cellule
    Par Benwad dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 23/02/2009, 18h54
  4. Réponses: 0
    Dernier message: 28/02/2008, 17h00
  5. [C#][DataGridView] Action quand on change la valeur d'une CheckBox
    Par TheParadoX dans le forum Windows Forms
    Réponses: 3
    Dernier message: 01/09/2006, 10h08

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