OVH Cloud OVH Cloud

Tracer rapidement un graphique

8 réponses
Avatar
Emcy
Bonjours,

Je repose ma question vu que personne ne m'a répondu : peut-être
qu'aujourd'hui quelqu'un aura la réponse...

Je voudrais tracer des fonctions : pour cela je fait mes calculs en Vba ( je
mes mes resultats dans des tableaux SignalE(), SignalS() et x() ). J'utilise
un graphique en nuage de points.
Le problème est que pour tacer mes courbes, il faut que je mets mes tableaux
dans des cellules Excel : celà fait une perte de temps énorme => il faudrait
que je mette directement mes valeur dans mon graphique (je veux pouvoir agir
sur différents termes de mes fonctions et voir en temps réel les
changements).

J'ai déja essayé la méthode de serge Garneau : elle n'est pas
valide car mes formules sont trop longues (dans une cellule
Excel, il y a un nombre de caractères limités).

Quelqu'un a-t-il une autre solution ?

voici les fonctions que je trace (un signal carré + un autre):
Rappel : un signal carré est une somme infinie de sigaux sinusoidaux du type
a.sin(w.t+phi)

Option Explicit
Option Base 1 ' Attribue la valeur 1 aux indices de tableau par défaut


Sub SignalCarré()

Dim j, k As Integer

Dim FeuilleTravail As Object
Set FeuilleTravail = ActiveWorkbook.Sheets("Carré")

Dim Ea As Double 'Amplitude du signal d'entrée
Ea = FeuilleTravail.Range("B1").Value 'valeur par defaut = 2
Dim Eo As Double 'Offset du signal d'entrée
Eo = FeuilleTravail.Range("B2").Value 'valeur par defaut = 0

Dim f As Double 'Fréquence du signal s'entrée
f = FeuilleTravail.Range("B3").Value 'valeur par defaut = 1000000
Dim Er As Double 'rapport cyclique du signal d'entrée
Er = FeuilleTravail.Range("B4").Value 'non utilisé
Dim R As Double 'résistance du filtre
R = FeuilleTravail.Range("B20").Value 'valeur par defaut = 1000
Dim C As Double 'capacité du filtre
C = FeuilleTravail.Range("B21").Value 'valeur par defaut = 0.0000000001

Dim i As Integer 'nombre de porteuses
i = FeuilleTravail.Range("B5").Value 'valeur par defaut = 20

Dim pX As Double 'borne inférieur sur axe des x
pX = FeuilleTravail.Range("B15").Value 'valeur par defaut = -0.0000011
Dim gX As Double 'borne supérieur sur axe des x
gX = FeuilleTravail.Range("B16").Value 'valeur par defaut = +0.0000011
Dim nX As Integer 'Nombre de points sur axe des x
nX = FeuilleTravail.Range("B17").Value 'valeur par defaut = 500
Dim pasX As Double 'interval entre chaque points sur l'axe des x
pasX = (gX - pX) / (nX - 1)

Dim x() As Double 'Tableau des valeurs de x
ReDim x(nX)
For j = 1 To (nX)
x(j) = Format(pX + (pasX) * (j - 1), "0.000E+0")
Next j

Dim a As Double ' = 2*Ea/PI
a = 2 * Ea / 3.14
Dim w As Double ' = 2*PI*f
w = 2 * 3.14 * f
Dim wRC As Double
wRC = w * R * C

Dim b() As Integer 'b(i) = ((i-1)*2+1)
ReDim b(i)
For j = 1 To i
b(j) = ((j - 1) * 2 + 1)
Next j

Dim SignalE() As Double 'calcul signal carré - somme des a / b(i) * sin(w *
b(i) * t)
Dim SignalS() As Double 'calcul signal de sortie filtre RC : T = 1 /
racine(1+(w.RC)^2)
Dim SignalTemp, Phi As Double
ReDim SignalE(nX)
ReDim SignalS(nX)
For k = 1 To nX
For j = 1 To i
SignalE(k) = SignalE(k) + a / b(j) * Sin(w * b(j) * x(k))
SignalS(k) = SignalS(k) + a / b(j) * Sin(w * b(j) * x(k) -
Atn(wRC * b(j))) / Sqr(1 + (wRC * b(j)) ^ 2)
Next j
SignalE(k) = Format(SignalE(k) + Eo, "0.000E+0") 'ajout de la valeur
continue + changement du format pour meilleur lisibilité
SignalS(k) = Format(SignalS(k) + Eo, "0.000E+0")
Next k

For j = 1 To nX
ActiveWorkbook.Sheets("Valeur").Cells(j, 1).Value = x(j)
ActiveWorkbook.Sheets("Valeur").Cells(j, 2).Value = SignalE(j)
ActiveWorkbook.Sheets("Valeur").Cells(j, 3).Value = SignalS(j)
Next j

End Sub

8 réponses

Avatar
twinley
Bonjour,

Je n'ai pas la réponse pour l'aspect graphique.
Peux-tu contourner la longueur de tes formules par un calcul direct en VBA
et inscrire seulement le résultat dans les cells ?

par ex :

Range("AF11").FormulaLocal = "=SUM(RC[-" & z & "]:RC[-1])"

avec la conversion en anglais des fonctions ... ainsi tu n'as pas de limite
de saisie.
--
à+twinley
"Emcy" a écrit dans le message de
news:%
Bonjours,

Je repose ma question vu que personne ne m'a répondu : peut-être
qu'aujourd'hui quelqu'un aura la réponse...

Je voudrais tracer des fonctions : pour cela je fait mes calculs en Vba
( je

mes mes resultats dans des tableaux SignalE(), SignalS() et x() ).
J'utilise

un graphique en nuage de points.
Le problème est que pour tacer mes courbes, il faut que je mets mes
tableaux

dans des cellules Excel : celà fait une perte de temps énorme => il
faudrait

que je mette directement mes valeur dans mon graphique (je veux pouvoir
agir

sur différents termes de mes fonctions et voir en temps réel les
changements).

J'ai déja essayé la méthode de serge Garneau : elle n'est pas
valide car mes formules sont trop longues (dans une cellule
Excel, il y a un nombre de caractères limités).

Quelqu'un a-t-il une autre solution ?

