Mise en forme de chaque caractère d'une étiquette de données

Air1_16

XLDnaute Nouveau
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.
 

Misange

XLDnaute Barbatruc
Re : Mise en forme de chaque caractère d'une étiquette de données

Bonjour

Je me suis d'autant pplus vite faite à cette idée que je n'utilise jamais cela :)
mais bon en lançant l'enregistreur de macros je récupère ce code :

ActiveChart.SeriesCollection(1).Points(1).DataLabel.Select
With Selection.Format.TextFrame2.TextRange.Characters(4, 1).Font.Fill
.Visible = msoTrue
.ForeColor.RGB = RGB(255, 0, 0)
.Transparency = 0
.Solid
End With
ActiveChart.SeriesCollection(1).Points(1).DataLabel.Text = " €133.00 "

Beaucoup de choses ont changé dans les graphiques avec la version 2007 et il faut donner bien plus de précisions aujourd'hui (hélas). Je ne suis pas du tout surprise qu'un code valide sous 2003 ne le soit plus sur 2007 pour ce genre de mise en forme de graphiques. Essaie de bidouiller avec ça mais dans la mesure où l'on peut toujours manuellement modifier le format d'un caractère on doit pouvoir le faire en VBA.
 

Air1_16

XLDnaute Nouveau
Re : Mise en forme de chaque caractère d'une étiquette de données

Bonjour Misange et bonjour à tous,



Merci pour ta réponse rapide. Je suis effectivement d'accord avec toi sur les changements au niveau des graphiques entre Excel 2003 et Excel 2007, et pas étonné non plus qu'un code valide sous Excel 2003 ne le soit plus sous Excel 2007. Ce que m'étonne et que je ne comprends pas, c'est pourquoi je n'arrive plus à faire quelque chose qui me paraît très simple...



Comment as-tu réussi à obtenir ce code via l'enregistreur ? De mon côté, lorsque j'enregistre la modification du texte d'une étiquette de données et la mise en forme d'un caractères, je n'ai que peu de choses (code pour l'activation du graphique, la sélection de l'étiquette de données et le renommage de celle-ci).



Sur une étiquette de données, ce code marche bien. Il est bien évident que l'application sur une seule étiquette de données ne me suffit pas : il faut que je boucle sur chaque étiquette de données de chaque série du graphique. Par souci de facilité, je ne vais travailler que sur une seule série.



A titre de rappel, 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...).



Voici donc ton code que j'ai modifié. Le graphique "Test" est un histogramme vertical (graphique par défaut) avec 1 série et 5 points. Il y a donc une boucle sur les étiquettes de données de la 1ère série, en prenant en compte le contexte évoqué ci-dessus :

Code:
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)
        DatLab.Select
        
        With Selection.Format.TextFrame2.TextRange.Characters(TAB_Parametres(Cpt, 2), 1).Font.Fill
            .Visible = msoTrue
            .ForeColor.RGB = RGB(255, 0, 0)
            .Transparency = 0
            .Solid
        End With
   
Next Pt

    
End Sub




J'obtiens l'erreur suivante données ci-dessous. Et vous (je m'adresse aux forumeurs), avez-vous la même erreur que moi ?

"Erreur d'exécution '-2147467259 (80004005)': La méthode 'RGB' de l'objet 'ColorFormat' a échoué"



En principe, ce code permet 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 rouge 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 précieuse votre aide.




Bonne journée.
 

Misange

XLDnaute Barbatruc
Re : Mise en forme de chaque caractère d'une étiquette de données

Les graphiques dans excel 2007 sont disons gentiment inaboutis. MS a entre autres mis le produit en vente avant d'avoir eu le temps d'implémenter le VBA correspondant et l'enregistreur est très défaillant. C'est heureusement corrigé pour cet aspect là en tous cas sous 2010.
Je ne vois pas du tout pourquoi tu as cette ligne. Pour faire tes tests remplace .forecolor.rgb(... par .forecolor=vbred
c'est plus simple de mettre ton classeur en ligne...
 

Air1_16

XLDnaute Nouveau
Re : Mise en forme de chaque caractère d'une étiquette de données

Merci Misange de ta réponse. Le fichier que j'utilise est téléchargeable en cliquant sur le lien ci-dessous :


Test - MEF de chaque caractère d'une étiquette de données.xlsm



Voici le graphique que j'obtiens à l'erreur :





Comme j'ai pu l'écrire dans mon premier message, l'erreur vient selon moi de l'application de la mise en forme du caractère n° "n" d'une étiquette de données d'une série à l'ensemble des caractères n° "n" de toutes les étiquettes de données de la série.



Concrètement, dans mon cas de figure, voici comment agit la macro selon moi :


1) Le libellé "aaa" est appliqué à l'étiquette de données de la 1ère barre. Le 1er caractère est mis en rouge.

2) Il n'y a pas d'erreur, car il n'y a pas encore d'autres étiquettes de données.

