VBA - Additionner les valeurs des différents points d'une série de graphique

Le
Daniel.C
Bonjour.
Le code suivant plante :

Dim Ctr As Double, Pt As Point
With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1)
ser = .Values
For i = 1 To .Points.Count
Ctr = Ctr + .Values(i)
Next i

sur la ligne Ctr = Ctr + .Values(i)
Message :
Erreur d'exécution 451
La procédure property Let n'est pas définie et la procédure Property Get n'a
pas renvoyé l'objet.
Alors que si je code :

Dim Ctr As Double, Pt As Point
With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1)
ser = .Values
For i = 1 To .Points.Count
Ctr = Ctr + ser(i)
Next i

tout se passe bien. Pourquoi le fait de passer par une variable change-t-il
les choses ?
Voir le classeur à l'adresse :
http://cjoint.com/?ksmwDLwtzF
Les macros "plante" et "plantepas"
--
Cordialement.
Daniel
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
michdenis
Le #17567481
À chaques fois, on utilise un "Tableau" (un range peut aussi
s'exprimer par tableau) lorsque l'on définit une SeriesColllection
Sauf erreur, il n'est pas possible d'ajouter un point à la fois à
une série ....

L'aide sur la proriété "Values" d'une série stripule :
Il peut s'agir d'une plage de feuille de calcul ou d'un tableau de
constantes

Ton code :
Ctr = Ctr + .Values(i)
Ceci essaie de définir les éléments d'une colllection "Values" mais
il n'y a pas d'objet (propriété) "Value" définit pour une série de données.
Comme dans Worksheets -> worksheet , Workbooks -> Workbook
En conséquence, c'est ce que ton message d'erreur tente de te faire
comprendre....La procédure property Let et Property Get de "Value"
n'a pas été définie dans la classe de cet objet.

Cependant, si tu passe par un tableau intermédiaire comme
dans ton code ser = .Values , tu obtiendras dans ton tableau
toute la collection de la série. De ce tableau, tu pourras en
entraire chacun des points.





"Daniel.C"
Bonjour.
Le code suivant plante :

Dim Ctr As Double, Pt As Point
With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1)
ser = .Values
For i = 1 To .Points.Count
Ctr = Ctr + .Values(i)
Next i

sur la ligne Ctr = Ctr + .Values(i)
Message :
Erreur d'exécution 451
La procédure property Let n'est pas définie et la procédure Property Get n'a
pas renvoyé l'objet.
Alors que si je code :

Dim Ctr As Double, Pt As Point
With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1)
ser = .Values
For i = 1 To .Points.Count
Ctr = Ctr + ser(i)
Next i

tout se passe bien. Pourquoi le fait de passer par une variable change-t-il
les choses ?
Voir le classeur à l'adresse :
http://cjoint.com/?ksmwDLwtzF
Les macros "plante" et "plantepas"
--
Cordialement.
Daniel
Daniel.C
Le #17568281
"michdenis"


À chaques fois, on utilise un "Tableau" (un range peut aussi
s'exprimer par tableau) lorsque l'on définit une SeriesColllection
Sauf erreur, il n'est pas possible d'ajouter un point à la fois à
une série ....

L'aide sur la proriété "Values" d'une série stripule :
Il peut s'agir d'une plage de feuille de calcul ou d'un tableau de
constantes

Ton code :
Ctr = Ctr + .Values(i)
Ceci essaie de définir les éléments d'une colllection "Values" mais
il n'y a pas d'objet (propriété) "Value" définit pour une série de
données.
Comme dans Worksheets -> worksheet , Workbooks -> Workbook
En conséquence, c'est ce que ton message d'erreur tente de te faire
comprendre....La procédure property Let et Property Get de "Value"
n'a pas été définie dans la classe de cet objet.

Cependant, si tu passe par un tableau intermédiaire comme
dans ton code ser = .Values , tu obtiendras dans ton tableau
toute la collection de la série. De ce tableau, tu pourras en
entraire chacun des points.



Je suis ton raisonnement qui est cohérent (sans flatterie ;-)) ) mais
bien subtil.
Merci d'y avoir consacré une partie de ton temps.
Cordialement.
Daniel
michdenis
Le #17569181
| mais bien subtil.

Suppose que tu crées un module de classe et que dans
le haut de ce dernier, tu définisses "Toto" comme Public.

si tu étais dans un module standard, Toto serait une
variable mais dans un module de classe, Toto est une
propriété. Pour affectée une valeur à cette propriété, on
utilise "Property let" et pour extraire la valeur de cette
propriété "Toto", il y a "Property get".