voici les fonctions que je trace (un signal carré + un autre):
Rappel : un signal carré est une somme infinie de sigaux sinusoidaux du
type

a.sin(w.t+phi)

Option Explicit
Option Base 1 ' Attribue la valeur 1 aux indices de tableau par défaut


Sub SignalCarré()

Dim j, k As Integer

Dim FeuilleTravail As Object
Set FeuilleTravail = ActiveWorkbook.Sheets("Carré")

Dim Ea As Double 'Amplitude du signal d'entrée
Ea = FeuilleTravail.Range("B1").Value 'valeur par defaut = 2
Dim Eo As Double 'Offset du signal d'entrée
Eo = FeuilleTravail.Range("B2").Value 'valeur par defaut = 0

Dim f As Double 'Fréquence du signal s'entrée
f = FeuilleTravail.Range("B3").Value 'valeur par defaut = 1000000
Dim Er As Double 'rapport cyclique du signal d'entrée
Er = FeuilleTravail.Range("B4").Value 'non utilisé
Dim R As Double 'résistance du filtre
R = FeuilleTravail.Range("B20").Value 'valeur par defaut = 1000
Dim C As Double 'capacité du filtre
C = FeuilleTravail.Range("B21").Value 'valeur par defaut 0.0000000001

Dim i As Integer 'nombre de porteuses
i = FeuilleTravail.Range("B5").Value 'valeur par defaut = 20

Dim pX As Double 'borne inférieur sur axe des x
pX = FeuilleTravail.Range("B15").Value 'valeur par defaut
= -0.0000011

Dim gX As Double 'borne supérieur sur axe des x
gX = FeuilleTravail.Range("B16").Value 'valeur par defaut +0.0000011
Dim nX As Integer 'Nombre de points sur axe des x
nX = FeuilleTravail.Range("B17").Value 'valeur par defaut = 500
Dim pasX As Double 'interval entre chaque points sur l'axe des x
pasX = (gX - pX) / (nX - 1)

Dim x() As Double 'Tableau des valeurs de x
ReDim x(nX)
For j = 1 To (nX)
x(j) = Format(pX + (pasX) * (j - 1), "0.000E+0")
Next j

Dim a As Double ' = 2*Ea/PI
a = 2 * Ea / 3.14
Dim w As Double ' = 2*PI*f
w = 2 * 3.14 * f
Dim wRC As Double
wRC = w * R * C

Dim b() As Integer 'b(i) = ((i-1)*2+1)
ReDim b(i)
For j = 1 To i
b(j) = ((j - 1) * 2 + 1)
Next j

Dim SignalE() As Double 'calcul signal carré - somme des a / b(i) * sin(w
*

b(i) * t)
Dim SignalS() As Double 'calcul signal de sortie filtre RC : T = 1 /
racine(1+(w.RC)^2)
Dim SignalTemp, Phi As Double
ReDim SignalE(nX)
ReDim SignalS(nX)
For k = 1 To nX
For j = 1 To i
SignalE(k) = SignalE(k) + a / b(j) * Sin(w * b(j) * x(k))
SignalS(k) = SignalS(k) + a / b(j) * Sin(w * b(j) * x(k) -
Atn(wRC * b(j))) / Sqr(1 + (wRC * b(j)) ^ 2)
Next j
SignalE(k) = Format(SignalE(k) + Eo, "0.000E+0") 'ajout de la
valeur

continue + changement du format pour meilleur lisibilité
SignalS(k) = Format(SignalS(k) + Eo, "0.000E+0")
Next k

For j = 1 To nX
ActiveWorkbook.Sheets("Valeur").Cells(j, 1).Value = x(j)
ActiveWorkbook.Sheets("Valeur").Cells(j, 2).Value = SignalE(j)
ActiveWorkbook.Sheets("Valeur").Cells(j, 3).Value = SignalS(j)
Next j

End Sub




Avatar
Denis
Bonjour,

ton graphique existant déjà (avec tes 2 courbes) et étant
sélectionné

ActiveChart.SeriesCollection(1).XValues = x
ActiveChart.SeriesCollection(2).XValues = x
ActiveChart.SeriesCollection(1).Values = SignalE
ActiveChart.SeriesCollection(2).Values = SignalS

Et c'est tracé
Denis

-----Message d'origine-----
Bonjours,

Je repose ma question vu que personne ne m'a répondu :
peut-être

qu'aujourd'hui quelqu'un aura la réponse...

Je voudrais tracer des fonctions : pour cela je fait mes
calculs en Vba ( je

mes mes resultats dans des tableaux SignalE(), SignalS()
et x() ). J'utilise

un graphique en nuage de points.
Le problème est que pour tacer mes courbes, il faut que
je mets mes tableaux

dans des cellules Excel : celà fait une perte de temps
énorme => il faudrait

que je mette directement mes valeur dans mon graphique
(je veux pouvoir agir

sur différents termes de mes fonctions et voir en temps
réel les

changements).

J'ai déja essayé la méthode de serge Garneau : elle n'est
pas

valide car mes formules sont trop longues (dans une
cellule

Excel, il y a un nombre de caractères limités).

Quelqu'un a-t-il une autre solution ?

voici les fonctions que je trace (un signal carré + un
autre):

Rappel : un signal carré est une somme infinie de sigaux
sinusoidaux du type

a.sin(w.t+phi)

Option Explicit
Option Base 1 ' Attribue la valeur 1 aux indices de
tableau par défaut



Sub SignalCarré()

Dim j, k As Integer

Dim FeuilleTravail As Object
Set FeuilleTravail = ActiveWorkbook.Sheets("Carré")

Dim Ea As Double 'Amplitude du signal d'entrée
Ea = FeuilleTravail.Range("B1").Value 'valeur par
defaut = 2

Dim Eo As Double 'Offset du signal d'entrée
Eo = FeuilleTravail.Range("B2").Value 'valeur par
defaut = 0


Dim f As Double 'Fréquence du signal s'entrée
f = FeuilleTravail.Range("B3").Value 'valeur par
defaut = 1000000

Dim Er As Double 'rapport cyclique du signal d'entrée
Er = FeuilleTravail.Range("B4").Value 'non utilisé
Dim R As Double 'résistance du filtre
R = FeuilleTravail.Range("B20").Value 'valeur par
defaut = 1000

