Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

5 réponses
Avatar
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

5 réponses

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





"Daniel.C" a écrit dans le message de news:

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
Avatar
Daniel.C
"michdenis" a écrit dans le message de news:



À 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
Avatar
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" a écrit dans le message de news:
%
"michdenis" a écrit dans le message de news:



À 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
Avatar
Daniel.C
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" a écrit dans le message de news:
%
| 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" a écrit dans le message de news:
%
"michdenis" a écrit dans le message de news:



À 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




Avatar
michdenis
| 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" a écrit dans le message de news:
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" a écrit dans le message de news:
%
| 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" a écrit dans le message de news:
%
"michdenis" a écrit dans le message de news:



À 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