Bonjour,
J'ai un problème avec la création d'un graphique dans une boucle.
Voici ma boucle :
fin = 0
Do Until fin = 1
Call trace
Loop
On apelle le sous programme trace tant que fin=0 (fin passe à 1 quand l'utilisateur appui sur un bouton dans le sous programme call).
A chaque fois que l'on appelle le sous programme trace, il trace un graphe composé de 2 série de points (les 2 séries de points se trouvent sur la même feuille mais ils sont séparés, pas les mêmes X).
En fait à chaque fois, je veux qu'il supprime la feuille qui a été créé et la remplace par une nouvelle avec 2 série de points qui se trouvent aux même endroits mais qui ont changé de valeurs.
Ce que j'ai essayé de faire dans la boucle, c'est de supprimer le graphe existant, et de le recréer.
Je redéfini les dimensions du graphe après l'avoir créé à chaque fois dans la boucle, mon problème est qu'il le fait que lors du 1er passage dans la boucle.
Un autre problème est qu'il ne supprime pas les graphes, à chaque nouveau passage dans la boucle, il crée un nouveau graphe par dessus.
Ce que j'ai essayé de faire, c'est de donner un nom au graphe créé, on fait un test avec le nom à chaque entrée dans la boucle pour savoir si la graphe existe (si oui on le supprime), et après on créé le graphe tjs avec le même nom et après on le redimensionne grâce au nom.
Je n'y ai pas arrivé, si quelqu'un peut regarder mon programme en pièce jointe ou modifier les lignes de code en dessous :
J'ai trouvé les lignes de code pour la création du graphe et surtout le redimensionnement et la position, en enregistrant une macro pour voir les lignes de codes créées. La première série de points est tjs composée de 40 couples de points, par contre la deuxième peut être composée de 3 à 13 couples, donc je sélectionne pour le graphe 13 lignes, si il n'y a que 5 couples il affiche que 5 couples et ca marche très bien.
Une solution, qui est beaucoup mieux, est de créer un graphe qu'une seule fois et de le rafraichir par les nouvelles valeurs à chaque passage dans la boucle, mais je sais pas du tout le faire et je n'ai pas trouvé sur le net.
Sub trace()
Worksheets("Graphecaract").Select
Dim PlageCoeff As Range
Dim SC As Series
Set F1 = Worksheets("Graphecaract")
With F1
Set PlageX = Range(.Range("G2").Offset(1, 0), .Range("G2").End(xlDown))
Set PlageY = Range(.Range("H2").Offset(1, 0), .Range("H2").End(xlDown))
Set PlageCoeff = .Range("$G$14:$H$14")
PlageCoeff.Select
Selection.FormulaArray = "=LINEST(" & PlageY.Address & ",LN(" & PlageX.Address & "))"
On Error Resume Next
End With
Dim i
Dim coeffloga1
Dim coeffloga0
coeffloga1 = Range("G14")
coeffloga0 = Range("H14")
Range("N24").Select
For i = 1 To 20
j = (i * pasloga) + Range("G4")
ActiveCell = j
ActiveCell.Offset(0, 1) = (coeffloga1 * Log(j)) + coeffloga0
ActiveCell.Offset(1, 0).Select
Next
ActiveSheet.ChartObjects("Graphique 1").Delete
Charts.Add
ActiveChart.ChartType = xlXYScatterSmoothNoMarkers
ActiveChart.SetSourceData Source:=Sheets("Graphecaract").Range("N3:O43"), PlotBy _
:=xlColumns
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(1).Name = "=""Caractéristique à vide tendance"""
ActiveChart.SeriesCollection(2).XValues = "=Graphecaract!R3C2:R15C2"
ActiveChart.SeriesCollection(2).Values = "=Graphecaract!R3C3:R15C3"
ActiveChart.SeriesCollection(2).Name = "=""Caractéristique à vide d'origine"""
ActiveChart.Location Where:=xlLocationAsObject, Name:="Graphecaract"
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "Caractéristiques à vide"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Courant d'excitation (A)"
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Tension à vide (V)"
End With
With ActiveChart.Axes(xlCategory)
.HasMajorGridlines = True
.HasMinorGridlines = False
End With
With ActiveChart.Axes(xlValue)
.HasMajorGridlines = True
.HasMinorGridlines = False
End With
ActiveChart.HasLegend = True
ActiveChart.Legend.Select
Selection.Position = xlRight
ActiveSheet.Shapes("Graphique 1").IncrementLeft -160.75
ActiveSheet.Shapes("Graphique 1").IncrementTop -90#
ActiveSheet.Shapes("Graphique 1").ScaleWidth 1.8, msoFalse, _
msoScaleFromTopLeft
ActiveSheet.Shapes("Graphique 1").ScaleHeight 1.5, msoFalse, _
msoScaleFromTopLeft
FRM_test.Show
End Sub
J'ai un problème avec la création d'un graphique dans une boucle.
Voici ma boucle :
fin = 0
Do Until fin = 1
Call trace
Loop
On apelle le sous programme trace tant que fin=0 (fin passe à 1 quand l'utilisateur appui sur un bouton dans le sous programme call).
A chaque fois que l'on appelle le sous programme trace, il trace un graphe composé de 2 série de points (les 2 séries de points se trouvent sur la même feuille mais ils sont séparés, pas les mêmes X).
En fait à chaque fois, je veux qu'il supprime la feuille qui a été créé et la remplace par une nouvelle avec 2 série de points qui se trouvent aux même endroits mais qui ont changé de valeurs.
Ce que j'ai essayé de faire dans la boucle, c'est de supprimer le graphe existant, et de le recréer.
Je redéfini les dimensions du graphe après l'avoir créé à chaque fois dans la boucle, mon problème est qu'il le fait que lors du 1er passage dans la boucle.
Un autre problème est qu'il ne supprime pas les graphes, à chaque nouveau passage dans la boucle, il crée un nouveau graphe par dessus.
Ce que j'ai essayé de faire, c'est de donner un nom au graphe créé, on fait un test avec le nom à chaque entrée dans la boucle pour savoir si la graphe existe (si oui on le supprime), et après on créé le graphe tjs avec le même nom et après on le redimensionne grâce au nom.
Je n'y ai pas arrivé, si quelqu'un peut regarder mon programme en pièce jointe ou modifier les lignes de code en dessous :
J'ai trouvé les lignes de code pour la création du graphe et surtout le redimensionnement et la position, en enregistrant une macro pour voir les lignes de codes créées. La première série de points est tjs composée de 40 couples de points, par contre la deuxième peut être composée de 3 à 13 couples, donc je sélectionne pour le graphe 13 lignes, si il n'y a que 5 couples il affiche que 5 couples et ca marche très bien.
Une solution, qui est beaucoup mieux, est de créer un graphe qu'une seule fois et de le rafraichir par les nouvelles valeurs à chaque passage dans la boucle, mais je sais pas du tout le faire et je n'ai pas trouvé sur le net.
Sub trace()
Worksheets("Graphecaract").Select
Dim PlageCoeff As Range
Dim SC As Series
Set F1 = Worksheets("Graphecaract")
With F1
Set PlageX = Range(.Range("G2").Offset(1, 0), .Range("G2").End(xlDown))
Set PlageY = Range(.Range("H2").Offset(1, 0), .Range("H2").End(xlDown))
Set PlageCoeff = .Range("$G$14:$H$14")
PlageCoeff.Select
Selection.FormulaArray = "=LINEST(" & PlageY.Address & ",LN(" & PlageX.Address & "))"
On Error Resume Next
End With
Dim i
Dim coeffloga1
Dim coeffloga0
coeffloga1 = Range("G14")
coeffloga0 = Range("H14")
Range("N24").Select
For i = 1 To 20
j = (i * pasloga) + Range("G4")
ActiveCell = j
ActiveCell.Offset(0, 1) = (coeffloga1 * Log(j)) + coeffloga0
ActiveCell.Offset(1, 0).Select
Next
ActiveSheet.ChartObjects("Graphique 1").Delete
Charts.Add
ActiveChart.ChartType = xlXYScatterSmoothNoMarkers
ActiveChart.SetSourceData Source:=Sheets("Graphecaract").Range("N3:O43"), PlotBy _
:=xlColumns
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(1).Name = "=""Caractéristique à vide tendance"""
ActiveChart.SeriesCollection(2).XValues = "=Graphecaract!R3C2:R15C2"
ActiveChart.SeriesCollection(2).Values = "=Graphecaract!R3C3:R15C3"
ActiveChart.SeriesCollection(2).Name = "=""Caractéristique à vide d'origine"""
ActiveChart.Location Where:=xlLocationAsObject, Name:="Graphecaract"
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "Caractéristiques à vide"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Courant d'excitation (A)"
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Tension à vide (V)"
End With
With ActiveChart.Axes(xlCategory)
.HasMajorGridlines = True
.HasMinorGridlines = False
End With
With ActiveChart.Axes(xlValue)
.HasMajorGridlines = True
.HasMinorGridlines = False
End With
ActiveChart.HasLegend = True
ActiveChart.Legend.Select
Selection.Position = xlRight
ActiveSheet.Shapes("Graphique 1").IncrementLeft -160.75
ActiveSheet.Shapes("Graphique 1").IncrementTop -90#
ActiveSheet.Shapes("Graphique 1").ScaleWidth 1.8, msoFalse, _
msoScaleFromTopLeft
ActiveSheet.Shapes("Graphique 1").ScaleHeight 1.5, msoFalse, _
msoScaleFromTopLeft
FRM_test.Show
End Sub