Dim C As Double 'capacité du filtre
C = FeuilleTravail.Range("B21").Value 'valeur par
defaut = 0.0000000001


Dim i As Integer 'nombre de porteuses
i = FeuilleTravail.Range("B5").Value 'valeur par
defaut = 20


Dim pX As Double 'borne inférieur sur axe des x
pX = FeuilleTravail.Range("B15").Value 'valeur par
defaut = -0.0000011

Dim gX As Double 'borne supérieur sur axe des x
gX = FeuilleTravail.Range("B16").Value 'valeur par
defaut = +0.0000011

Dim nX As Integer 'Nombre de points sur axe des x
nX = FeuilleTravail.Range("B17").Value 'valeur par
defaut = 500

Dim pasX As Double 'interval entre chaque points sur
l'axe des x

pasX = (gX - pX) / (nX - 1)

Dim x() As Double 'Tableau des valeurs de x
ReDim x(nX)
For j = 1 To (nX)
x(j) = Format(pX + (pasX) * (j - 1), "0.000E+0")
Next j

Dim a As Double ' = 2*Ea/PI
a = 2 * Ea / 3.14
Dim w As Double ' = 2*PI*f
w = 2 * 3.14 * f
Dim wRC As Double
wRC = w * R * C

Dim b() As Integer 'b(i) = ((i-1)*2+1)
ReDim b(i)
For j = 1 To i
b(j) = ((j - 1) * 2 + 1)
Next j

Dim SignalE() As Double 'calcul signal carré - somme des
a / b(i) * sin(w *

b(i) * t)
Dim SignalS() As Double 'calcul signal de sortie filtre
RC : T = 1 /

racine(1+(w.RC)^2)
Dim SignalTemp, Phi As Double
ReDim SignalE(nX)
ReDim SignalS(nX)
For k = 1 To nX
For j = 1 To i
SignalE(k) = SignalE(k) + a / b(j) * Sin(w * b
(j) * x(k))

SignalS(k) = SignalS(k) + a / b(j) * Sin(w * b
(j) * x(k) -

Atn(wRC * b(j))) / Sqr(1 + (wRC * b(j)) ^ 2)
Next j
SignalE(k) = Format(SignalE(k) +
Eo, "0.000E+0") 'ajout de la valeur

continue + changement du format pour meilleur lisibilité
SignalS(k) = Format(SignalS(k) + Eo, "0.000E+0")
Next k

For j = 1 To nX
ActiveWorkbook.Sheets("Valeur").Cells(j, 1).Value = x
(j)

ActiveWorkbook.Sheets("Valeur").Cells(j, 2).Value =
SignalE(j)

ActiveWorkbook.Sheets("Valeur").Cells(j, 3).Value =
SignalS(j)

Next j

End Sub


.



Avatar
Emcy
bonjours,

c'est justement le problème : si j'inscris mes résultats dans les cells,
c'est beaucoup trop lent (c'est ce que je fais actuellement).
Mais je ne desactive pas le recalcul automatique de formule d'excel pendant
que j'execute la macro (je sais plus comment faire) : peut-être que ça
accelererai significativement la vitesse.

"twinley" <twinleym(at)hotmail.com> a écrit dans le message de
news:
Bonjour,

Je n'ai pas la réponse pour l'aspect graphique.
Peux-tu contourner la longueur de tes formules par un calcul direct en VBA
et inscrire seulement le résultat dans les cells ?

par ex :

Range("AF11").FormulaLocal = "=SUM(RC[-" & z & "]:RC[-1])"

avec la conversion en anglais des fonctions ... ainsi tu n'as pas de
limite

de saisie.
--
à+twinley
"Emcy" a écrit dans le message de
news:%
Bonjours,

Je repose ma question vu que personne ne m'a répondu : peut-être
qu'aujourd'hui quelqu'un aura la réponse...

Je voudrais tracer des fonctions : pour cela je fait mes calculs en Vba
( je

mes mes resultats dans des tableaux SignalE(), SignalS() et x() ).
J'utilise

un graphique en nuage de points.
Le problème est que pour tacer mes courbes, il faut que je mets mes
tableaux

dans des cellules Excel : celà fait une perte de temps énorme => il
faudrait

que je mette directement mes valeur dans mon graphique (je veux pouvoir
agir

sur différents termes de mes fonctions et voir en temps réel les
changements).

J'ai déja essayé la méthode de serge Garneau : elle n'est pas
valide car mes formules sont trop longues (dans une cellule
Excel, il y a un nombre de caractères limités).

Quelqu'un a-t-il une autre solution ?

voici les fonctions que je trace (un signal carré + un autre):
Rappel : un signal carré est une somme infinie de sigaux sinusoidaux du
type

a.sin(w.t+phi)

Option Explicit
Option Base 1 ' Attribue la valeur 1 aux indices de tableau par défaut


Sub SignalCarré()

Dim j, k As Integer

Dim FeuilleTravail As Object
Set FeuilleTravail = ActiveWorkbook.Sheets("Carré")

Dim Ea As Double 'Amplitude du signal d'entrée
Ea = FeuilleTravail.Range("B1").Value 'valeur par defaut = 2
Dim Eo As Double 'Offset du signal d'entrée
Eo = FeuilleTravail.Range("B2").Value 'valeur par defaut = 0

Dim f As Double 'Fréquence du signal s'entrée
f = FeuilleTravail.Range("B3").Value 'valeur par defaut = 1000000
Dim Er As Double 'rapport cyclique du signal d'entrée
Er = FeuilleTravail.Range("B4").Value 'non utilisé
Dim R As Double 'résistance du filtre
R = FeuilleTravail.Range("B20").Value 'valeur par defaut = 1000
Dim C As Double 'capacité du filtre
C = FeuilleTravail.Range("B21").Value 'valeur par defaut > 0.0000000001

Dim i As Integer 'nombre de porteuses
i = FeuilleTravail.Range("B5").Value 'valeur par defaut = 20

Dim pX As Double 'borne inférieur sur axe des x
pX = FeuilleTravail.Range("B15").Value 'valeur par defaut
= -0.0000011