En VBA, les collections d'objet ont tous une propriété "Item"
qui permet d'accéder à un membre de la colllection comme
dans le cas de "SeriesCollection" qui permet l'accès à un
de ses membres. La souplesse de la syntaxe du code VBA
permet d'utiliser SeriesCollection(1) au lieu de SeriesCollection.item(1).

De plus, normalement, les collections d'objets en vba sont représentées
par des mots au pluriel : Worksheets, Workbooks ...

Mais dans le cas de "Values", ce n'est pas un "objet" mais une propriété
de l'objet "SeriesCollection" qui permet de défnir une
"série (collection) de points" à l'aide soit d'un tableau ou d'une plage
de cellules. Cette propriété "Values" n'a pas d'équivalent "item" de
défini dans le code de la classe objet.

Conséquence : L'usager n'a pas le choix, il doit définir la propriété
"values" par un tableau (range) et pour en extraire la collection, il
doit utiliser un tableau intermédiaire car "values" renvoie un tableau
(la collection de points).






"Daniel.C" %
"michdenis"


À chaques fois, on utilise un "Tableau" (un range peut aussi
s'exprimer par tableau) lorsque l'on définit une SeriesColllection
Sauf erreur, il n'est pas possible d'ajouter un point à la fois à
une série ....

L'aide sur la proriété "Values" d'une série stripule :
Il peut s'agir d'une plage de feuille de calcul ou d'un tableau de
constantes

Ton code :
Ctr = Ctr + .Values(i)
Ceci essaie de définir les éléments d'une colllection "Values" mais
il n'y a pas d'objet (propriété) "Value" définit pour une série de
données.
Comme dans Worksheets -> worksheet , Workbooks -> Workbook
En conséquence, c'est ce que ton message d'erreur tente de te faire
comprendre....La procédure property Let et Property Get de "Value"
n'a pas été définie dans la classe de cet objet.

Cependant, si tu passe par un tableau intermédiaire comme
dans ton code ser = .Values , tu obtiendras dans ton tableau
toute la collection de la série. De ce tableau, tu pourras en
entraire chacun des points.



Je suis ton raisonnement qui est cohérent (sans flatterie ;-)) ) mais
bien subtil.
Merci d'y avoir consacré une partie de ton temps.
Cordialement.
Daniel
Daniel.C
Le #17569331
Oui, merci, Denis, je comprends - à peu près - ce que tu dis... Et pourtant
:
nb = UBound(.Values)
Somme = Application.Sum(.Values)
ne renvoient pas d'erreur et semble indiquer que l'on peut faire certaines
opérations, mais il est vrai, qu'on ne peut y travailler sur item.
Daniel
"michdenis" %
| mais bien subtil.

Suppose que tu crées un module de classe et que dans
le haut de ce dernier, tu définisses "Toto" comme Public.

si tu étais dans un module standard, Toto serait une
variable mais dans un module de classe, Toto est une
propriété. Pour affectée une valeur à cette propriété, on
utilise "Property let" et pour extraire la valeur de cette
propriété "Toto", il y a "Property get".

En VBA, les collections d'objet ont tous une propriété "Item"
qui permet d'accéder à un membre de la colllection comme
dans le cas de "SeriesCollection" qui permet l'accès à un
de ses membres. La souplesse de la syntaxe du code VBA
permet d'utiliser SeriesCollection(1) au lieu de
SeriesCollection.item(1).

De plus, normalement, les collections d'objets en vba sont représentées
par des mots au pluriel : Worksheets, Workbooks ...

Mais dans le cas de "Values", ce n'est pas un "objet" mais une propriété
de l'objet "SeriesCollection" qui permet de défnir une
"série (collection) de points" à l'aide soit d'un tableau ou d'une plage
de cellules. Cette propriété "Values" n'a pas d'équivalent "item" de
défini dans le code de la classe objet.

Conséquence : L'usager n'a pas le choix, il doit définir la propriété
"values" par un tableau (range) et pour en extraire la collection, il
doit utiliser un tableau intermédiaire car "values" renvoie un tableau
(la collection de points).






"Daniel.C" %
"michdenis"


