[XL-2007] Mise en forme de chaque caractère d'une étiquette de données [Résolu]

Signaler
Messages postés
24
Date d'inscription
vendredi 13 novembre 2009
Statut
Membre
Dernière intervention
27 juin 2012
-
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
-
Bonsoir à toutes et tous,



Etant, dans mon entreprise, tout juste confronté au passage à Excel 2007 et 2010 (j'avais déjà utilisé Excel 2007 sur mon ordinateur personnel), je rencontre au fur-et-à-mesure des problèmes au niveau du basculement de macros complémentaires réalisées sous Excel 2003 en Excel 2007 ou 2010.



Le problème auquel je me heurte est le suivant. Dans Excel 2003, j'avais réalisé une macro complémentaire qui permettait d'insérer dans les étiquettes de données d'un graphique, des valeurs (en "dur" ou en liaison via les formules d'adressage) issues d'une plage de données sélectionnée, et de copier la mise en forme de chaque cellule de la plage de données à l'étiquette correspondante.



Si la valeur affichée dans l'étiquette de données est insérée via une formule, une seule mise en forme peut être attribuée à cette étiquette de données. En revanche, si la valeur est présente en "dur", il était possible de mettre en forme chaque caractère de chaque étiquette de données.



Or, il apparaît que cette opération est impossible sous Excel 2007 et 2010. En effet, l'utilisation du code "DataLabel.Characters" semble poser problème : la mise en forme du n-ième caractère n'est pas affectée exclusivement à ce caractère là, mais à l'ensemble des caractères à la position n de toutes les étiquettes de données de la série.



Mes questions sont donc simples :


- Avez-vous déjà rencontré et/ou observé ce problème ?

- Si oui, avez-vous trouvé une solution pour pouvoir mettre en forme via VBA chaque caractère de chaque étiquette de données ?

- Vous êtes-vous fait à l'idée que la mise en forme via VBA de chaque caractère de chaque étiquette de données est impossible ?




Merci de vous être intéressés à mon problème, en vous remerciant par avances de vos futures réponses.



Bonne soirée.

14 réponses

Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
Bonjour,

Après maints essais je ne peux que confirmer ce que tu indiquais dans ton premier post.
Or, si le texte contenu dans la 4ème étiquette de données n'a que 3 caractères, il est donc logique que VBA renvoie une erreur (il est bien impossible de mettre en forme le 5ème caractère s'il n'y a que 3 caractères dans l'étiquette).
Effectivement, si la position du caractère à traiter dans l'étiquette en cours est plus grande que la longueur de la plus petite des étiquettes, il y erreur. Ce n'est pas logique puisque l'on traite les étiquettes une à une.
la mise en forme du n-ième caractère n'est pas affectée exclusivement à ce caractère là, mais à l'ensemble des caractères à la position n de toutes les étiquettes de données de la série.
Oui, c'est hélas confirmé !

Jusqu'à présent, pour mettre en valeur le pourcentage, je n'ai trouvé comme solution que d'avoir des chaînes de longueur fixe.

Bonne journée,

Cheyenne
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
229
devrait donc ressembler à (exemple avec un index 1 tant pour la collection ChartObjects que pour SeriesCollection) :
Dim toto As Point
   ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1).ApplyDataLabels
   For Each toto In ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1).Points
      toto.DataLabel.Text = "blablabla"
      toto.DataLabel.Characters(1, 3).Font.Size = 14
    Next pt

qui fonctionne...
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
Bonsoir ucfoutu,

C'est ok, sauf que :
Next toto et non pas Next pt

C'est gentil d'avoir donné le code car sous Excel 2007 l'enregistreur de macro ne fonctionne pas pour les graphiques (entre autres).

Cordialement,

Cheyenne
Messages postés
24
Date d'inscription
vendredi 13 novembre 2009
Statut
Membre
Dernière intervention
27 juin 2012

Bonjour ucfoutu et cheyenne, et bonjour à tous,



Merci pour vos réponses rapides. ucfoutu, ton code marche bien, mais il ne met pas le doigt sur le problème que je rencontre.



En effet, toutes les étiquettes de données de la 1ère série auront comme texte "blaBlaBla", et les 3 premiers caractères seront toujours en taille 14.



Merci à toi cheyenne pour la correction ("Next toto" à la place de "Next pt"). J'ai moi aussi vite vu que l'enregistreur de macro n'enregistre presque plus rien des actions réalisées sur un graphique dans Excel 2007 (par exemple la mise en forme d'un caractère d'une étiquette de données, ce qu'Excel faisait sans souci) : est-ce que c'est bien le cas pour tout le monde ?



Pour revenir sur ce quoi je bute, voici ce que je cherche à faire : dans des étiquettes de données ayant des nombres de caractères différents (3 pour la 1ère, 6 pour la 2ème et etc...), mettre en forme un caractère aléatoirement (par exemple le 2ème caractère pour la 1ère étiquette, puis le 5ème pour la 2ème et etc...).



