Création d'un graphique dans une boucle, pb de dimension et de suppression

guainflo

XLDnaute Junior
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
 

Pièces jointes

  • Prg_caracteristiqueavide.zip
    45.2 KB · Affichages: 26
  • Prg_caracteristiqueavide.zip
    45.2 KB · Affichages: 25
  • Prg_caracteristiqueavide.zip
    45.2 KB · Affichages: 26

guainflo

XLDnaute Junior
Re : Création d'un graphique dans une boucle, pb de dimension et de suppression

Re,

J'ai modifié ces lignes :
Il me donne comment nom du graphe à chaque entrée dans la boucle après la création : "toto", mais il ne les supprime pas.

Mais il semble quand fait, il créé à chaque nouveau tour dans la boucle un nouveau graphique et qu'il modifie tous les graphiques déjà créé (tous les graphiques ont les mêmes courbes (les dernières)).
Et aucun des graphes n'a les dimensions souhaitées.


Sub trace()

Charts.Add
ActiveChart.Name = "toto"
MsgBox ActiveChart.Name

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
ActiveSheet.ChartObjects("toto").Delete

End Sub
 

kiki29

XLDnaute Barbatruc
Re : Création d'un graphique dans une boucle, pb de dimension et de suppression

Salut, 2 exemples à adapter à ton contexte
Code:
Option Explicit

Sub Tst()
Dim Ws As Worksheet
Dim Ch As ChartObject

    For Each Ws In ThisWorkbook.Worksheets
        For Each Ch In Ws.ChartObjects
            ' Renvoie nom du graphe
            Debug.Print Ch.Name
            
            ' Renvoie nom d'onglet de la feuille contenant le graphe
            Debug.Print Ch.Parent.Name
            
            '   Supprime le graphe
            'Ch.Delete
            
        Next Ch
    Next Ws
End Sub

un autre pour positionner un graphe
Code:
Option Explicit

Sub PositonnerGraphe()
Dim sNomGraphe As String
Dim Emplacement As Range
Dim Ch As ChartObject
    
    sNomGraphe = ActiveChart.Parent.Name
    ShGraphe.ChartObjects(sNomGraphe).Activate

    Set Emplacement = ShGraphe.Range("C4:K40")
    Set Ch = ShGraphe.ChartObjects(sNomGraphe)

    With Ch
        .Left = Emplacement.Left
        .Top = Emplacement.Top
        .Height = Emplacement.Height
        .Width = Emplacement.Width
    End With
    
    Set Ch = Nothing

End Sub

ShGraphe étant le "Code Name" de la feuille contenant le graphe

PS : Pourrais-tu baliser ton code ?
 
Dernière édition:

guainflo

XLDnaute Junior
Re : Création d'un graphique dans une boucle, pb de dimension et de suppression

Bonjour et merci,

En fait j'ai trouvé et j'ai fais plus simple.

Je crée une seule fois le graphe, et comme les données sources du graphe sont sur une feuille, lorsque le programme viens modifier les valeurs dans cette feuille, le graphe se met à jour tous seul.
 

Discussions similaires

Réponses
1
Affichages
168
Réponses
0
Affichages
153

Statistiques des forums

Discussions
312 213
Messages
2 086 307
Membres
103 174
dernier inscrit
OBUTT