À chaques fois, on utilise un "Tableau" (un range peut aussi
s'exprimer par tableau) lorsque l'on définit une SeriesColllection
Sauf erreur, il n'est pas possible d'ajouter un point à la fois à
une série ....

L'aide sur la proriété "Values" d'une série stripule :
Il peut s'agir d'une plage de feuille de calcul ou d'un tableau de
constantes

Ton code :
Ctr = Ctr + .Values(i)
Ceci essaie de définir les éléments d'une colllection "Values" mais
il n'y a pas d'objet (propriété) "Value" définit pour une série de
données.
Comme dans Worksheets -> worksheet , Workbooks -> Workbook
En conséquence, c'est ce que ton message d'erreur tente de te faire
comprendre....La procédure property Let et Property Get de "Value"
n'a pas été définie dans la classe de cet objet.

Cependant, si tu passe par un tableau intermédiaire comme
dans ton code ser = .Values , tu obtiendras dans ton tableau
toute la collection de la série. De ce tableau, tu pourras en
entraire chacun des points.



Je suis ton raisonnement qui est cohérent (sans flatterie ;-)) ) mais
bien subtil.
Merci d'y avoir consacré une partie de ton temps.
Cordialement.
Daniel




michdenis
Le #17570481
| nb = UBound(.Values)
| Somme = Application.Sum(.Values)


à n'en pas douter, "Values" se comporte
sensiblement comme une variable "Tableau(array)"

Mais on ne peut ajouter une valeur à une série comme
.Values(5) = 25
De même, on ne peut pas y extraire un élément du tableau
x = .Values(5)




"Daniel.C" evF%
Oui, merci, Denis, je comprends - à peu près - ce que tu dis... Et pourtant
:
nb = UBound(.Values)
Somme = Application.Sum(.Values)
ne renvoient pas d'erreur et semble indiquer que l'on peut faire certaines
opérations, mais il est vrai, qu'on ne peut y travailler sur item.
Daniel
"michdenis" %
| mais bien subtil.

Suppose que tu crées un module de classe et que dans
le haut de ce dernier, tu définisses "Toto" comme Public.

si tu étais dans un module standard, Toto serait une
variable mais dans un module de classe, Toto est une
propriété. Pour affectée une valeur à cette propriété, on
utilise "Property let" et pour extraire la valeur de cette
propriété "Toto", il y a "Property get".

En VBA, les collections d'objet ont tous une propriété "Item"
qui permet d'accéder à un membre de la colllection comme
dans le cas de "SeriesCollection" qui permet l'accès à un
de ses membres. La souplesse de la syntaxe du code VBA
permet d'utiliser SeriesCollection(1) au lieu de
SeriesCollection.item(1).

De plus, normalement, les collections d'objets en vba sont représentées
par des mots au pluriel : Worksheets, Workbooks ...

Mais dans le cas de "Values", ce n'est pas un "objet" mais une propriété
de l'objet "SeriesCollection" qui permet de défnir une
"série (collection) de points" à l'aide soit d'un tableau ou d'une plage
de cellules. Cette propriété "Values" n'a pas d'équivalent "item" de
défini dans le code de la classe objet.

Conséquence : L'usager n'a pas le choix, il doit définir la propriété
"values" par un tableau (range) et pour en extraire la collection, il
doit utiliser un tableau intermédiaire car "values" renvoie un tableau
(la collection de points).






"Daniel.C" %
"michdenis"


À chaques fois, on utilise un "Tableau" (un range peut aussi
s'exprimer par tableau) lorsque l'on définit une SeriesColllection
Sauf erreur, il n'est pas possible d'ajouter un point à la fois à
une série ....

L'aide sur la proriété "Values" d'une série stripule :
Il peut s'agir d'une plage de feuille de calcul ou d'un tableau de
constantes

Ton code :
Ctr = Ctr + .Values(i)
Ceci essaie de définir les éléments d'une colllection "Values" mais
il n'y a pas d'objet (propriété) "Value" définit pour une série de
données.
Comme dans Worksheets -> worksheet , Workbooks -> Workbook
En conséquence, c'est ce que ton message d'erreur tente de te faire
comprendre....La procédure property Let et Property Get de "Value"
n'a pas été définie dans la classe de cet objet.

Cependant, si tu passe par un tableau intermédiaire comme
dans ton code ser = .Values , tu obtiendras dans ton tableau
toute la collection de la série. De ce tableau, tu pourras en
entraire chacun des points.



Je suis ton raisonnement qui est cohérent (sans flatterie ;-)) ) mais
bien subtil.
Merci d'y avoir consacré une partie de ton temps.
Cordialement.
Daniel




Publicité
Poster une réponse
Anonyme