Comme je l'ai mis dans mon 1er message, je constate concrètement que, quand j'applique mon code VBA sur la 1ère série d'un graphique, ce n'est pas le 5ème caractère de la 2ème étiquette de données qui est mis en forme, mais tous les 5èmes caractères de toutes les étiquettes de données de la 1ère série.



Or, si le texte contenu dans la 4ème étiquette de données n'a que 3 caractères, il est donc logique que VBA renvoie une erreur (il est bien impossible de mettre en forme le 5ème caractère s'il n'y a que 3 caractères dans l'étiquette).



Pour m'assurer que je ne dis pas de bêtises, pouvez-vous (je m'adresse à tous les forumeurs) tester ce code ci-dessous sur un graphique, avec 1 série et 5 points, que vous aurez sélectionné. En principe, vous devriez avoir l'erreur suivante :

"Erreur d'exécution '1004': Impossible de définir la propriété Bold de la classe Font."



Sub M_MEF_CAR_DATLAB()
    
    
Dim TAB_Parametres(5, 2) As Variant
Dim Cpt As Integer
Dim Pt As Point
Dim DatLab As DataLabel


TAB_Parametres(1, 1) =  "aaa"
TAB_Parametres(2, 1) = "bbbbbbb"
TAB_Parametres(3, 1) = "cc"
TAB_Parametres(4, 1) = "dddd"
TAB_Parametres(5, 1) = "eeeee"

TAB_Parametres(1, 2) = 1
TAB_Parametres(2, 2) = 5
TAB_Parametres(3, 2) = 2
TAB_Parametres(4, 2) = 3
TAB_Parametres(5, 2) = 4


Cpt = 0
For Each Pt In ActiveChart.SeriesCollection(1).Points
        Cpt = Cpt + 1
        Pt.ApplyDataLabels
        Set DatLab = Pt.DataLabel
        DatLab.Text = TAB_Parametres(Cpt, 1)
        Pt.DataLabel.Characters(TAB_Parametres(Cpt, 2), 1).Font.Bold = True
Next Pt
         
    
End Sub




Ce code permet donc d'afficher dans les 5 étiquettes de données des libellés ayant un nombre de caractères différents ("aaa" 3, "bbbbbbb" 7, "cc" = 2, "dddd" = 4 et "eeeee" = 5), puis de mettre en gras un caractère de chaque étiquette à une position différente (1er caractère pour la 1ère étiquette, 5ème caractère pour la 2ème, 2ème caractère pour la 3ème, 3ème caractère pour la 4ème et 4ème caractère pour la 5ème).




Merci à tous de votre aide.




Bonne journée.
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
Bonjour Airone1CF03,

Pourquoi ne pas utiliser ton second tableau afin de stocker une valeur aléatoire dépendant de la longueur du label de même indice ? Tu serais ainsi sûr de ne pas avoir d'erreur.

For Cpt = 1 To 5
   TAB_Parametres(Cpt, 2) = Int(Rnd() * Len(TAB_Parametres(Cpt, 1))) + 1
Next

puis dans ta boucle Each :
Pt.DataLabel.Characters(TAB_Parametres(Cpt, 2), 1).Font.Bold = True


Cheyenne
Messages postés
24
Date d'inscription
vendredi 13 novembre 2009
Statut
Membre
Dernière intervention
27 juin 2012

Bonjour Cheyenne,


Merci pour ta réponse. J'ai bien compris ton idée, mais elle ne me convient pas.


En fait, j'aurais du préciser que le côté aléatoire n'a pas d'importance : il s'agissait juste pour moi de dire que je voulais mettre en forme n'importe quel caractère de n'importe quelle étiquette de données.


Pour bien comprendre mon problème, voici un exercice plus concret qui permettra de mieux voir ce que je dis :

Sous Excel 2007, réaliser un histogramme vertical avec 3 barres, les valeurs associées étant 5%, 50% et 100%. Par macro, afficher les 3 étiquettes de données correspondant aux 3 barres, et mettre le caractère "%" en gras et en rouge.


Merci d'avance de me dire si vous avez réussi à faire cet exercice ou pas.


Bonne soirée.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
229
mettre le caractère "%" en gras et en rouge.

Hé bien ==>> dans ta boucle sur chaque pt :
En lire le DatLab.Text ===>> utiliser Instr pour y repérer la position pos de "%" ===>> utiliser cette position dans ton instruction de formatage !

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
Bonsoir,

Bien compris, prendre le dernier caractère de l'étiquette soit le %.
Pt.DataLabel.Characters(Len(TAB_Parametres(Cpt, 1)), 1).Font.Bold = True

Mais j'ai comme l'impression, d'après la rédaction de ton post, que je fais l'exercice à ta place ! Ce n'est pas le but du forum...

Bonne soirée à toi également,

Cheyenne
Messages postés
24
Date d'inscription
vendredi 13 novembre 2009
Statut
Membre
Dernière intervention
27 juin 2012

Merci ucfoutu pour ta réponse.


Celle-ci est certes excellente, mais théorique. Je pense que tu n'as pas du la tester dans la pratique, car, hormis avec la version "SP1", cela est impossible à faire avec VBA sous Excel 2007, et même Excel 2010.
Messages postés
24
Date d'inscription
vendredi 13 novembre 2009
Statut
Membre
Dernière intervention
27 juin 2012

