Colorier un forme de la feuille 2 en fonction d'une cellule de 1

lea9344 -  
 Lea9344 -
Bonjour à tous,
.

Je suis une débutante VBA, j'apprends en cherchant sur les forums comme celui-ci.
Je voudrais colorier une forme de la feuille 2 en fonction de la valeur d'une cellule de la feuille 1.
Pour l'instant j'ai trouvé le code pour changer la couleur de la forme en fonction d'une cellule seulement si cette cellule est dans la même feuille que la forme.
Mais ce n'est pas exactement ce que je veux :
.

Private Sub Worksheet_Change(ByVal Target As Range)

Dim Shp

Set Shp = ThisWorkbook.Worksheets("Feuil2").Shapes("Ellipse 67")
' je voudrais ici qu'il s'agisse de la cellule A1 de la "Feuil1"
If Range("A1") < 100 Then
Shp.Fill.ForeColor.RGB = RGB(239, 51, 35) 'rouge
Else
Shp.Fill.ForeColor.RGB = RGB(0, 103, 56) 'vert
End If

End Sub

.
Comment faire pour colorier une forme d'une feuil2 en fonction d'une cellule d'une feuil1?
.
Merci de votre aide

7 réponses

Résumé de la discussion

La question porte sur colorier une forme sur Feuil2 selon la valeur d’une cellule de Feuil1 via VBA, afin que le changement graphique dépende d’un seuil entre feuilles. La solution clé consiste à qualifier explicitement la feuille dans la référence, par exemple If Sheets("Feuil1").Range("A1").Value < 100 Then, pour modifier la couleur de la forme sur Feuil2. Des réponses suggèrent aussi d’écrire le code dans un module puis d’appeler la macro depuis la feuille, mais l’approche la plus fiable demeure la qualification directe de la feuille pour Range. En pratique, il faut éviter Range sans préfixe et veiller à comparer la valeur avec .Value, afin d’éviter des erreurs si la feuille active n’est pas celle contenant les cellules.

