SeriesCollection [Résolu]

Signaler
Messages postés
43
Date d'inscription
dimanche 12 mars 2006
Statut
Membre
Dernière intervention
24 juin 2011
-
Patrice H
Messages postés
43
Date d'inscription
dimanche 12 mars 2006
Statut
Membre
Dernière intervention
24 juin 2011
-
Bonjour,

J'ai un graphique avec plein de séries. Je passe ne revue ces séries et récupère leur nom. Voici mon problème
Chaque série est définie par une plage de type "A1:B100" par exemple

La ligne suivante :

NomSerie = series(Index).Name

renvoie une erreur 1004 lorsque la plage référence ne comporte pas de valeurs. Pourtant quand je clique droit sur le graphique pour obtenir les données sources, la série en question est bien présente avec son nom et la plage définie pour X et Y (bien sûr on ne la voit pas puisqu'il n'y a pas de points). Où peut bien être stocké ce nom qui n'est pas accessible par la propriété SeriesCollection du graphique.

Bien sûr pour la ligne en question il y a une affectation préalable :
Set series = ThisWorkbook.Charts("Graph1").SeriesCollection

Merci de vos lumières.

Imagine le pire, tu n'es jamais déçu, il peut même t'arriver d'être heureusement surpris.
Si vous êtes intéressé par l'histoire, visitez mon site http://histoiremondiale.free.fr

9 réponses

Messages postés
1839
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
9
euh oui je n'est pas fait gaffe à ton histoire d'affectation !

pour le reste il est vrai que je n'ai jamais eu a creuser la question... mais voila cette fois c'est fait


'cette erreur 1004 est du à des cellules vides qu'excel essai d'interpreter comme des valeurs
'Pour éviter cette interpretation il existe une propriété .DisplayBlanksAs qui avec la valeur xlZero force excel 
'à interpreter les cellule vide comme des valeurs = à 0.
'L'idee ici est donc de temporairement passer .DisplayBlanksAs= xlZero
Sub ReDEmo()
    Dim MaSerie As Series
    Dim DisplayBlanksOldValue As Long

    With ActiveChart
    If Not .DisplayBlanksAs = xlZero Then
        DisplayBlanksOldValue = .DisplayBlanksAs
        .DisplayBlanksAs = xlZero
    End If
    Set MaSerie = .SeriesCollection(1)
    NomSerie = MaSerie.Name
       MsgBox NomSerie
    If Not .DisplayBlanksAs DisplayBlanksOldValue Then .DisplayBlanksAs DisplayBlanksOldValue
    End With
End Sub


A+
Messages postés
1839
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
9
Salut,

tu ne peux pas utiliser l'object series de cette façon

voici un exemple:

Sub demo()
    Dim MaSerie As Series
    
    Set MaSerie = ActiveChart.SeriesCollection(1)
    NomSerie = MaSerie.Name
    MsgBox NomSerie
End Sub


mais ATTENTION le nom renvoyé par le code precedent n'est pas le même que le nom renvoyé par:

NomSerie = ActiveChart.SeriesCollection(1).Name
MsgBox NomSerie


A+
Messages postés
1839
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
9
Re,

euh oui j'ai un peu oublié de répondre à la question

à ma connaissance si il n'y as pas de valeur dans la zone de valeurs toute tentative de récupération de valeurs ou autre par macro renvoi une erreur 1004.

je ne connais qu'une solution:

Sub demo()
    Dim MaSerie As Series
    on error resume next
    Set MaSerie = ActiveChart.SeriesCollection(1)
    NomSerie = MaSerie.Name
    If err=0 then 
       MsgBox NomSerie
    Else
       err.clear
    end if
    on error goto 0
End Sub


A+
Messages postés
43
Date d'inscription
dimanche 12 mars 2006
Statut
Membre
Dernière intervention
24 juin 2011

Message 1)Dans la suite du message je précisais bien que series était affecté globalement par set. Tu as l'air de dire qu'on ne peut pas référencé la collection de séries d'un graphique ... je suis dubitatif