Dim gX As Double 'borne supérieur sur axe des x
gX = FeuilleTravail.Range("B16").Value 'valeur par defaut > +0.0000011
Dim nX As Integer 'Nombre de points sur axe des x
nX = FeuilleTravail.Range("B17").Value 'valeur par defaut = 500
Dim pasX As Double 'interval entre chaque points sur l'axe des x
pasX = (gX - pX) / (nX - 1)

Dim x() As Double 'Tableau des valeurs de x
ReDim x(nX)
For j = 1 To (nX)
x(j) = Format(pX + (pasX) * (j - 1), "0.000E+0")
Next j

Dim a As Double ' = 2*Ea/PI
a = 2 * Ea / 3.14
Dim w As Double ' = 2*PI*f
w = 2 * 3.14 * f
Dim wRC As Double
wRC = w * R * C

Dim b() As Integer 'b(i) = ((i-1)*2+1)
ReDim b(i)
For j = 1 To i
b(j) = ((j - 1) * 2 + 1)
Next j

Dim SignalE() As Double 'calcul signal carré - somme des a / b(i) *
sin(w


*
b(i) * t)
Dim SignalS() As Double 'calcul signal de sortie filtre RC : T = 1 /
racine(1+(w.RC)^2)
Dim SignalTemp, Phi As Double
ReDim SignalE(nX)
ReDim SignalS(nX)
For k = 1 To nX
For j = 1 To i
SignalE(k) = SignalE(k) + a / b(j) * Sin(w * b(j) * x(k))
SignalS(k) = SignalS(k) + a / b(j) * Sin(w * b(j) * x(k) -
Atn(wRC * b(j))) / Sqr(1 + (wRC * b(j)) ^ 2)
Next j
SignalE(k) = Format(SignalE(k) + Eo, "0.000E+0") 'ajout de la
valeur

continue + changement du format pour meilleur lisibilité
SignalS(k) = Format(SignalS(k) + Eo, "0.000E+0")
Next k

For j = 1 To nX
ActiveWorkbook.Sheets("Valeur").Cells(j, 1).Value = x(j)
ActiveWorkbook.Sheets("Valeur").Cells(j, 2).Value = SignalE(j)
ActiveWorkbook.Sheets("Valeur").Cells(j, 3).Value = SignalS(j)
Next j

End Sub








Avatar
Emcy
bonjours,

j'ai déja essayé mais ça me fait une erreur d'execution : "impossible de
définir la propriété XValue"
=> il est impossible d'affecter directement un tableau dans cette propriété
: il faut mettre un array => je ne sais pas convertir un tableau standard en
array.

"Denis" a écrit dans le message de
news:063a01c4a799$42bc5450$
Bonjour,

ton graphique existant déjà (avec tes 2 courbes) et étant
sélectionné

ActiveChart.SeriesCollection(1).XValues = x
ActiveChart.SeriesCollection(2).XValues = x
ActiveChart.SeriesCollection(1).Values = SignalE
ActiveChart.SeriesCollection(2).Values = SignalS

Et c'est tracé
Denis

-----Message d'origine-----
Bonjours,

Je repose ma question vu que personne ne m'a répondu :
peut-être

qu'aujourd'hui quelqu'un aura la réponse...

Je voudrais tracer des fonctions : pour cela je fait mes
calculs en Vba ( je

mes mes resultats dans des tableaux SignalE(), SignalS()
et x() ). J'utilise

un graphique en nuage de points.
Le problème est que pour tacer mes courbes, il faut que
je mets mes tableaux

dans des cellules Excel : celà fait une perte de temps
énorme => il faudrait

que je mette directement mes valeur dans mon graphique
(je veux pouvoir agir

sur différents termes de mes fonctions et voir en temps
réel les

changements).

J'ai déja essayé la méthode de serge Garneau : elle n'est
pas

valide car mes formules sont trop longues (dans une
cellule

Excel, il y a un nombre de caractères limités).

Quelqu'un a-t-il une autre solution ?

voici les fonctions que je trace (un signal carré + un
autre):

Rappel : un signal carré est une somme infinie de sigaux
sinusoidaux du type

a.sin(w.t+phi)

Option Explicit
Option Base 1 ' Attribue la valeur 1 aux indices de
tableau par défaut



Sub SignalCarré()

Dim j, k As Integer

Dim FeuilleTravail As Object
Set FeuilleTravail = ActiveWorkbook.Sheets("Carré")

Dim Ea As Double 'Amplitude du signal d'entrée
Ea = FeuilleTravail.Range("B1").Value 'valeur par
defaut = 2

Dim Eo As Double 'Offset du signal d'entrée
Eo = FeuilleTravail.Range("B2").Value 'valeur par
defaut = 0


Dim f As Double 'Fréquence du signal s'entrée
f = FeuilleTravail.Range("B3").Value 'valeur par
defaut = 1000000

Dim Er As Double 'rapport cyclique du signal d'entrée
Er = FeuilleTravail.Range("B4").Value 'non utilisé
Dim R As Double 'résistance du filtre
R = FeuilleTravail.Range("B20").Value 'valeur par
defaut = 1000

Dim C As Double 'capacité du filtre
C = FeuilleTravail.Range("B21").Value 'valeur par
defaut = 0.0000000001


Dim i As Integer 'nombre de porteuses
i = FeuilleTravail.Range("B5").Value 'valeur par
defaut = 20


Dim pX As Double 'borne inférieur sur axe des x
pX = FeuilleTravail.Range("B15").Value 'valeur par
defaut = -0.0000011

Dim gX As Double 'borne supérieur sur axe des x
gX = FeuilleTravail.Range("B16").Value 'valeur par
defaut = +0.0000011

Dim nX As Integer 'Nombre de points sur axe des x
nX = FeuilleTravail.Range("B17").Value 'valeur par
defaut = 500

Dim pasX As Double 'interval entre chaque points sur
l'axe des x

pasX = (gX - pX) / (nX - 1)

Dim x() As Double 'Tableau des valeurs de x
ReDim x(nX)
For j = 1 To (nX)
x(j) = Format(pX + (pasX) * (j - 1), "0.000E+0")
Next j

Dim a As Double ' = 2*Ea/PI
a = 2 * Ea / 3.14
Dim w As Double ' = 2*PI*f
w = 2 * 3.14 * f
Dim wRC As Double
wRC = w * R * C