Merci aussi Cheyenne pour ta réponse.


Je précise que l'exercice n'a pas du tout pour but de faire les choses à ma place, vu que je le fais facilement sur Excel 2003. Je l'ai bien sûr aussi essayé sur Excel 2007 et même Excel 2010. Le but de cet exercice était de passer de la théorie au concret.


Mais, au vu de cette évidence qui ressort dans vos messages, ucfoutu et Cheyenne, je comprends un peu mieux le fait que je ne trouve que peu de choses sur le problème sur le net. Avant de me pencher sur le sujet, je raisonnais exactement de la même façon que vous, en me disant que cela serait très facile.


Cela ne l'est en fait pas du tout, et je continue à me répéter : faire ce que j'ai demandé est impossible par macro sous Excel 2007 ainsi qu'Excel 2010.
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
Re

Ok pour l'exercice, tu cherches à résoudre un problème qui ne se posait pas dans les versions antérieures d'Excel.
Demain je vais faire le test.

En attendant, puisque cela parait impossible prenons le problème à l'envers.
Si le % n'est pas le dernier caractère tu utilises Instr (voir post de ucfoutu), tu mets tous tes caractères en gras et rouge, puis tu passes en noir et maigre ceux qui ne sont pas concernées. Certes, c'est une double opération un peu alambiquée, mais si cela est le seul moyen...

Avec Excel 2010, est-ce que l'enregistreur de macro est totalement opérationnel pour les graphiques et formes diverses ?

Cheyenne
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
Re,

Effectivement !!! on ne pas pas jouer sur un caractère si son emplacement est différent d'une étiquette à l'autre.

Voici une solution bâtarde : avoir une longueur de chaîne fixe pour chaque étiquette.

TAB_Parametres(1, 1) = "  5%"
TAB_Parametres(2, 1) = " 50%"
TAB_Parametres(3, 1) = "100%"
TAB_Parametres(4, 1) = " 50%"
TAB_Parametres(5, 1) = "  5%"

' dans la boucle

Pt.DataLabel.Characters(4, 1).Font.Bold = True
Pt.DataLabel.Characters(4, 1).Font.ColorIndex = 3

Là, c'est OK... mais est-ce vraiment ce que tu souhaites ?

Cheyenne
Messages postés
24
Date d'inscription
vendredi 13 novembre 2009
Statut
Membre
Dernière intervention
27 juin 2012

Bonjour Cheyenne,


Tout d'abord, merci de t'être penché très précisément et longuement sur mon problème.


Je suis donc content que tu valides mes dires. Des forumeurs sur les forums des sites developpez.net et excel-downloads confirment aussi mes propos.



A titre informatif, voici en fait exactement ce que je comptais faire : comme sur Excel 2003, je souhaitais réaliser ce qu'on appelle un "Chart Data Labeler".

Il s'agit d'une macro qui me permet d'insérer des libellés, sélectionnés dans une plage de données, en "dur" ou en liaison (via une formule) dans les étiquettes de données du graphique, en appliquant ou pas la mise en forme des cellules correspondantes dans cette plage de données.

Par conséquent, quand l'utilisateur choisissait de copier la mise en forme de chaque cellule sélectionnée, l'application de cette mise en forme à l'étiquette de données se faisait caractère par caractère, à condition que le libellé dans l'étiquette de données soit "en dur" (et non lié à une cellule).


Cheyenne, ta "solution bâtarde" est très intéressante pour un cas précis, et je la retiens. Mais dans mon cas, après ce que je viens d'expliquer, tu comprends bien que je ne peux pas l'utiliser, étant donné que cette macro "Chart Data Labeler" doit pourvoir fonctionner sur n'importe quel graphique, quel que soit le nombre d'étiquettes de données et les libellés contenus à l'intérieur.


J'avais donné ce petit exercice ou exemple pour montrer concrètement ce qui ne marche pas. Tu l'auras compris, je travaille en fait sur la généralité et non sur un cas particulier.



Je devais donc adapter cette macro à Excel 2007. La 1ère partie, à savoir l'insertion dans l'étiquette de données d'un libellé (lié à une cellule ou pas) ne m'a pas posé problème. C'est donc cette histoire de mise en forme qui m'a complètement stoppé. Mais désormais, je sais à quoi m'en tenir...



Merci donc à Cheyenne et ucfoutu pour vos précieux renseignements.



Bonne journée.
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
Bonjour Airone1CF03,

Merci pour le complément d'information apporté dans ton dernier post. Clair, net et précis.
Oui, parfaitement, je comprends bien que tu recherchais une solution globale.
J'aurai au moins pu apporter une solution pour un cas précis, désolé de ne pas pas pouvoir en faire plus étant limité par les bugs de cette version d'Excel.
Version qui, en réalité, est un produit non finalisé qui n'aurait jamais du voir le jour dans sa forme actuelle. Cela frise l'escroquerie... et j'ose espérer que dans la version 2010 l'enregistreur de macro soit pleinement opérationnel !

Bonne continuation,

Cheyenne