Création d'un graphique via VB

Résolu
Utilisateur anonyme - 7 mars 2009 à 13:55
 Utilisateur anonyme - 9 mars 2009 à 09:36
Bonjour à tous !

Mon problème ne me semble pas compliqué mais je suis novice en VB
et je n'arrive pas à m'en sortir, même après moulte recherche...

Je désire créer un graphique (type nuage de points) à partir d'une série de données contenu dans un tableau de taille variable

je voudrais que le graphique soit contenu dans la feuille active et
placé à une position donné , qu'il porte un nom (pour pouvoir l'effacer
à l'aide d'une autre fonction)ainsi qu'un titre en X et en Y .

J'ai enregistré une macro, mais elle nomme automatiquement le
tableau à chaque fois que je l'appel. Mon tableau n'a donc pas de nom
précis graph1, puis 2.... il n'a donc pas d'attribut spécifique pour le
supprimer.

De plus lorsque j'exécute cette macro je sélectionne la totalité de
la colonne où sont contenu mes valeurs... ce n'est pas vraiment
variable


Code :

<ol id="code1" class="olcode">
<li>Columns("T:T" ).Select</li>
<li>    ActiveSheet.Shapes.AddChart.Select</li>
<li>    ActiveChart.SetSourceData Source:=Range("Feuil1!$T:$T" )</li>
<li>    ActiveChart.ChartType = xlXYScatter</li>
<li>    ActiveChart.SetElement (msoElementChartTitleCenteredOverlay)</li>
<li>    ActiveSheet.ChartObjects("Graphique 20" ).Activate</li>
<li>    ActiveChart.SetElement (msoElementPrimaryCategoryAxisTitleAdjacentToAxis)</li>
<li>    ActiveSheet.ChartObjects("Graphique 20" ).Activate</li>
<li>    ActiveSheet.ChartObjects("Graphique 20" ).Activate</li>
<li>    ActiveChart.SetElement (msoElementPrimaryValueAxisTitleRotated)</li>
<li>    ActiveSheet.ChartObjects("Graphique 20" ).Activate</li>
<li>    ActiveChart.Axes(xlValue, xlPrimary).AxisTitle.Text = "Y"</li>
<li>    ActiveSheet.ChartObjects("Graphique 20" ).Activate</li>
<li>    ActiveChart.ChartArea.Select</li>
<li>    ActiveSheet.ChartObjects("Graphique 20" ).Activate</li>
<li>    ActiveChart.Legend.Select</li>
<li>    Selection.Delete</li>
<li>    ActiveSheet.ChartObjects("Graphique 20" ).Activate</li>
<li>    ActiveChart.Axes(xlValue).MajorGridlines.Select</li>
<li>    ActiveChart.SeriesCollection(1).Name = "=""titre"""</li>
<li>    ActiveSheet.ChartObjects("Graphique 20" ).Activate</li>
<li>    ActiveChart.SeriesCollection(1).Select</li>
<li>    Selection.MarkerStyle = -4142</li>
<li>    ActiveSheet.ChartObjects("Graphique 20" ).Activate</li>
<li>    ActiveChart.ChartArea.Select</li>
<li>    ActiveSheet.ChartObjects("Graphique 20" ).Activate</li>
</ol>







si quelqu'un pourrait me venir en aide, en me donnant les noms des fonctions et la synthaxe

pour nommer un graphique, le positionner, nommer ses axes ce serait déjà formidable

cordialement






Répondre
http://www.presence-pc.com/forum/message.php?config=ppc.inc&cat=9&post=6117&page=1&p=1&subcat=59&sondage=0&owntopic=0&new=0

8 réponses

cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
9 mars 2009 à 08:58
Cette erreur est normale, zuba.

Ta macro crée un Shape et lui donne un nom ; tu ne peux pas relancer une deuxième fois la macro car elle va essayer de créer un deuxième Shape sous le même nom, et cela génère une erreur au moment de renommer le nouveau contrôle.

C'est la raison pour laquelle, lorsque tu crées un Shape auquel tu donnes un nom précis, tu dois d'abord voir si un Shape existe déjà sous ce nom. Voici une fonction qui retourne True si le Shape (dont le nom est passé en argument) existe.



Private Function ShapeExiste(nomShape As String) As Boolean
     Dim s as Shape
     ShapeExiste = False
     For Each s In ActiveSheet.Shapes
          If s.Name = nomShape Then
              ShapeExiste = True
              Exit For
          End If
    Next
End Function


Pour appeler cette fonction depuis la macro test(), tu peux placer l'une ou l'autre des deux instructions suivantes au début de la macro test() ; si monGraphique existe déjà, il sera supprimé ou bien la macro test() ne sera pas exécutée, selon l'instruction que tu choisis :


1) If ShapeExiste("monGraphique") Then ActiveSheet.Shapes("monGraphique").Delete' monGraphique est supprimé
2) If ShapeExiste("monGraphique") Then Exit Sub' la macro test() n'est pas exécutée


J'espère avoir été assez clair dans mes explications. Bon courage.
3
Utilisateur anonyme
7 mars 2009 à 20:33
voila j'ai cherché sur le web anglais et j'ai reussi a trouver qq fonction qui m'aide

mon code ressemble donc à ça maintenant

:
 With ActiveSheet.ChartObjects.Add _
            (Left:=450, Width:=375, Top:=200, Height:=225)
            .Chart.Parent.Name = "Histogramme de répartition fréquentielle"
           .Chart.SetSourceData Source:=Sheets("Feuil1").Range("Feuil1!$T:$T")
        .Chart.ChartType = xlXYScatter
   .Chart.Legend.Delete
  