Dim b() As Integer 'b(i) = ((i-1)*2+1)
ReDim b(i)
For j = 1 To i
b(j) = ((j - 1) * 2 + 1)
Next j

Dim SignalE() As Double 'calcul signal carré - somme des
a / b(i) * sin(w *

b(i) * t)
Dim SignalS() As Double 'calcul signal de sortie filtre
RC : T = 1 /

racine(1+(w.RC)^2)
Dim SignalTemp, Phi As Double
ReDim SignalE(nX)
ReDim SignalS(nX)
For k = 1 To nX
For j = 1 To i
SignalE(k) = SignalE(k) + a / b(j) * Sin(w * b
(j) * x(k))

SignalS(k) = SignalS(k) + a / b(j) * Sin(w * b
(j) * x(k) -

Atn(wRC * b(j))) / Sqr(1 + (wRC * b(j)) ^ 2)
Next j
SignalE(k) = Format(SignalE(k) +
Eo, "0.000E+0") 'ajout de la valeur

continue + changement du format pour meilleur lisibilité
SignalS(k) = Format(SignalS(k) + Eo, "0.000E+0")
Next k

For j = 1 To nX
ActiveWorkbook.Sheets("Valeur").Cells(j, 1).Value = x
(j)

ActiveWorkbook.Sheets("Valeur").Cells(j, 2).Value SignalE(j)
ActiveWorkbook.Sheets("Valeur").Cells(j, 3).Value SignalS(j)
Next j

End Sub


.



Avatar
Misange
Bonjour,
pour convertir un tableau en standard en array, ou pour construire
directement ton array avec les valeurs x et y par VBA, regarde le
fichier exemple sur ce thème sur la pages "outres outils "d'excelabo.
Je rejoins tout à la fait l'idée de twinley : si une formule ne peut pas
le faire parce qu'elle contient trop de caractères, soit tu sciendes ta
formule en plusiseurs bouts, soit tu passes par VBA.
Tu lis par VBA la première valeur de X, tu applisques une fonction
écrite en VBA et non pas une formule et tu rentres les deux valeurs
correspondantes de x et y pour construire ton graphique, en adaptant la
soluce sans tableau de Serge.
bon courage

Misange migrateuse http://www.excelabo.net
mail : http://cerbermail.com/?k5Q8Dh2mta


on 01/10/2004 13:24:
bonjours,

j'ai déja essayé mais ça me fait une erreur d'execution : "impossible de
définir la propriété XValue"
=> il est impossible d'affecter directement un tableau dans cette propriété
: il faut mettre un array => je ne sais pas convertir un tableau standard en
array.

"Denis" a écrit dans le message de
news:063a01c4a799$42bc5450$
Bonjour,

ton graphique existant déjà (avec tes 2 courbes) et étant
sélectionné

ActiveChart.SeriesCollection(1).XValues = x
ActiveChart.SeriesCollection(2).XValues = x
ActiveChart.SeriesCollection(1).Values = SignalE
ActiveChart.SeriesCollection(2).Values = SignalS

Et c'est tracé
Denis


-----Message d'origine-----
Bonjours,

Je repose ma question vu que personne ne m'a répondu :


peut-être

qu'aujourd'hui quelqu'un aura la réponse...

Je voudrais tracer des fonctions : pour cela je fait mes


calculs en Vba ( je

mes mes resultats dans des tableaux SignalE(), SignalS()


et x() ). J'utilise

un graphique en nuage de points.
Le problème est que pour tacer mes courbes, il faut que


je mets mes tableaux

dans des cellules Excel : celà fait une perte de temps


énorme => il faudrait

que je mette directement mes valeur dans mon graphique


(je veux pouvoir agir

sur différents termes de mes fonctions et voir en temps


réel les

changements).

J'ai déja essayé la méthode de serge Garneau : elle n'est


pas

valide car mes formules sont trop longues (dans une


cellule

Excel, il y a un nombre de caractères limités).

Quelqu'un a-t-il une autre solution ?

voici les fonctions que je trace (un signal carré + un


autre):

Rappel : un signal carré est une somme infinie de sigaux


sinusoidaux du type

a.sin(w.t+phi)

Option Explicit
Option Base 1 ' Attribue la valeur 1 aux indices de


tableau par défaut


Sub SignalCarré()

Dim j, k As Integer

Dim FeuilleTravail As Object
Set FeuilleTravail = ActiveWorkbook.Sheets("Carré")

Dim Ea As Double 'Amplitude du signal d'entrée
Ea = FeuilleTravail.Range("B1").Value 'valeur par


defaut = 2

Dim Eo As Double 'Offset du signal d'entrée
Eo = FeuilleTravail.Range("B2").Value 'valeur par


defaut = 0

Dim f As Double 'Fréquence du signal s'entrée
f = FeuilleTravail.Range("B3").Value 'valeur par


defaut = 1000000

Dim Er As Double 'rapport cyclique du signal d'entrée
Er = FeuilleTravail.Range("B4").Value 'non utilisé
Dim R As Double 'résistance du filtre
R = FeuilleTravail.Range("B20").Value 'valeur par


defaut = 1000

Dim C As Double 'capacité du filtre
C = FeuilleTravail.Range("B21").Value 'valeur par


defaut = 0.0000000001

Dim i As Integer 'nombre de porteuses
i = FeuilleTravail.Range("B5").Value 'valeur par


defaut = 20

Dim pX As Double 'borne inférieur sur axe des x
pX = FeuilleTravail.Range("B15").Value 'valeur par


defaut = -0.0000011

Dim gX As Double 'borne supérieur sur axe des x
gX = FeuilleTravail.Range("B16").Value 'valeur par


defaut = +0.0000011

Dim nX As Integer 'Nombre de points sur axe des x
nX = FeuilleTravail.Range("B17").Value 'valeur par


defaut = 500

Dim pasX As Double 'interval entre chaque points sur


l'axe des x

pasX = (gX - pX) / (nX - 1)

Dim x() As Double 'Tableau des valeurs de x
ReDim x(nX)
For j = 1 To (nX)
x(j) = Format(pX + (pasX) * (j - 1), "0.000E+0")
Next j

Dim a As Double ' = 2*Ea/PI
a = 2 * Ea / 3.14
Dim w As Double ' = 2*PI*f
w = 2 * 3.14 * f
Dim wRC As Double
wRC = w * R * C

