VB gestion taille et couleur de label HELP!

Résolu/Fermé
ludovodul Messages postés 38 Date d'inscription mercredi 14 mars 2012 Statut Membre Dernière intervention 25 mars 2012 - Modifié par ludovodul le 15/03/2012 à 20:11
ludovodul Messages postés 38 Date d'inscription mercredi 14 mars 2012 Statut Membre Dernière intervention 25 mars 2012 - 25 mars 2012 à 15:00
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 !


A voir également:

43 réponses

ccm81 Messages postés 10855 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 avril 2024 2 404
Modifié par ccm81 le 15/03/2012 à 21:31
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
ludovodul Messages postés 38 Date d'inscription mercredi 14 mars 2012 Statut Membre Dernière intervention 25 mars 2012
16 mars 2012 à 08:39
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
ccm81 Messages postés 10855 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 avril 2024 2 404
16 mars 2012 à 10:41
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
ludovodul Messages postés 38 Date d'inscription mercredi 14 mars 2012 Statut Membre Dernière intervention 25 mars 2012
16 mars 2012 à 11:02
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ccm81 Messages postés 10855 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 avril 2024 2 404
Modifié par ccm81 le 16/03/2012 à 11:16
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
ludovodul Messages postés 38 Date d'inscription mercredi 14 mars 2012 Statut Membre Dernière intervention 25 mars 2012
16 mars 2012 à 11:32
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
ccm81 Messages postés 10855 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 avril 2024 2 404
16 mars 2012 à 15:33
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
ludovodul Messages postés 38 Date d'inscription mercredi 14 mars 2012 Statut Membre Dernière intervention 25 mars 2012
Modifié par ludovodul le 16/03/2012 à 15:58
WAOU !!! Merci encore ccm81 ... Tu es une sorte de Dieu du VBA non?
Merci encore et très bonne journée à toi !
0
ludovodul Messages postés 38 Date d'inscription mercredi 14 mars 2012 Statut Membre Dernière intervention 25 mars 2012
16 mars 2012 à 17:35
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
ccm81 Messages postés 10855 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 avril 2024 2 404
16 mars 2012 à 18:07
clic-droit sur l'axe des ordonnées/Format de l'axe/Echelle/Axe des ordonnées (X) coupe à 0

bonne suite
0
ludovodul Messages postés 38 Date d'inscription mercredi 14 mars 2012 Statut Membre Dernière intervention 25 mars 2012
17 mars 2012 à 09:30
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
ccm81 Messages postés 10855 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 avril 2024 2 404
Modifié par ccm81 le 17/03/2012 à 11:18
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
ludovodul Messages postés 38 Date d'inscription mercredi 14 mars 2012 Statut Membre Dernière intervention 25 mars 2012
Modifié par ludovodul le 17/03/2012 à 12:16
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
ccm81 Messages postés 10855 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 avril 2024 2 404
17 mars 2012 à 12:37
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
ludovodul Messages postés 38 Date d'inscription mercredi 14 mars 2012 Statut Membre Dernière intervention 25 mars 2012
17 mars 2012 à 12:59
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
ccm81 Messages postés 10855 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 avril 2024 2 404
17 mars 2012 à 17:11
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
ludovodul Messages postés 38 Date d'inscription mercredi 14 mars 2012 Statut Membre Dernière intervention 25 mars 2012
18 mars 2012 à 19:05
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
ccm81 Messages postés 10855 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 avril 2024 2 404
Modifié par ccm81 le 18/03/2012 à 21:14
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
ludovodul Messages postés 38 Date d'inscription mercredi 14 mars 2012 Statut Membre Dernière intervention 25 mars 2012
19 mars 2012 à 09:10
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
ccm81 Messages postés 10855 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 avril 2024 2 404
Modifié par ccm81 le 19/03/2012 à 10:32
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
ludovodul Messages postés 38 Date d'inscription mercredi 14 mars 2012 Statut Membre Dernière intervention 25 mars 2012
19 mars 2012 à 12:23
Tu es prof de VBA non?
Merci encore pour tout et pour ta pédagogie...

Bonne journée
0