Bobot (l'IA à votre service)
  1. via55 Messages postés 14396 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    Bonjour

    Indique le nom de la feuille avant le Range :

    If Sheets("Feuil1").Range("A1") < 100 Then

    Cdlmnt
    Via
    0
    1. lea9344
       
      Bonjour, désolé pour ma réponse tardive.
      J'ai essyé en rajoutant "If Sheets("Feuil1").Range("A1") < 100 Then ", mais cela ne fonctionne pas. La forme se réfère toutjours à la cellule re la feuille 2 :S
      0
      1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717 > lea9344
         
        Bonjour,

        le code est dans le VBA de quelle feuille ????
        0
    2. Lea9344
       
      La feuille 2.
      Je viens de vérifier, la formule fonctionne. Par contre, elle ne se met pas à jour automatiquement. Pour se mettre à jour il faut rentrer du texte dans une cellule de la feuille 2 et faire "entrer".
      Comment faire ?

      Merci d'avance! :)
      0
      1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717 > Lea9344
         
        Re,

        un peu plus bas, j'ai ecrit ceci:

        Ce qu'il faudrait savoir, c'est comment change la valeur de la cellule feuil1!A1 et si la feuil2 est en permanence active ou pas !!! Donc pouvez-vous nous en ecrire plus sur le sujet
        0
  2. Boisgontierjacques Messages postés 177 Statut Membre 64
     
    0
    1. lea9344
       
      Bonjour,
      L'exemple que vous m'avez proposé est très intéressant, cependant, je n'arrive pas à le réutiliser lorsque je veux changer la couleure d'une forme qui est dans une autre feuille que celle où se trouvent les cellules colorées et formules.
      Comment peut-on modifier la formule afin que cela fonctionne ?

      Autrement, cela m'intéresserai beaucoup de pouvoir modifier cette fois, non pas la couleur de fond de la forme, mais la couleur du couleur ou encore, la couleur du texte contenu dans la forme.
      Est-il possible d'adapter la formule pour atteindre cet objectif ?

      Merci d'avance pour votre aide! :)
      0
  3. Vaucluse Messages postés 27336 Date d'inscription   Statut Contributeur Dernière intervention   6 453
     
    Bonjour
    peu expérimenté en VBA je peux dire des bêtises (oh oui) mais je n'ai jamais réussi à faire fonctionner un code feuille en faisant référence à des cellules hors feuille.
    La solution que j'emploie pour contourner le problème:
    écrire le code dans un module
    lancer la macro dans le code feuille avec CALL nom_macro
    Ça pourrait peut être alors fonctionner avec Range("Feuil1A1")

    en attendant les experts en la matière!!

    crdlmnt
    0
    1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
       
      Bonjour Vaucluse,

      Ce qu'il faudrait savoir, c'est comment change la valeur de la cellule feuil1!A1 et si la feuil2 est en permanence active ou pas !!!
      0
    2. Vaucluse Messages postés 27336 Date d'inscription   Statut Contributeur Dernière intervention   6 453
       
      Salut f894.....
      alors je suis la discussion, la solution autre que ma "combine" m'intéresse!
      Je pense aussi qu'il faudrait savoir ce que deviennent les cellules formatées si la valeur de A1 feuil2 change de condition
      A+
      0
    3. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717 > Vaucluse Messages postés 27336 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Re,
      un exemple sur activation feuille:

      a mettre dans VBA de ThisWotkbook

      Private Sub Workbook_SheetActivate(ByVal Sh As Object)
          Dim Shp
          
          If Sh.Name = "Feuil2" Then
              Set Shp = ThisWorkbook.Worksheets("Feuil2").Shapes("Ellipse 67")
              ' je voudrais ici qu'il s'agisse de la cellule A1 de la "Feuil1"
              If Worksheets("Feuil1").Range("A1") < 100 Then
                  Shp.Fill.ForeColor.RGB = RGB(239, 51, 35) 'rouge
                  ActiveSheet.Shapes.Range(Array("Ellipse 67")).Select
                  With Selection.ShapeRange.TextFrame2.TextRange.Font.Fill
                      .Visible = msoTrue
                      .ForeColor.RGB = RGB(0, 103, 56) 'vert
                      .Transparency = 0
                      .Solid
                  End With
              Else
                  Shp.Fill.ForeColor.RGB = RGB(0, 103, 56) 'vert
                  ActiveSheet.Shapes.Range(Array("Ellipse 67")).Select
                  With Selection.ShapeRange.TextFrame2.TextRange.Font.Fill
                      .Visible = msoTrue
                      .ForeColor.RGB = RGB(239, 51, 35) 'rouge
                      .Transparency = 0
                      .Solid
                  End With
              End If
          End If
      End Sub
      0
    4. Lea9344
       
      Bonjour à tous,
      La cellule Feuil1!A1 peut être changé manuellement.
      La Feuil2!A2 est toujours active
      0
    5. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717 > Lea9344
       
      Re,

      Reponse pas top,

      La cellule Feuil1!A1 peut être changé manuellement. et autrement ??

      La Feuil2!A2 est toujours active Que vient faire la cellule A2 ??
      0
    1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
       
      Bonjour,

      Vos fichiers sont des exemples impeccables pour Lea9344, mais ce qui pose probleme pour cette personne, ce n'est le moyen mais le travail a faire pour ces onglets(+de 50 formes dans certains) car tout VBA ou formules et VBA faut tapoter avec ses petits doigts!!! Y a pas de miracle, je vais regarder si possible de reduire au maximum avec tout VBA, mais restera quand-meme un minimum.
      0
    2. Lea9344
       
      Bonjour Boisgontier,

      En effet vos exemples sont vraiment top!

      J'ai cependant quelques questions pour pouvoir les adapter à mes fichiers:
      1) Est-il possible de changer la couleur du contour de la forme par une formule équivalente ?
      2) Est-il possible de changer la couleur de la police contenu dans une forme par une formule équivalente ?
      3) Dans mes fichiers, le rouge et le vert sont les suivant :
      RGB(218, 41, 28) 'rouge
      RGB(54, 101, 56) 'vert
      Comment puis-je l'adapter à votre formule ?
      =ColorieImage(B9;SI(TG!D3>=TG!D4;65025;SI(TG!D3>TG!D4*95%;4626167;255)))

      Merci d'avance pour votre aide,
      Léa
      0
    3. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717 > Lea9344
       
      Bonjour,

      couleur

      RGB(218, 41, 28) 'rouge-->1845722
      RGB(54, 101, 56) 'vert--->3695926
      0
    4. Lea9344
       
      Merci beaucoup f894009!
      Comment avez-vous pu déterminer les couleurs ?
      Bonne journée,
      Léa
      0
    5. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717 > Lea9344
       
      Re

      avec du code VBA

      Sub test()
              Set Shp = ThisWorkbook.Worksheets("2014").Shapes("Ellipse 1")
                  Range("b2") = Shp.Fill.ForeColor
              Set Shp = ThisWorkbook.Worksheets("2014").Shapes("Ellipse 3")
                  Range("b3") = Shp.Fill.ForeColor
      End Sub
      0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Re,

    'Tableau de donnees et formules sur une feuille et Shapes sur une autre
    'exemple de formule
    '=colorieimage("2014";Ellipse 1";"ZoneTexte 1";SI(B3>=100;1845722;3695926))
    'code dans un module
    Function ColorieImage(feuille, s1, s2, couleur)
        Application.Volatile
        Set f = Sheets(feuille)
        f.Shapes(s1).Fill.ForeColor.RGB = couleur       'Elipse
        f.Shapes(s2).Line.ForeColor.RGB = couleur       ' Contour Zone de texte
        f.Shapes(s2).TextFrame2.TextRange.Font.Fill.ForeColor.RGB = couleur     'Texte Zne de texte
    End Function
    0
    1. Lea9344
       
      Bonjour f894009 et merci pour votre aide!

      Malheureusement, je n'arrive pas à faire fonctionner votre macro, j'ai pourtant suivi à la lettre vos consignes mais cela ne fonctionne pas.
      J'ai repris le document de Boisgontierjacques et ai fait quelques modifications en suivant vos indications, mais je n'arrive pas à différencier les formes rondes, des formes rectangulaires. Comment faire ?

      Ci-dessous, le lien vers mon document en cours :
      http://www.cjoint.com/c/EKcqxLP6Umh

      Merci d'avance,
      Léa
      0
      1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717 > Lea9344
         
        Bonjour,

        fichier modifie avec "ma macro": https://www.cjoint.com/c/EKcr3mBgvqf

        Une seule formule pour les deux formes

        A+
        0
  6. Boisgontierjacques Messages postés 177 Statut Membre 64
     
    Bonjour,

    https://www.cjoint.com/c/EJqpGO1nH3W
    http://boisgontierjacques.free.fr/fichiers/Images/Indic.xls

    =colorieimage(B2;SI(Feuil1!B2<100;couleurcellule(rouge);couleurcellule(vert)))

    Boisgontier
    0
    1. Lea9344
       
      Bonjour Boisgontierjacques,

      Merci pour votre retour, cela m'a permis d'avancer. Cependant, je reste toujours bloquer sur un point : comment puis-je différencier les deux types de formes :
      - rondes : colorier seulement le fond de la forme
      - rectangle : colorier le contour + colorier le texte de la forme

      Ci-dessous, le lien vers mon document en cours :
      http://www.cjoint.com/c/EKcqxLP6Umh

      Bonne journée,
      Léa
      0
  7. Boisgontierjacques Messages postés 177 Statut Membre 64
     
    Bonsoir,

    http://boisgontierjacques.free.fr/fichiers/Images/Indic1.xls

    Il faut créer 2 fonctions

    =colorieRond(B4;SI(Data!B2<100;couleurcellule(rouge);couleurcellule(vert)))
    =colorieRectangle(B4&"2";SI(Data!B3<0;couleurcellule(rouge);couleurcellule(vert)))

    Les formules sont copiables

    Function ColorieRond(s, couleur)
    Application.Volatile
    Set f = Sheets(Application.Caller.Parent.Name)
    f.Shapes(s).Fill.ForeColor.RGB = couleur
    f.Shapes(s).TextFrame2.TextRange.Font.Fill.ForeColor.RGB = vbBlack
    ColorieRond = ""
    End Function

    Function ColorieRectangle(s, couleur)
    Application.Volatile
    Set f = Sheets(Application.Caller.Parent.Name)
    f.Shapes(s).Fill.ForeColor.RGB = vbWhite
    f.Shapes(s).TextFrame2.TextRange.Font.Fill.ForeColor.RGB = couleur
    f.Shapes(s).Line.ForeColor.RGB = couleur
    ColorieRectangle = ""
    End Function

    Function CouleurCellule(c As Range)
    Application.Volatile
    CouleurCellule = c.Interior.Color
    End Function

    Boisgontier
    0
    1. Lea9344
       
      C'est parfait!!! Je vous remercie énormément! :)
      Bonne journée,
      Léa
      0