Dim b() As Integer 'b(i) = ((i-1)*2+1)
ReDim b(i)
For j = 1 To i
b(j) = ((j - 1) * 2 + 1)
Next j

Dim SignalE() As Double 'calcul signal carré - somme des


a / b(i) * sin(w *

b(i) * t)
Dim SignalS() As Double 'calcul signal de sortie filtre


RC : T = 1 /

racine(1+(w.RC)^2)
Dim SignalTemp, Phi As Double
ReDim SignalE(nX)
ReDim SignalS(nX)
For k = 1 To nX
For j = 1 To i
SignalE(k) = SignalE(k) + a / b(j) * Sin(w * b


(j) * x(k))

SignalS(k) = SignalS(k) + a / b(j) * Sin(w * b


(j) * x(k) -

Atn(wRC * b(j))) / Sqr(1 + (wRC * b(j)) ^ 2)
Next j
SignalE(k) = Format(SignalE(k) +


Eo, "0.000E+0") 'ajout de la valeur

continue + changement du format pour meilleur lisibilité
SignalS(k) = Format(SignalS(k) + Eo, "0.000E+0")
Next k

For j = 1 To nX
ActiveWorkbook.Sheets("Valeur").Cells(j, 1).Value = x


(j)

ActiveWorkbook.Sheets("Valeur").Cells(j, 2).Value >
SignalE(j)


ActiveWorkbook.Sheets("Valeur").Cells(j, 3).Value >
SignalS(j)


Next j

End Sub


.








Avatar
Denis
bonjour,
si tu as déjà un graphique tracé sur une feuille (en nuage
de points avec deux séries) je peux t'assurer que ce code
marche chez moi (excel 2000) quand le graphique sur la
feuille est sélectionné.
Sub machin()
Dim x(10) As Variant
Dim SignalE(10) As Variant
Dim SignalS(10) As Variant
For i = 1 To 10
x(i) = i
SignalE(i) = i * i
SignalS(i) = i * i * i
Next i
ActiveChart.SeriesCollection(1).XValues = x
ActiveChart.SeriesCollection(2).XValues = x
ActiveChart.SeriesCollection(1).Values = SignalE
ActiveChart.SeriesCollection(2).Values = SignalS
End Sub

Il transforme mes séries qui étaient de 14 points en
séries de 10 points et donc trace cette parabole et cette
cubique
Denis
-----Message d'origine-----
bonjours,

j'ai déja essayé mais ça me fait une erreur
d'execution : "impossible de

définir la propriété XValue"
=> il est impossible d'affecter directement un tableau
dans cette propriété

: il faut mettre un array => je ne sais pas convertir un
tableau standard en

array.

"Denis" a écrit
dans le message de

news:063a01c4a799$42bc5450$
Bonjour,

ton graphique existant déjà (avec tes 2 courbes) et étant
sélectionné

ActiveChart.SeriesCollection(1).XValues = x
ActiveChart.SeriesCollection(2).XValues = x
ActiveChart.SeriesCollection(1).Values = SignalE
ActiveChart.SeriesCollection(2).Values = SignalS

Et c'est tracé
Denis

-----Message d'origine-----
Bonjours,

Je repose ma question vu que personne ne m'a répondu :
peut-être

qu'aujourd'hui quelqu'un aura la réponse...

Je voudrais tracer des fonctions : pour cela je fait mes
calculs en Vba ( je

mes mes resultats dans des tableaux SignalE(), SignalS()
et x() ). J'utilise

un graphique en nuage de points.
Le problème est que pour tacer mes courbes, il faut que
je mets mes tableaux

dans des cellules Excel : celà fait une perte de temps
énorme => il faudrait

que je mette directement mes valeur dans mon graphique
(je veux pouvoir agir

sur différents termes de mes fonctions et voir en temps
réel les

changements).

J'ai déja essayé la méthode de serge Garneau : elle n'est
pas

valide car mes formules sont trop longues (dans une
cellule

Excel, il y a un nombre de caractères limités).

Quelqu'un a-t-il une autre solution ?

voici les fonctions que je trace (un signal carré + un
autre):

Rappel : un signal carré est une somme infinie de sigaux
sinusoidaux du type

a.sin(w.t+phi)

Option Explicit
Option Base 1 ' Attribue la valeur 1 aux indices de
tableau par défaut



Sub SignalCarré()

Dim j, k As Integer

Dim FeuilleTravail As Object
Set FeuilleTravail = ActiveWorkbook.Sheets("Carré")

Dim Ea As Double 'Amplitude du signal d'entrée
Ea = FeuilleTravail.Range("B1").Value 'valeur par
defaut = 2

Dim Eo As Double 'Offset du signal d'entrée
Eo = FeuilleTravail.Range("B2").Value 'valeur par
defaut = 0


Dim f As Double 'Fréquence du signal s'entrée
f = FeuilleTravail.Range("B3").Value 'valeur par
defaut = 1000000

Dim Er As Double 'rapport cyclique du signal d'entrée
Er = FeuilleTravail.Range("B4").Value 'non utilisé
Dim R As Double 'résistance du filtre
R = FeuilleTravail.Range("B20").Value 'valeur par
defaut = 1000

Dim C As Double 'capacité du filtre
C = FeuilleTravail.Range("B21").Value 'valeur par
defaut = 0.0000000001


Dim i As Integer 'nombre de porteuses
i = FeuilleTravail.Range("B5").Value 'valeur par
defaut = 20


Dim pX As Double 'borne inférieur sur axe des x
pX = FeuilleTravail.Range("B15").Value 'valeur par
defaut = -0.0000011

Dim gX As Double 'borne supérieur sur axe des x
gX = FeuilleTravail.Range("B16").Value 'valeur par
defaut = +0.0000011

Dim nX As Integer 'Nombre de points sur axe des x
nX = FeuilleTravail.Range("B17").Value 'valeur par
defaut = 500

Dim pasX As Double 'interval entre chaque points sur
l'axe des x

pasX = (gX - pX) / (nX - 1)

Dim x() As Double 'Tableau des valeurs de x
ReDim x(nX)
For j = 1 To (nX)
x(j) = Format(pX + (pasX) * (j - 1), "0.000E+0")
Next j