3) Le libellé "bbbbbbb" est inséré dans l'étiquette de données de la 2ème barre. Comme prévu, le 5ème caractère est mis en rouge.

4) La macro va alors chercher à mettre en forme le 5ème caractère des étiquettes de données existantes pour la série. En plus de l'étiquette actuellement mise en forme, il n'y a que l'étiquette associée à la 1ère barre qui existe. Or, le libellé de cette étiquette ne comporte que 3 caractères : il est donc impossible de mettre en forme un caractère qui n'existe pas.

5) VBA renvoie donc un message d'erreur au moment au la macro essaie de mettre en rouge un caractère inexistant : d'où le bug sur la ligne ".ForeColor.RGB = RGB(255, 0, 0)". L'exécution de la macro est donc stoppée.



A travers ces explications plus concrètes, est-ce que tu perçois mieux mon problème ? Rejoins-tu ma théorie ou pas ?



Merci encore de te pencher sur mon problème.



Cordialement.
 

Misange

XLDnaute Barbatruc
Re : Mise en forme de chaque caractère d'une étiquette de données

Essaie d'ajouter un on error resume next ou alors akoute une condition dans ta boucle pour dire que si tu traites le NIème caractère et que l'étiquette en contient moins tu passes à l'étiquette suivante.
 

Air1_16

XLDnaute Nouveau
Re : Mise en forme de chaque caractère d'une étiquette de données

C'est une très bonne idée que j'ai testée il y a quelques minutes.


Cependant, voici le résultat, bout de code, fichier et image à l'appui :


Code:
On Error Resume Next
With Selection.Format.TextFrame2.TextRange.Characters(TAB_Parametres(Cpt, 2), 1).Font.Fill
      .Visible = msoTrue
      .ForeColor.RGB = RGB(255, 0, 0)
      .Transparency = 0
      .Solid
End With
On Error GoTo 0

-> Gestion de l'erreur effectuée.





La macro a donc été exécutée sans erreur. Mais le graphique obtenu ne répond pas à mes attentes. En effet, dans chaque étiquette de données, un seul caractère devrait apparaître en rouge, ce qui n'est pas du tout le cas.


Et cela s'explique encore une fois comme j'ai pu le faire dans mon dernier message, sauf que cette fois-ci, la gestion de l'erreur permet à la macro d'aller à son terme :


1) "aaa" est inséré dans la 1ère étiquette. Le 1er caractère de cette étiquette est mis en rouge.

2) "bbbbbbb" est inséré dans la 2ème étiquette. Le 5ème caractère de cette étiquette est mis en rouge. Le 5ème caractère de la 1ère étiquette ne peut pas être mis en rouge car il n'existe pas. La gestion de l'erreur permet d'éviter l'arrêt de la macro.

3) "cc" est inséré dans la 3ème étiquette. Le 2ème caractère de cette étiquette est mis en rouge. De plus, le 2ème caractère existant dans la 1ère et la 2ème étiquette, le 2ème "a" et le 2ème "b" sont aussi mis en rouge.

4) "dddd" est inséré dans la 4ème étiquette. Le 3ème caractère de cette étiquette est mis en rouge. De plus, le 3ème caractère existant dans la 1ère et la 2ème étiquette (pas dans la 3ème), le 3ème "a" et le 3ème "b" sont aussi mis en rouge.

5) "eeeee" est inséré dans la 5ème étiquette. Le 4ème caractère de cette étiquette est mis en rouge. De plus, le 4ème caractère existant dans la 2ème et la 4ème étiquette (pas dans la 1ère ni dans la 3ème), le 4ème "b" et le 4ème "d" sont aussi mis en rouge.



Au final, on a donc mis en rouge :

