VB gestion taille et couleur de label HELP!

Résolu
ludovodul Messages postés 39 Statut Membre -  
ludovodul Messages postés 39 Statut Membre -
Bonjour à tous,

Totalement novice en VBA !

En abscisse j'ai mes occurences : le nombre de fois où un sujet revient.
En ordonnée : le niveau de satisfaction avec lequel est exprimé le sujet.

Dans mes statistiques, j'ai d'autres données intéressantes à montrer aux clients, mais que je n'arrive pas à rendre visuellement :

L'implication : le texte grossi en fonction de l'implication
Texte (label) gros si indice d'implication > 0.75
Texte (label) moyen si indice d'implication entre 0.5 et 0.75
Texte (label) petit si indice d'implication <0.5

L'émotionnel :
Texte (label) rouge si le sujet est émotionnel (1)
Texte (label) bleu si le sujet est rationnel (0)

J'ai commencé par faire cette macro pour spécifié mes séries... Mais je n'y arrive pas !!!

Mes questions :
Comment agir sur le label et pas sur le point???
Comment appliquer la différence de taille sur le label?
Comment appliquer la différence de couleur???
Et, enfin, comment utiliser des couleurs RVB???

BREF: beaucoup de questions je m'en rend compte, mais si quelqu'un peu m'aider ce serait super !!!!!
Merci d'avance !!