Dim a As Double ' = 2*Ea/PI
a = 2 * Ea / 3.14
Dim w As Double ' = 2*PI*f
w = 2 * 3.14 * f
Dim wRC As Double
wRC = w * R * C

Dim b() As Integer 'b(i) = ((i-1)*2+1)
ReDim b(i)
For j = 1 To i
b(j) = ((j - 1) * 2 + 1)
Next j

Dim SignalE() As Double 'calcul signal carré - somme des
a / b(i) * sin(w *

b(i) * t)
Dim SignalS() As Double 'calcul signal de sortie filtre
RC : T = 1 /

racine(1+(w.RC)^2)
Dim SignalTemp, Phi As Double
ReDim SignalE(nX)
ReDim SignalS(nX)
For k = 1 To nX
For j = 1 To i
SignalE(k) = SignalE(k) + a / b(j) * Sin(w *
b


(j) * x(k))
SignalS(k) = SignalS(k) + a / b(j) * Sin(w *
b


(j) * x(k) -
Atn(wRC * b(j))) / Sqr(1 + (wRC * b(j)) ^ 2)
Next j
SignalE(k) = Format(SignalE(k) +
Eo, "0.000E+0") 'ajout de la valeur

continue + changement du format pour meilleur lisibilité
SignalS(k) = Format(SignalS(k) + Eo, "0.000E+0")
Next k

For j = 1 To nX
ActiveWorkbook.Sheets("Valeur").Cells(j, 1).Value = x
(j)

ActiveWorkbook.Sheets("Valeur").Cells(j, 2).Value =
SignalE(j)

ActiveWorkbook.Sheets("Valeur").Cells(j, 3).Value =
SignalS(j)

Next j

End Sub


.




.




Avatar
Emcy
Je confirme ta macro fonctionne mais pourquoi ça ne marche pas dans mon cas
?
Peux-tu essayer de faire marcher cette macro (pour un graphique en nuage de
point avec deux courbe):

Option Explicit
Option Base 1 ' Attribue la valeur 1 aux indices de tableau par défaut


Sub SignalCarré()

Dim j, k As Integer

Dim FeuilleTravail As Object
Set FeuilleTravail = ActiveSheet

Dim Ea As Double 'Amplitude du signal d'entrée
Ea = 2
Dim Eo As Double 'Offset su signal d'entrée
Eo = 0
Dim f As Double 'Fréquence du signal s'entrée
f = 1000000
Dim R As Double 'résistance du filtre
R = 1000
Dim C As Double 'capacité du filtre
C = 0.0000000001

Dim i As Integer 'nombre de porteuses
i = 10

Dim pX As Double 'borne inférieur sur axe des x
pX = -0.0000011
Dim gX As Double 'borne supérieur sur axe des x
gX = 0.0000011
Dim nX As Integer 'Nombre de points sur axe des x
nX = 500
Dim pasX As Double 'interval entre chaque points sur l'axe des x
pasX = (gX - pX) / (nX - 1)

Dim x() As Variant 'Tableau des valeurs de x
ReDim x(nX)
For j = 1 To (nX)
x(j) = pX + (pasX) * (j - 1)
Next j

Dim a As Double ' = 2*Ea/PI
a = 2 * Ea / 3.14
Dim w As Double ' = 2*PI*f
w = 2 * 3.14 * f
Dim wRC As Double
wRC = w * R * C

Dim b() As Integer 'b(i) = ((i-1)*2+1)
ReDim b(i)
For j = 1 To i
b(j) = ((j - 1) * 2 + 1)
Next j

Dim SignalE() As Variant 'calcul signal carré - somme des a / b(i) * sin(w *
b(i) * t)
Dim SignalS() As Variant 'calcul signal de sortie filtre RC : T = 1 /
racine(1+(w.RC)^2)
Dim SignalTemp, Phi As Double
ReDim SignalE(nX)
ReDim SignalS(nX)
For k = 1 To nX
For j = 1 To i
SignalE(k) = SignalE(k) + a / b(j) * Sin(w * b(j) * x(k))
SignalS(k) = SignalS(k) + a / b(j) * Sin(w * b(j) * x(k) -
Atn(wRC * b(j))) / Sqr(1 + (wRC * b(j)) ^ 2)
Next j
SignalE(k) = SignalE(k) + Eo 'ajout de la valeur continue
SignalS(k) = SignalS(k) + Eo 'ajout de la valeur continue
Next k

'ActiveWorkbook.Names.Add Name:="x", RefersToR1C1:=x
'ActiveWorkbook.Names.Add Name:="E", RefersToR1C1:=SignalE
'ActiveWorkbook.Names.Add Name:="S", RefersToR1C1:=SignalS

'Sheets("Valeur").Select
'For j = 1 To nX
' ActiveWorkbook.Sheets("Valeur").Cells(j, 1).Value = x(j)
' ActiveWorkbook.Sheets("Valeur").Cells(j, 2).Value = SignalE(j)
' ActiveWorkbook.Sheets("Valeur").Cells(j, 3).Value = SignalS(j)
'Next j

ActiveChart.SeriesCollection(1).XValues = x
ActiveChart.SeriesCollection(2).XValues = x
ActiveChart.SeriesCollection(1).Values = SignalE
ActiveChart.SeriesCollection(2).Values = SignalS

End Sub

"Denis" a écrit dans le message de
news:164a01c4a7b7$57677bf0$
bonjour,
si tu as déjà un graphique tracé sur une feuille (en nuage
de points avec deux séries) je peux t'assurer que ce code
marche chez moi (excel 2000) quand le graphique sur la
feuille est sélectionné.
Sub machin()
Dim x(10) As Variant
Dim SignalE(10) As Variant
Dim SignalS(10) As Variant
For i = 1 To 10
x(i) = i
SignalE(i) = i * i
SignalS(i) = i * i * i
Next i
ActiveChart.SeriesCollection(1).XValues = x
ActiveChart.SeriesCollection(2).XValues = x
ActiveChart.SeriesCollection(1).Values = SignalE
ActiveChart.SeriesCollection(2).Values = SignalS
End Sub

Il transforme mes séries qui étaient de 14 points en
séries de 10 points et donc trace cette parabole et cette
cubique
Denis
-----Message d'origine-----
bonjours,