- les 3 "a" (seul le 1er devait l'être)
- 3 "b" (seul le 5ème devait l'être)
- le second "c"
- les 2 derniers "d" (seul le 3ème devait l'être)
- le 4ème "e"



Je repose ma question d'une manière différente : est-il normal, sur Excel 2007, que la mise en forme spécifique apportée à un caractère d'une étiquette de données d'une série s'applique à tous les caractères, placés à la même position, de toutes les étiquettes de données de la série ?


Y'a-t-il un moyen pour résoudre, ou tout du moins contourner ce problème ?



Merci d'avance pour vos réponses.
 

Pièces jointes

  • Test - MEF de chaque caractère d'une étiquette de données.xlsm
    20.3 KB · Affichages: 62

Misange

XLDnaute Barbatruc
Re : Mise en forme de chaque caractère d'une étiquette de données

Suis le déroulement de ta macro pas à pas et regarde où elle se trompe et corrige, je pense que tu as trouvé toi même tous les éléments te permettant de le faire. Quand à répondre à ta question sur la normalité de la chose, elle est beaucoup trop précise pour que même le team de développement sur excel à Seattle ait pu l'imaginer !
Au lieu de mettre on error resume next, gère véritablement chaque possibilité en fonction du nb de caractères de l'étiquette de la position de chaque caractère et du nombre total d'étiquettes. Il n'y a surement pas de réponse générique à ta question.
 

Air1_16

XLDnaute Nouveau
Re : Mise en forme de chaque caractère d'une étiquette de données

Au lieu de mettre on error resume next, gère véritablement chaque possibilité en fonction du nb de caractères de l'étiquette de la position de chaque caractère et du nombre total d'étiquettes. Il n'y a surement pas de réponse générique à ta question.


Je ne peux absolument rien faire. Par exemple, lorsque je veux mettre le 4ème "e" en rouge (la chaîne "eeeee" étant insérée juste avant dans l'étiquette de données), tous les 4èmes caractères existants des étiquettes de données de la série se mettent instantanément en rouge.


C'est quelque chose qui est induit dans le code VBA et que le programmateur ne peut pas toucher. Dans ma boucle sur les points de la série, il n'y a pas de sous-boucle sur les étiquettes de données. Je ne peux qu'intervenir sur l'étiquette de données sur laquelle la boucle est arrivée, et non sur toutes les autres touchées collatéralement par une mise en forme qui n'a pas lieu d'être.



Je crois avoir trouvé la confirmation de ce que je cherche :

LIEN


Il est dit que le formatage individuel des caractères des libellés présents dans les étiquettes de données n'est plus possible à partir de la version "Excel 2007 SP2" (alors que cela l'est sur Excel 2003 et Excel 2007 SP1), car le formatage s'applique à l'ensemble des étiquettes de données au lieu du caractère spécifique, à moins d'effectuer ce formatage "manuellement" (et non par macro).


Le rédacteur indique que c'est un bug qui est apparu dans la version "Excel 2007 SP2", et que les développeurs travaillent dessus.



Ils doivent en mettre du temps, car je constate exactement le même problème dans Excel 2010...




Merci quand même pour le temps consacré à m'aider.



Bonne soirée.
 

Misange

XLDnaute Barbatruc
Re : Mise en forme de chaque caractère d'une étiquette de données

C'est effectivement assez précis !
il y a malheureusement beaucoup de bugs répertoriés chez microsoft mais non corrigés dans les versions suivantes. Débugger un programme fait souvent apparaitre de nouveaux bugs et à moins que beaucoup de gens ne soient impactés, il ne se mobilisent pas. J'en ai fait déjà plein de fois l'expérience hélas. Même sur des trucs demandés par plein plein de gens parfois il ne font rien (le N° de semaine à la norme européenne en est un exemple emblématique).
Je crains que ton bug n'impactant que peu (!) les ventes d'office, il ne soit pas prioritaire avant un moment...
 

Air1_16

XLDnaute Nouveau
Re : Mise en forme de chaque caractère d'une étiquette de données

Bonjour Misange,


Tout d'abord, merci de t'être penché sur mon problème.


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



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).



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 à Misange pour tes précieux renseignements.



Bonne journée.
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
314 628
Messages
2 111 337
Membres
111 104
dernier inscrit
JEMADA