(Le fichier en pièce jointe : https://www.cjoint.com/?BCpsSBMKG6I )

Sub macro1()
Dim nbpts As Long, nupt As Long
Dim valY, Gr
' implication - série n° 3
Set Gr = ActiveSheet.ChartObjects(1).Chart
valY = Gr.SeriesCollection(1).Values
nbpts = Gr.SeriesCollection(1).Points.Count
With Worksheets(1).ChartObjects(1).Chart.SeriesCollection(1).Label
.SelFontName = "Arial"
With Gr.SeriesCollection(3).Points(nupt)
If valY(nupt) >= 0.75 Then
.SelFontSize = 20
ElseIf valY(nupt) >= 0.5 Then
.SelFontSize = 15
ElseIf valY(nupt) < 0.5 Then
.SelFontSize = 8
End If
End With
End With
' emotionnel - série n° 4
Set Gr = ActiveSheet.ChartObjects(1).Chart
valY = Gr.SeriesCollection(1).Values
nbpts = Gr.SeriesCollection(1).Points.Count
With Worksheets(1).ChartObjects(1).Chart.SeriesCollection(1).Label
.SelFontName = "Arial"
With Gr.SeriesCollection(4).Points(nupt)
If valY(nupt) = 1 Then
.SelFontColor = 20
ElseIf valY(nupt) >= 0 Then
.SelFontColor = 15
End If
End With
End With
End Sub

Message d'erreur : propriétés ou méthode non gérée !

43 réponses

  • 1
  • 2
  • 3
Résumé de la discussion

Pour comprendre la personnalisation des étiquettes de série dans Excel via VBA, il faut faire varier le texte des labels selon l'implication et la couleur selon l'émotionnel.
Des propositions ciblent d'agir sur le label et non sur le point, d'appliquer des règles de taille et de couleur directement dans le code, et d'utiliser des codes RVB.
Plusieurs réponses évoquent des difficultés pratiques, notamment l'erreur Propriétés ou méthode non gérée sur Mac, des soucis d'exécution des macros et des conseils pour l'alignement des axes.
En dernier élément, plusieurs échanges signalent des problématiques d'ergonomie et de fonctionnement (boutons inactifs, exécution via l'IDE ou des options système), apportant une nuance utile sur les limites multiplateformes.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. ccm81 Messages postés 11033 Statut Membre 2 434
     
    bonsoir

    un essai de gestion des étiquettes (taille-couleur police) de la série "satisfaction"
    https://www.cjoint.com/?0CpvjLJEFCX

    RQ1. dans ton premier essai de macro tu avais tenté d'agir sur les 'MarkerSize", j'en avais déduit que c'était sur la taille des points que tu voulais agir.
    RQ2. je ne comprends pas bien ce que tu veux faire
    - as tu enregistré ton fichier au format excel 2003 ? il est arrivé avec une seule série de données (satisfaction) sans macro et des alertes sur le format du fichier, alors que le premier était arrivé "normalement"
    - il est possible d'agir sur les propriétés d'une série (par ex satisfaction) en fonction des données dans une autre colonne (par ex émotionnel)
    - combien de séries doit intégrer ton graphique, la/lesquelles?

    bonne suite
    0
  2. ludovodul Messages postés 39 Statut Membre
     
    Bonjour ccm81,

    J'avais compris aussi que le client souhaitait agir sur les MarkerSize des 4 séries, mais en fait c'est sur les labels d'une seule série qu'il souhaite agir.

    Son objectif : faire en sorte que les mots de la série "satisfaction" aient une couleur ou une taille différentes en fonction des paramètres "émotionnels" et "implications".

    (je ne sais pas trop si je suis claire... j'espère...)

    J'ai donc repris le fichier sur lequel tu m'avais aidé et je l'ai transformé. Mais sans succès. Il me manque l'expérience...

    Voici le lien : https://www.cjoint.com/?BCqiLkc47bf

    Pour résumer : il n'y a qu'une seule série dans le graphique et son apparence est modifiée par les deux autres.
    0
  3. ccm81 Messages postés 11033 Statut Membre 2 434
     
    il y a un pb avec la transmission de ton fichier (format excel 2003, lien avec un autre classeur, .... )
    J'ai donc repris la demande de ton premier message et tenté ceci
    https://www.cjoint.com/?0CqkJGfbbCD

    dans le code, les plages Emo et Impli sont en "dur", si elles sont déplacées, il faudra modifier le code, sinon, on peut faire mieux en les nommant dans la feuille de calcul, tu dis

    je ne comprends pas bien pourquoi les titres des axes sont en dehors du graphique

    bonne suite
    0
  4. ludovodul Messages postés 39 Statut Membre
     
    Merci mille fois ccm81 !
    C'est exactement le résultat que je voulais obtenir... Merci encore

    Quand tu dis "les nommer dans la feuille de calcul" ça veut dire quoi exactement?

    Concernant les titres des axes, je les ai mis à la main car je ne savais pas les implémenter directement... Mais je t'avoue aussi que je n'ai pas vraiment cherché !
    Je préférais me concentrer sur mon problème de Label.

    Si jamais tu as un conseil là-dessus !

    Sinon, je te remercie encore !

    Ludo
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ccm81 Messages postés 11033 Statut Membre 2 434
     
    1. nommer les plages Emotionnel (G7:G16) et implication (F7:F16)
    avec Insertion/nom/Définir tu peux attribuer un nom à ces plages (et modifier le code de la macro en conséquence),
    - si tu les déplaces dans la feuille, tu n'as plus besoin de modifier le code
    - on peut faire encore mieux si tu dois ajouter des lignes à tes séries, mais c'est un peu plus compliqué)
    2. pour les titres des axes tu les a dans Options du graphique
    0
  7. ludovodul Messages postés 39 Statut Membre
     
    Bon... J'ai essayé d'inclure les titres des axes, mais ce n'est pas folichon. Le titre vient par-dessus, il n'est pas lier au titre de la colonne (il marque "Titre de l'axe")... Bref, c'est pas génial... mais bon, ça peut se corriger à la main donc c'est OK !

    Concernant les séries c'était un peu la question que je me posais !
    Ce tableau est un tableau d'essai mais, effectivement, je vais devoir rajouter des lignes. Dans ce cas, je peux aussi changer les coordonnées des cellules en "dur"... Ce ne sera pas parfait, mais si tu dis que l'autre solution est plus compliquée, ça me permettra d'avancer.

    Merci vraiment pour ton aide précieuse !
    0
  8. ccm81 Messages postés 11033 Statut Membre 2 434
     
    un exemple de ce qu'on peut faire avec des plages de données "dynamiques"
    https://www.cjoint.com/?0CqpD1JcaCY
    RQ. on peut se passer du bouton OK et faire en sorte que l'ajout d'une ligne provoque à la fois la maj du graphique et des labels (en fin de projet)

    bonne fin de journée
    0
  9. ludovodul Messages postés 39 Statut Membre
     
    WAOU !!! Merci encore ccm81 ... Tu es une sorte de Dieu du VBA non?
    Merci encore et très bonne journée à toi !
    0
  10. ludovodul Messages postés 39 Statut Membre
     
    Une dernière question : sur le dernier tableau que tu m'as corrigé, l'abscisse est en bas... Hors, j'aimerais qu'elle soit calée avec le "zéro" de l'ordonnée
    (potentiellement, il peut y avoir un +1 en ordonnée, cela signifie que l'abscisse ne serait pas tout en haut, mais en peu en dessous)

    Peux-tu me dire comment je peux le régler???

    Merci d'avance et bonne journée !

    Ludo
    0
  11. ccm81 Messages postés 11033 Statut Membre 2 434
     
    clic-droit sur l'axe des ordonnées/Format de l'axe/Echelle/Axe des ordonnées (X) coupe à 0

    bonne suite
    0
  12. ludovodul Messages postés 39 Statut Membre
     
    Merci ccm81 !
    Il fallait que j'agisse sur l'Axe des abscisses, mais ça marche nickel !

    BON... J'abuse complétement mais je suis face à deux autres problèmes :
    - Dans la suite (ci-dessous) j'ai mis scrupuleusement le même nombre de "End If" que de If mais le message suivant apparaît : erreur de compilation End If sans Bloc If

    - J'ai rajouté une colonne que j'ai nommée Const plageUti = "PlageUti"
    Dans cette colonne je dois extraire les 10 plus grands nombres ....
    Mais je n'y arrive pas !!!
    J'ai essayé en regardant d'autre cas sur d'autres forums mais ça ne marche pas sur mon tableau ...
    Ce que j'aimerais c'est souligner les 10 plus grand nombre du tableau dans le graphique .... Si jamais quelqu'un à une idée????

    Je ne m'en sors pas... MERCI !!!

    ' implication
    i = ActiveSheet.Range(plageImp).Cells(nupt, 1).Value
    If i <= 0.1 Then
    .Size = 8
    ElseIf i >= 0.1 <= 0.2 Then
    .Size = 9
    ElseIf i >= 0.2 <= 0.3 Then
    .Size = 10
    ElseIf i >= 0.3 <= 0.4 Then
    .Size = 11
    ElseIf i >= 0.4 <= 0.5 Then
    .Size = 12
    ElseIf i >= 0.5 <= 0.6 Then
    .Size = 15
    ElseIf i >= 0.6 <= 0.7 Then
    .Size = 19
    ElseIf i >= 0.7 <= 0.8 Then
    .Size = 24
    ElseIf i >= 0.8 <= 0.9 Then
    .Size = 30
    ElseIf i >= 0.9 <= 1 Then
    .Size = 37
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    ' emotionnel
    i = ActiveSheet.Range(plageEmo).Cells(nupt, 1).Value
    ' couleur bleue
    If i <= 0.1 Then
    .Color = RGB(0, 40, 190)
    ElseIf i >= 0.1 <= 0.2 Then
    .Color = RGB(0, 70, 190)
    ElseIf i >= 0.2 <= 0.3 Then
    .Color = RGB(0, 90, 190)
    ElseIf i >= 0.3 <= 0.4 Then
    .Color = RGB(0, 110, 190)
    ElseIf i >= 0.4 <= 0.5 Then
    .Color = RGB(0, 130, 190)
    ' couleur rouge
    ElseIf i >= 0.5 <= 0.6 Then
    .Color = RGB(190, 40, 0)
    ElseIf i >= 0.6 <= 0.7 Then
    .Color = RGB(190, 70, 0)
    ElseIf i >= 0.7 <= 0.8 Then
    .Color = RGB(190, 90, 0)
    ElseIf i >= 0.8 <= 0.9 Then
    .Color = RGB(190, 110, 0)
    ElseIf i >= 0.9 <= 1 Then
    .Color = RGB(190, 130, 0)
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End With
    0
  13. ccm81 Messages postés 11033 Statut Membre 2 434
     
    pour ton code
    1. ElseIf n'est pas la même chose que Else If
    avec ElseIf un seul EndIf (celui du If)
    avec Else If un End If par If
    2. i>0.5 <=0.6 devrait s'écrire i>0.5 and i<=0.6
    mais ce n'est pas utile (si tu es ici, c'est DEJA que i >0.5)
    3. il y a beaucoup mieux en matière de choix multiple
        ' implication   
        i = ActiveSheet.Range(plageImp).Cells(nupt, 1).Value   
        Select Case i   
          Case Is <= 0.1: .Size = 8   
          Case Is <= 0.2: .Size = 9   
          Case Is <= 0.3: .Size = 10   
          Case Is <= 0.4: .Size = 11   
          Case Is <= 0.5: .Size = 12   
          Case Is <= 0.6: .Size = 15   
          Case Is <= 0.7: .Size = 19   
          Case Is <= 0.8: .Size = 24   
          Case Is <= 0.9: .Size = 30   
          Case Else: .Size = 37   
        End Select

    pour le reste tu peux essayer une mise en forme conditionnelle avec la "formule est" et la fonction GRANDE.VALEUR

    bonne suite
    0
  14. ludovodul Messages postés 39 Statut Membre
     
    Pour te répondre:
    1. Si je force End If à devenir EndIf ça ne fonctionne pas... Il se "décolle "automatiquement ...

    2. C'est ce que je pensais aussi c pour cela que je n'avais pas rajouter " and i"
    Merci !

    3. J'ai réécrit le code en fonction, mais ça ne fonctionne pas... C'est très bizarre... Même la couleur ne fonctionne pas??

    Option Explicit

    Const plageEmo = "PlageEmo"
    Const plageImp = "PlageImp"
    Const plageUti = "PlageUti"

    Private Sub btOK_Click()
    Dim nbpts As Long, nupt As Long
    Dim i
    Dim Gr
    Set Gr = ActiveSheet.ChartObjects(1).Chart
    nbpts = Gr.SeriesCollection(1).Points.Count
    For nupt = 1 To nbpts
    With Gr.SeriesCollection(1).Points(nupt).DataLabel.Font

    ' implication
    i = ActiveSheet.Range(plageImp).Cells(nupt, 1).Value
    Select Case i
    Case Is <= 0.1: .Size = 8
    Case Is <= 0.2: .Size = 9
    Case Is <= 0.3: .Size = 10
    Case Is <= 0.4: .Size = 11
    Case Is <= 0.5: .Size = 12
    Case Is <= 0.6: .Size = 15
    Case Is <= 0.7: .Size = 19
    Case Is <= 0.8: .Size = 24
    Case Is <= 0.9: .Size = 30
    Case Else: .Size = 37
    End Select

    ' emotionnel
    i = ActiveSheet.Range(plageEmo).Cells(nupt, 1).Value
    Select Case i
    ' couleur bleue
    Case Is <= 0.1: .Color = RGB(0, 40, 190)
    Case Is <= 0.2: .Color = RGB(0, 70, 190)
    Case Is <= 0.3: .Color = RGB(0, 90, 190)
    Case Is <= 0.4: .Color = RGB(0, 110, 190)
    Case Is <= 0.5: .Color = RGB(0, 130, 190)
    ' couleur rouge
    Case Is <= 0.6: .Color = RGB(190, 40, 0)
    Case Is <= 0.7: .Color = RGB(190, 70, 0)
    Case Is <= 0.8: .Color = RGB(190, 90, 0)
    Case Is <= 0.9: .Color = RGB(190, 110, 0)
    Case Else: .Color = RGB(190, 130, 0)
    End Select

    End With
    Next nupt
    Set Gr = Nothing
    End Sub

    4. Grâce au bouton "Mise en forme conditionnelle" j'arrive à obtenir les 10 valeurs que je souhaite. J'aimerai qu'elles se traduise par le mot en gras dans le graphique... On peut lier la fonction directement sur le graphique par un code??
    (je ne connais pas le "GRANDE.VALEUR")
    D'ailleurs, ce ne sont pas vraiment les grandes valeurs que je souhaite, c'est plutôt l'inverse... Comme ce sont des valeurs négatives, ce sont les valeurs les plus éloignées de zéro...

    https://www.cjoint.com/?BCrmphzsQLS
    ou ce lien
    https://www.cjoint.com/?BCrmpI4U0yJ

    MERCI !!
    0
  15. ccm81 Messages postés 11033 Statut Membre 2 434
     
    1. désolé pour le End If qui est toujours "décollé"
    3. le code fonctionne chez moi
    https://www.cjoint.com/?0CrmIhxzdem
    pour la couleur, la plageEmo ne contenant que des 0 et des 1, il est normal de n'avoir que 2 couleurs
    4. vois sur l'exemple l'utilisation de GRANDE.VALEUR
    si tu ne l'as pas à disposition elle est peut être dans les utilitaires d'analyse (Outils/options/Macros complémentaire)
    0
  16. ludovodul Messages postés 39 Statut Membre
     
    3. Côté tailles et couleurs, tout fonctionne ! c'est super ...
    (Oups !!! je me suis trompé sur un détail dans le tableau)

    4. Si si je le bouton a disposition !
    Et dans le tableau cela marche très bien !
    Une copie d'écran :https://www.cjoint.com/?BCrm3E3nQUf

    C'est la traduction de ces "10 valeurs" dans le graphique que je n'arrive pas à avoir.

    J'imagine que je dois créer
    Const plageUti = "PlageUti"

    Mais comment je traduis que ces 10 valeurs sont soulignées et en gras (par exemple) dans le graphique?
    Est-ce que j'ai un moyen pour les cibler directement et leur pose un attribut différent??
    0
  17. ccm81 Messages postés 11033 Statut Membre 2 434
     
    quelque chose comme ça?

    Const plageUti = "PlageUti"
    Const pp = 5 ' pour traitement des pp plus petites valeurs de plageUti  
    
        ' utilité
        i = ActiveSheet.Range(plageUti).Cells(nupt, 1).Value
        If i <= Application.WorksheetFunction.Small(ActiveSheet.Range(plageUti), pp) Then
          .Bold = True
          .Underline = xlUnderlineStyleSingle
        Else
          .Bold = False
          .Underline = xlNone
        End If

    bon week end
    0
    1. ludovodul Messages postés 39 Statut Membre
       
      Je pense...
      En le rentrant dans mon code ça ne fonctionne pas (le message : "Erreur de compilation : Référence incorrecte ou non qualifiée" apparaît), mais je pense que ça vient du tableau.
      Dans le tableau, il faut que je marque la cellule "Utilité" de la fonction "PlageUti" pour que le code puisse la reconnaître ... Mais je n'ai pas bien saisi comment faire...
      Quand je fais clic droit / insérer une fonction, je ne sais pas où aller pour lui mettre "PlageUti".

      Je ne sais pas si tu arriveras à lire ces liens : https://www.cjoint.com/?BCstd7l7IfU ou https://www.cjoint.com/?0Cste2SG5ud

      Merci encore ! Heureusement que tu es là ! Tu es d'une aide précieuse ... Alors que moi, je ne t'apporte rien. Merci encore pour cet générosité !
      0
  18. ccm81 Messages postés 11033 Statut Membre 2 434
     
    1. je ne peux toujours pas lire ton fichier .xls, il y a des liaisons externes et les macros sont perdes à l'ouverture

    2. si tu as une erreur de compilation c'est que ton code est incorrect, ça n'a ri"n à voir avec une mauvaise définition de "plageUti" qui provoquerait une erreur à l'exécution.
    PlageUti n'est pas une fonction mais une constante
    as tu déclaré les deux constantes à la suite des autres constantes au début du code

    Const plageUti = "PlageUti"   
    Const pp = 5 ' pour traitement des pp plus petites valeurs de plageUti  

    3. plageUti doit être déclarée dans la feuille comme les autres plages (plageEmo, ...)
    Insertion/nom/définir
    le plus simple
    - tu te mets sur plageEmo
    - dans la fenêtre nom dans le classeur tu change le nom en plagUti
    - tu remplaces les 3 références de colonne G par H
    - OK
    pour contrôler
    - Insertion/nom/definir
    - sélectionne plageUti
    - clic sur DECALER doit sélectionner la bonne plage sur la feuille

    4. ce que ça donne
    https://www.cjoint.com/?0CsuS2BeEAF

    bonne suite
    0
  19. ludovodul Messages postés 39 Statut Membre
     
    Super ! merci ... c parfait maintenant !

    Dernière question idiote ( et promis, après j'arrête!) : que veut dire "Const pp = 5"
    Qu'est-ce que "pp"???

    Merci !

    Bonne journée et bonne semaine
    0
  20. ccm81 Messages postés 11033 Statut Membre 2 434
     
    pp est le nombre de cellules "soulignées" dans ta feuille, chez moi, j'ai mis 5 (ma liste est courte), chez toi, d'après ce que j'ai compris, ce sera 10
    pp intervient ici (Small est l'équivalent VBA de PETITE.VALEUR)
        If i <= Application.WorksheetFunction.Small(ActiveSheet.Range(plageUti), pp) Then 
          .Bold = True 
          .Underline = xlUnderlineStyleSingle 
        Else 
          .Bold = False 
          .Underline = xlNone 
        End If

    bonne suite
    0
  21. ludovodul Messages postés 39 Statut Membre
     
    Tu es prof de VBA non?
    Merci encore pour tout et pour ta pédagogie...

    Bonne journée
    0
  • 1
  • 2
  • 3