j'ai déja essayé mais ça me fait une erreur
d'execution : "impossible de

définir la propriété XValue"
=> il est impossible d'affecter directement un tableau
dans cette propriété

: il faut mettre un array => je ne sais pas convertir un
tableau standard en

array.

"Denis" a écrit
dans le message de

news:063a01c4a799$42bc5450$
Bonjour,

ton graphique existant déjà (avec tes 2 courbes) et étant
sélectionné

ActiveChart.SeriesCollection(1).XValues = x
ActiveChart.SeriesCollection(2).XValues = x
ActiveChart.SeriesCollection(1).Values = SignalE
ActiveChart.SeriesCollection(2).Values = SignalS

Et c'est tracé
Denis

-----Message d'origine-----
Bonjours,

Je repose ma question vu que personne ne m'a répondu :
peut-être

qu'aujourd'hui quelqu'un aura la réponse...

Je voudrais tracer des fonctions : pour cela je fait mes
calculs en Vba ( je

mes mes resultats dans des tableaux SignalE(), SignalS()
et x() ). J'utilise

un graphique en nuage de points.
Le problème est que pour tacer mes courbes, il faut que
je mets mes tableaux

dans des cellules Excel : celà fait une perte de temps
énorme => il faudrait

que je mette directement mes valeur dans mon graphique
(je veux pouvoir agir

sur différents termes de mes fonctions et voir en temps
réel les

changements).

J'ai déja essayé la méthode de serge Garneau : elle n'est
pas

valide car mes formules sont trop longues (dans une
cellule

Excel, il y a un nombre de caractères limités).

Quelqu'un a-t-il une autre solution ?

voici les fonctions que je trace (un signal carré + un
autre):

Rappel : un signal carré est une somme infinie de sigaux
sinusoidaux du type

a.sin(w.t+phi)

Option Explicit
Option Base 1 ' Attribue la valeur 1 aux indices de
tableau par défaut



Sub SignalCarré()

Dim j, k As Integer

Dim FeuilleTravail As Object
Set FeuilleTravail = ActiveWorkbook.Sheets("Carré")

Dim Ea As Double 'Amplitude du signal d'entrée
Ea = FeuilleTravail.Range("B1").Value 'valeur par
defaut = 2

Dim Eo As Double 'Offset du signal d'entrée
Eo = FeuilleTravail.Range("B2").Value 'valeur par
defaut = 0


Dim f As Double 'Fréquence du signal s'entrée
f = FeuilleTravail.Range("B3").Value 'valeur par
defaut = 1000000

Dim Er As Double 'rapport cyclique du signal d'entrée
Er = FeuilleTravail.Range("B4").Value 'non utilisé
Dim R As Double 'résistance du filtre
R = FeuilleTravail.Range("B20").Value 'valeur par
defaut = 1000

Dim C As Double 'capacité du filtre
C = FeuilleTravail.Range("B21").Value 'valeur par
defaut = 0.0000000001


Dim i As Integer 'nombre de porteuses
i = FeuilleTravail.Range("B5").Value 'valeur par
defaut = 20


Dim pX As Double 'borne inférieur sur axe des x
pX = FeuilleTravail.Range("B15").Value 'valeur par
defaut = -0.0000011

Dim gX As Double 'borne supérieur sur axe des x
gX = FeuilleTravail.Range("B16").Value 'valeur par
defaut = +0.0000011

Dim nX As Integer 'Nombre de points sur axe des x
nX = FeuilleTravail.Range("B17").Value 'valeur par
defaut = 500

Dim pasX As Double 'interval entre chaque points sur
l'axe des x

pasX = (gX - pX) / (nX - 1)

Dim x() As Double 'Tableau des valeurs de x
ReDim x(nX)
For j = 1 To (nX)
x(j) = Format(pX + (pasX) * (j - 1), "0.000E+0")
Next j

Dim a As Double ' = 2*Ea/PI
a = 2 * Ea / 3.14
Dim w As Double ' = 2*PI*f
w = 2 * 3.14 * f
Dim wRC As Double
wRC = w * R * C

Dim b() As Integer 'b(i) = ((i-1)*2+1)
ReDim b(i)
For j = 1 To i
b(j) = ((j - 1) * 2 + 1)
Next j

Dim SignalE() As Double 'calcul signal carré - somme des
a / b(i) * sin(w *

b(i) * t)
Dim SignalS() As Double 'calcul signal de sortie filtre
RC : T = 1 /

racine(1+(w.RC)^2)
Dim SignalTemp, Phi As Double
ReDim SignalE(nX)
ReDim SignalS(nX)
For k = 1 To nX
For j = 1 To i
SignalE(k) = SignalE(k) + a / b(j) * Sin(w *
b


(j) * x(k))
SignalS(k) = SignalS(k) + a / b(j) * Sin(w *
b


(j) * x(k) -
Atn(wRC * b(j))) / Sqr(1 + (wRC * b(j)) ^ 2)
Next j
SignalE(k) = Format(SignalE(k) +
Eo, "0.000E+0") 'ajout de la valeur

continue + changement du format pour meilleur lisibilité
SignalS(k) = Format(SignalS(k) + Eo, "0.000E+0")
Next k

For j = 1 To nX
ActiveWorkbook.Sheets("Valeur").Cells(j, 1).Value = x
(j)

ActiveWorkbook.Sheets("Valeur").Cells(j, 2).Value >SignalE(j)
ActiveWorkbook.Sheets("Valeur").Cells(j, 3).Value >SignalS(j)
Next j

End Sub


.




.




Avatar
Alain CROS
Bonjour

Le problème est que tu as trop de caractères pour ta formule SERIE du graphique qui doit avoir une limite.
Ton code fonctionne chez moi jusqu'a nx.
Le code de Denis foctionne chez moi jusqu'a 44
Apparemment, la limite se situe au environ de 250 (255?).

Alain CROS

----- Original Message -----
From: "Emcy"
Newsgroups: microsoft.public.fr.excel
Sent: Friday, October 01, 2004 3:23 PM
Subject: Re: Tracer rapidement un graphique


Je confirme ta macro fonctionne mais pourquoi ça ne marche pas dans mon cas
?
Peux-tu essayer de faire marcher cette macro (pour un graphique en nuage de
point avec deux courbe):