End With

Call graph
Call Macro1

End Sub

Sub graph()
   
    ActiveSheet.ChartObjects("Histogramme de répartition fréquentielle").Activate
    ActiveSheet.ChartObjects("Histogramme de répartition fréquentielle").Activate
    ActiveChart.SetElement (msoElementChartTitleCenteredOverlay)
    ActiveSheet.ChartObjects("Histogramme de répartition fréquentielle").Activate
    ActiveChart.ChartTitle.Text = "Histogramme de répartition fréquentielle"
    ActiveSheet.ChartObjects("Histogramme de répartition fréquentielle").Activate
    ActiveChart.PlotArea.Select
    ActiveChart.SetElement (msoElementPrimaryValueAxisTitleRotated)
    ActiveSheet.ChartObjects("Histogramme de répartition fréquentielle").Activate
    ActiveSheet.ChartObjects("Histogramme de répartition fréquentielle").Activate
    ActiveChart.Axes(xlValue, xlPrimary).AxisTitle.Text = "Nombre de particules"
    ActiveSheet.ChartObjects("Histogramme de répartition fréquentielle").Activate
    ActiveChart.PlotArea.Select
    Range("A1").Select
End Sub
Sub Macro1()
'
' Macro1 Macro
'

'
    ActiveSheet.ChartObjects("Histogramme de répartition fréquentielle").Activate
    ActiveChart.ChartArea.Select
    ActiveChart.SetElement (msoElementPrimaryCategoryAxisTitleAdjacentToAxis)
    ActiveSheet.ChartObjects("Histogramme de répartition fréquentielle").Activate
    ActiveChart.Axes(xlValue, xlPrimary).AxisTitle.Text = "Distance(m)"
    ActiveSheet.ChartObjects("Histogramme de répartition fréquentielle").Activate
    ActiveChart.ChartArea.Select
    Range("A1").Select
End Sub

j'ai donc un affichage où je veux tout est bien

j'ai une chose qui marche mal c'est l'affichage des noms X et Y j'ai fais un enregistrement de macro pour ça, mais ça marche tres mal, surtout le X qui ne veux pas se renomer

voila si qqun peux m'aider ce serai cool
:D
0
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
7 mars 2009 à 22:34
Salut

Je voulais répondre à ton premier message, mais j'ai eu une interruption d'internet. Je donne quand même ma solution, si ça peut servir.

Bonjour



Tu t'es trompée de thème ; pour Excel et les autres applications VBA, le bon thème est Visual Basic/Langages dérivés/VBA.



Le plus simple est de créer ton graphique dans une fenêtre graphique, puis de l'incorporer par la méthode Location : ton graphique devient une forme de ta feuille de calcul, comme dans l'exemple suivant :




Sub test()
    Application.Charts.Add
    With ActiveChart
        .SetSourceData Source:=Range("Feuil1!$T:$T")
        .ChartType = xlXYScatter
        .Location Where:=xlLocationAsObject, Name:="Feuil1" ' incorpore le graphique
    End With
    ActiveWindow.Visible = False                                          ' masque la fenêtre graphique
    Selection.Name = "monGraphique"                                   ' renomme la forme
    With ActiveSheet.Shapes("monGraphique")                       ' positionne la forme puis la supprime
        .Left = 10
        .Top = 40
        .Delete
    End With
End Sub





Amicalement 
0
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
7 mars 2009 à 22:38
Que veux tu dire par noms X et Y ? le titre des axes ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
8 mars 2009 à 10:23
"Que veux tu dire par noms X et Y ? le titre des axes ?" :
le code que j'ai mis arrive a mettre le titre du graphique et le titre de l'axe Y, cependant la modification du titre de l'axe X me renvoi systématiquement une erreur

je pense que ça viens du fait que je ne défini pas de colonne pour X. Je fais un graphique type nuage de point et j'affecte la colonne T, cependant pour les valeur de X c'est des valeur par default et je pense que ça pose problème.

J'ai essayé ton code il fonctionne bien mais il me renvoi une erreur '450' "nombre d'arguments incorrect ou affection de propriétés incorrect" :(

et le debugger se place au niveau de   Selection.Name = "monGraphique"

que faire ?
0
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
8 mars 2009 à 12:16
- Hum, je ne sais pas trop pourquoi mon code plante, car je n'ai pas ce problème chez moi. Peux-tu insérer les deux lignes ci-dessous juste avant Selection.Name = "monGraphique" ?

    ActiveSheet.Activate
    ActiveSheet.Shapes(ActiveSheet.Shapes.Count).Select

- Je n'ai trouvé dans ton code, d'instruction pour définir le titre de l'axe des X. Ce code doit ressembler à ça :

        ActiveChart.Axes(xlCategory, xlPrimary).HasTitle = True
        ActiveChart.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "axe x"

Peux-tu l'essayer ? Dans mon code il faut le placer au-dessus de l'instruction .Location.
 
0
Utilisateur anonyme
9 mars 2009 à 07:35
Rebonjour,
merci de m'aider autant :D

j'ai essayer tout le nouveau code que vous m'avez copier, l'axe des x fonctionne sans pb, et le graphique se creer sans pb quand j'éxecute la macro une fois

quand je la relance j'ai une nouvelle fois la même erreur...

de plus j'ai remarqué que le nom du graphique n'est pas "mon graphique" mais le nom par default excel "graph 1" puis 2 etc...

le pb vient peut-être de là ?
0
Utilisateur anonyme
9 mars 2009 à 09:36
merci de votre aide, tout fonctionne
0
Rejoignez-nous