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

VBA Word Discussion :

Changement de couleur de cellule en fonction menu déroulant [WD-365]


Sujet :

VBA Word

  1. #1
    Candidat au Club
    Femme Profil pro
    Consultant ERP
    Inscrit en
    Janvier 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Janvier 2020
    Messages : 8
    Points : 3
    Points
    3
    Par défaut Changement de couleur de cellule en fonction menu déroulant
    Bonjour à tous, Bonne année !

    J'ai un tableau dans un document word avec dans une cellule (répétée à chaque ligne) un menu déroulant.
    Je souhaiterai passer par VBA pour changer la couleur de fond de la cellule (et uniquement celle-ci) en fonction du contenu de mon menu déroulant de façon automatique ou en cliquant quelque part.
    je galère un peu, pour l'instant soit j'arrive à changer la couleur de fond de tout le tableau soit uniquement le champ (comme un surlignage), soit la cellule dans laquelle je clique pour sortir de mon menu déroulant....

    Je sèche, pouvez-vous m'aider s'il vous plait ?

    Merci beaucoup

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Claire1461 Voir le message
    Bonjour,

    Quel est votre code ?
    Nb : Une fois votre code collé, sélectionnez-le et cliquez sur la touche # dans le menu.

  3. #3
    Candidat au Club
    Femme Profil pro
    Consultant ERP
    Inscrit en
    Janvier 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Janvier 2020
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Merci pour votre retour, voici le code qui me change que le fond du texte (surlignage)


    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
    Option Explicit
     
     
    Private Sub Document_ContentControlOnExit(ByVal CC As ContentControl, Cancel As Boolean)
     
     
        If CC.Range.Text = "Zone A" Then
            CC.Range.Shading.BackgroundPatternColor = RGB(255, 255, 153)
     
           End If
     
           If CC.Range.Text = "Zone B" Then
            CC.Range.Shading.BackgroundPatternColor = wdColorRed
     
           End If
     
          If CC.Range.Text = "Zone C" Then
            CC.Range.Shading.BackgroundPatternColor = RGB(126, 177, 230)
     
         End If
     
        If CC.Range.Text = "Zone D" Then
            CC.Range.Shading.BackgroundPatternColor = RGB(146, 208, 80)
     
        End If
     
     
    End Sub

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2019
    Messages : 22
    Points : 14
    Points
    14
    Par défaut solution possible
    Bonjour,

    D'abord ce serait plus clair de remplacer tes 4 "If" distincts par un unique "If, ElseIf, ElseIf, Else".
    Pour colorer une cellule de tableau, j'ai dû faire la même chose. Au lieu de "CC.Range...", j'ai sélectionné la cellule de tableau, en connaissant le numéro du tableau "T" dans le document et les indices i-j de la cellule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveDocument.Tables(T).Columns(i).Cells(j).Shading.BackgroundPatternColor = RGB(228, 118, 121)
    Est-ce que ça te convient?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Claire1461 Voir le message
    Le code suivant est à mettre dans un module standard :
    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
    40
    41
    42
    43
    44
     
     
    Sub MettreUnFondDansUneCellule()
     
    Dim oCell As Cell
    Dim MaColonne As Integer
    Dim HeureDebut2, HeureFin2, TempsTotal2
     
        HeureDebut2 = Timer    ' Définit l'heure de début.
     
        Application.ScreenUpdating = False
        With ActiveDocument
             MaColonne = 1
             For Each oCell In .Tables(1).Columns(MaColonne).Cells
                 If oCell.Range.ContentControls.Count > 0 Then
                    Select Case oCell.Range.ContentControls(1).Range
                        Case "Zone A"
                             oCell.Shading.BackgroundPatternColor = RGB(255, 255, 153)
                             oCell.Range.ContentControls(1).Range.Shading.BackgroundPatternColor = RGB(255, 255, 153)
                        Case "Zone B"
                             oCell.Shading.BackgroundPatternColor = wdColorRed
                             oCell.Range.ContentControls(1).Range.Shading.BackgroundPatternColor = wdColorRed
                        Case "Zone C"
                             oCell.Shading.BackgroundPatternColor = RGB(126, 177, 230)
                             oCell.Range.ContentControls(1).Range.Shading.BackgroundPatternColor = RGB(126, 177, 230)
                        Case "Zone D"
                             oCell.Shading.BackgroundPatternColor = RGB(146, 208, 80)
                             oCell.Range.ContentControls(1).Range.Shading.BackgroundPatternColor = RGB(146, 208, 80)
                        Case Else
                             oCell.Shading.BackgroundPatternColor = wdColorAutomatic
                             oCell.Range.ContentControls(1).Range.Shading.BackgroundPatternColor = wdColorAutomatic
                    End Select
                 End If
     
             Next oCell
        End With
        Application.ScreenUpdating = True
     
        HeureFin2 = Timer    ' Définit l'heure de fin.
        TempsTotal2 = HeureFin2 - HeureDebut2    ' Calcule la durée totale.
        Debug.Print "Temps total du traitement MettreUnFondDansUneCellule du " _
                        & Date & " : " & Round(TempsTotal2, 0) & " seconde(s)"
     
    End Sub
    Le code suivant remplace celui dans ThisDocument
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Private Sub Document_ContentControlOnExit(ByVal CC As ContentControl, Cancel As Boolean)
     
        MettreUnFondDansUneCellule
     
    End Sub
    Le soucis est que le temps de traitement est prohibitif : 3 secondes pour 64 cellules / colonne (processeur I7), car il ne m'a pas été possible d'associer le contrôle à sa cellule. La parade serait de lancer la procédure à partir d'un bouton dans la barre d'accès rapide à la fin d'une mise à jour par exemple.

  6. #6
    Candidat au Club
    Femme Profil pro
    Consultant ERP
    Inscrit en
    Janvier 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Janvier 2020
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Arnaud2019 Voir le message
    Merci pour votre réponse. J'ai remplacé mes 4 "if". J'ai essayé le code mais j'obtiens un message d'erreur et c'est systématique dès que je souhaite utiliser la cellule comme définition. :
    erreur de compilation - variable non définie
    avec Private Sub Document_ContentControlOnExit(ByVal CC As ContentControl, Cancel As Boolean) surligné en jaune et (j) en bleu

    Citation Envoyé par Eric KERGRESSE Voir le message
    Merci Eric, je vais regarder ça ce week-end car cela a l'air complexe de mon niveau... Pour le temps de traitement pas de soucis, je n'ai qu'un tableau avec je pense au maximum une centaine de cellule. Je souhaiterai éviter le bouton.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Claire1461 Voir le message
    C'est trop long. Ci-joint, ma solution avec le bouton dans la barre d'accès rapide.

    Pièce jointe 533377

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2019
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    Avez-vous remplacé T, i et j dans la ligne de code que je vous ai passée?
    Si c'est la ligne 3 de la colonne 5 du 2ème tableau du document qu'il faut colorer, ça donnera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveDocument.Tables(2).Columns(5).Cells(3).Shading.BackgroundPatternColor = RGB(228, 118, 121)
    Est-ce que ça marche?

  9. #9
    Candidat au Club
    Femme Profil pro
    Consultant ERP
    Inscrit en
    Janvier 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Janvier 2020
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Arnaud2019 Voir le message
    Merci pour la précision, je n'avais pas modifié effectivement. Malheureusement ça ne fonctionne pas comme je le souhaite. En effet, je pourrai avoir jusqu'à une centaine de ligne avec le menu déroulant répété et du coup chaque cellule à colorer indépendamment et qui change si je change le contenu du menu déroulant. De plus, mon contrôle de menu déroulant se supprime après malgré l'option non retenue.

    Citation Envoyé par Eric KERGRESSE Voir le message
    Merci Eric, j'ai testé, ça fonctionne, mais ça ne correspond pas vraiment à ce que je souhaite faire. Je ne souhaite pas de bouton et effectivement le temps avant mise à jour est long.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Claire1461 Voir le message
    Vos ContentControls ont-ils un titre ? Peuvent-ils en recevoir ?

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Claire1461 Voir le message
    Merci Eric, j'ai testé, ça fonctionne, mais ça ne correspond pas vraiment à ce que je souhaite faire. Je ne souhaite pas de bouton et effectivement le temps avant mise à jour est long.
    Le principe est d'indexer les ContentControls à l'ouverture du document et de charger une matrice pour établir la correspondance entre la cellule et l'index du contrôle.

    Dans ThisDocument, on trouve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Option Explicit
     
    Private Sub Document_ContentControlOnExit(ByVal CC As ContentControl, Cancel As Boolean)
     
            MettreUnFondDansUneCellule1 CC
     
    End Sub
     
    Private Sub Document_Open()
     
            ChargerLaMatriceCC
     
    End Sub
    La procédure ChargerLaMatriceCC dans un module standard est la suivante :
    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
     
    Option Explicit
     
    Public MatriceCC() As Variant
     
     
     
    Sub ChargerLaMatriceCC()
     
    Dim I As Long, IndexEnCours As Long
     
        With ActiveDocument.Tables(1).Columns(1)
             IndexEnCours = 1
             For I = 1 To .Cells.Count '.ContentControls.Count
                 ReDim Preserve MatriceCC(1, IndexEnCours - 1)
                 MatriceCC(0, IndexEnCours - 1) = I
                 With .Cells(I)
                      If .Range.ContentControls.Count > 0 Then
                         .Range.ContentControls(1).Title = IndexEnCours
                         MatriceCC(1, IndexEnCours - 1) = IndexEnCours
                         IndexEnCours = IndexEnCours + 1
                      End If
                 End With
             Next I
        End With
     
       ' For I = LBound(MatriceCC, 2) To UBound(MatriceCC, 2)
       '   Debug.Print MatriceCC(0, I) & " : " & MatriceCC(1, I)
       ' Next I
     
    End Sub
    La procédure dans un module standard liée à l'événement Document_ContentControlOnExit est la suivante :
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
     
    Sub MettreUnFondDansUneCellule1(ByVal CC2 As ContentControl)
     
    Dim oCell As Cell
    Dim MaColonne As Integer
    'Dim HeureDebut2, HeureFin2, TempsTotal2
    Dim I As Long
     
       ' HeureDebut2 = Timer    ' Définit l'heure de début.
        MaColonne = 1
     
        Application.ScreenUpdating = False
     
        With ActiveDocument
     
             For I = LBound(MatriceCC, 2) To UBound(MatriceCC, 2)
                 If MatriceCC(1, I) = CC2.Title Then
                    Debug.Print MatriceCC(0, I) & " : " & MatriceCC(1, I)
                    Set oCell = .Tables(1).Columns(MaColonne).Cells(MatriceCC(0, I))
                    With oCell
                         Select Case CC2.Range
                                Case "Zone A"
                                     .Shading.BackgroundPatternColor = RGB(255, 255, 153)
                                     CC2.Range.Shading.BackgroundPatternColor = RGB(255, 255, 153)
                                Case "Zone B"
                                     .Shading.BackgroundPatternColor = wdColorRed
                                     CC2.Range.Shading.BackgroundPatternColor = wdColorRed
                                Case "Zone C"
                                     .Shading.BackgroundPatternColor = RGB(126, 177, 230)
                                     CC2.Range.Shading.BackgroundPatternColor = RGB(126, 177, 230)
                                Case "Zone D"
                                     .Shading.BackgroundPatternColor = RGB(146, 208, 80)
                                     CC2.Range.Shading.BackgroundPatternColor = RGB(146, 208, 80)
                                Case Else
                                     .Shading.BackgroundPatternColor = wdColorAutomatic
                                     CC2.Range.Shading.BackgroundPatternColor = wdColorAutomatic
                          End Select
                    End With
                    Set oCell = Nothing
                    Exit For
     
                 End If
     
             Next I
     
     
        End With
        Application.ScreenUpdating = True
     
       ' HeureFin2 = Timer    ' Définit l'heure de fin.
       ' TempsTotal2 = HeureFin2 - HeureDebut2    ' Calcule la durée totale.
       ' Debug.Print "Temps total du traitement MettreUnFondDansUneCellule du " _
       '                 & Date & " : " & Round(TempsTotal2, 0) & " seconde(s)"
     
    End Sub

  12. #12
    Invité
    Invité(e)
    Par défaut
    J'ai créé ce billet dans mon blog reprenant les derniers changements : Changement-couleur-fond-cellules-fonction-contentcontrols.

  13. #13
    Candidat au Club
    Femme Profil pro
    Consultant ERP
    Inscrit en
    Janvier 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Janvier 2020
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Désolée pour ma longue absence mais quelques soucis ne m'ont pas permis de poursuivre la discussion et les recherches. Enfin je peux m'y remettre.
    Merci à tous pour votre aide et votre implication.

    J'ai repris mon fichier et ce fichu tableau.
    J'ai effectué quelques recherches et fait des tests.
    Bon évidemment rien ne fonctionnait

    J'ai trouvé plusieurs codes sur le net (faqword) (colorer le texte du menu déroulant et colorer une cellule suivant un texte).
    Et enfin, après plusieurs jours de galère, j'ai réussi à mixer les deux pour faire ça. Youhouuuuuuuuuuuuuuuu !
    Ça fonctionne très bien. Il me reste à trouver comment faire en sorte que ça ne se colorie pas si je n'ai aucune des valeurs Zones A/B ou C. (soit une autre zone, soit choisissez un élément soit une entrée libre de texte). Je pense avec des IF à la suite mais pour l'instant je n'y suis pas arrivée.
    Je poste le code au cas où ça aiderait quelqu'un.

    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
    Private Sub document_ContentControlOnExit(ByVal ContentControl As ContentControl, Cancel As Boolean)
    If ContentControl.Title = "Zone" Then
     
        Dim cellule As CELL, ligne As Row, zone
        For Each ligne In ActiveDocument.Tables(1).Rows
            For Each cellule In ligne.Cells
     
                With cellule.Shading
                    Select Case zone
                        Case zone = InStr(1, cellule.Range.Text, "Zone A")
                            .BackgroundPatternColor = wdColorBrightGreen
                        Case zone = InStr(1, cellule.Range.Text, "Zone B")
                            .BackgroundPatternColor = wdColorLightYellow
                        Case zone = InStr(1, cellule.Range.Text, "Zone C")
                            .BackgroundPatternColor = wdColorPaleBlue
                    End Select
                End With
            Next
        Next ligne
    End If
    End Sub

  14. #14
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Claire1461 Voir le message
    Bonjour,

    Il te faut ajouter un Case Else à la suite et prendre la couleur blanche j'imagine. Regarde les valeurs sur l'aide Microsoft : https://docs.microsoft.com/fr-fr/dot...?view=word-pia

  15. #15
    Candidat au Club
    Femme Profil pro
    Consultant ERP
    Inscrit en
    Janvier 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Janvier 2020
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Bponjour Eric,

    Merci de ton retour super rapide.
    Génial, ça fonctionne exactement comme je voulais. Merci encore.


    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
    Private Sub document_ContentControlOnExit(ByVal ContentControl As ContentControl, Cancel As Boolean)
    If ContentControl.Title = "Zone" Then
     
        Dim cellule As CELL, ligne As Row, zone
        For Each ligne In ActiveDocument.Tables(1).Rows
            For Each cellule In ligne.Cells
     
                With cellule.Shading
                    Select Case zone
                        Case zone = InStr(1, cellule.Range.Text, "Zone A")
                            .BackgroundPatternColor = wdColorBrightGreen
                        Case zone = InStr(1, cellule.Range.Text, "Zone B")
                            .BackgroundPatternColor = wdColorLightYellow
                        Case zone = InStr(1, cellule.Range.Text, "Zone C")
                            .BackgroundPatternColor = wdColorPaleBlue
                        Case Else
                            .BackgroundPatternColor = wdColorAutomatic
     
                    End Select
                End With
            Next
        Next ligne
    End If
    End Sub

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

Discussions similaires

  1. [XL-2003] Mettre une couleur de cellule en fonction d'une valeur.
    Par kev159 dans le forum Excel
    Réponses: 2
    Dernier message: 31/08/2010, 15h26
  2. Réponses: 3
    Dernier message: 12/08/2010, 13h17
  3. [XL-2007] Changement de couleur de cellule
    Par Rayanea dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/11/2009, 20h12
  4. Réponses: 3
    Dernier message: 16/05/2008, 17h42
  5. changement de couleur de cellule
    Par yvanovitch dans le forum Excel
    Réponses: 7
    Dernier message: 12/03/2008, 18h32

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