Message 2) Cela ne répond pas vraiment à ma question. J'ai effectivement utilisé ce que tu indiques mais ce que je veux comprendre c'est comment le graphique connait encore le nom des séries alors que l'accès nous en est interdit (même pas en lecture). Il doit y avoir des propriétés privées de l'objet Chart là dessous.

Imagine le pire, tu n'es jamais déçu, il peut même t'arriver d'être heureusement surpris.
Si vous êtes intéressé par l'histoire, visitez mon site http://histoiremondiale.free.fr
Messages postés
1839
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
9
oups une p'tit erreur

Sub ReDEmo()
    Dim MaSerie As Series
    Dim DisplayBlanksOldValue As Long

    With ActiveChart
    DisplayBlanksOldValue = .DisplayBlanksAs
    If Not .DisplayBlanksAs xlZero Then .DisplayBlanksAs xlZero
    Set MaSerie = .SeriesCollection(1)
    NomSerie = MaSerie.Name
       MsgBox NomSerie
    If Not .DisplayBlanksAs DisplayBlanksOldValue Then .DisplayBlanksAs DisplayBlanksOldValue
    End With
End Sub


A+
Messages postés
43
Date d'inscription
dimanche 12 mars 2006
Statut
Membre
Dernière intervention
24 juin 2011

Le problème c'est que chacune des séries comportent des trous qui indiquent des points non contigus et pour lesquels il est indispensable de laisser cette propriété sur xlNotPlotted

Maintenant c'est vrai qu'il semble que ta manipulation soit juste le temps de récupérer le nom de la série. Je vais donc tester ta solution. Tu avoueras quand même qu'il est étrange que l'on ait pas accès à cette propriété (ainsi d'ailleurs qu'à XValues et Values) alors que les valeurs de ces propriétés sont conservées par le graphique.

Imagine le pire, tu n'es jamais déçu, il peut même t'arriver d'être heureusement surpris.
Si vous êtes intéressé par l'histoire, visitez mon site http://histoiremondiale.free.fr
Messages postés
43
Date d'inscription
dimanche 12 mars 2006
Statut
Membre
Dernière intervention
24 juin 2011

Pour revenir à ton code, je ferai plutôt

Sub ReDEmo()
    Dim MaSerie As Series
    Dim DisplayBlanksOldValue As Long

    With ActiveChart
    DisplayBlanksOldValue = .DisplayBlanksAs
    .DisplayBlanksAs = xlZero
    Set MaSerie = .SeriesCollection(1)
    NomSerie = MaSerie.Name
       MsgBox NomSerie
    .DisplayBlanksAs = DisplayBlanksOldValue
    End With
End Sub


Pourquoi accéder à la variable (test) pour ensuite changer sa valeur. Autant y accéder pour changer (éventuellement la valeur)

J'ai appris à programmer avec 16KO de mémoire vive donc il m'en est resté des réflexes d'économie de code.

Imagine le pire, tu n'es jamais déçu, il peut même t'arriver d'être heureusement surpris.
Si vous êtes intéressé par l'histoire, visitez mon site http://histoiremondiale.free.fr
Messages postés
1839
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
9
Ok si tu veux... d'autant que l'idée première, était de répondre à ta question

mon inconscience et ce gaspillage de mémoire vive, doit venir des 64Ko du C64 sur le quel j'ai commencé

"it makes sense"

A+
Messages postés
43
Date d'inscription
dimanche 12 mars 2006
Statut
Membre
Dernière intervention
24 juin 2011

Tout à fait. Ce n'était pas une critique mais juste un réflexe. J'ai pu tester, ton idée marche très bien. Ca reste un peu bizarre comme idée mais pas plus finalement que de référencer des séries qui ne comportent aucun point.

Merci.


Imagine le pire, tu n'es jamais déçu, il peut même t'arriver d'être heureusement surpris.
Si vous êtes intéressé par l'histoire, visitez mon site http://histoiremondiale.free.fr