VB Excel déplacement Objet Graphique

Résolu/Fermé
Kamoulox - 15 nov. 2010 à 11:40
 Kamoulox - 16 nov. 2010 à 10:17
Bonjour,

J'ai un léger souci. J'ai inséré plusieurs graphique dans une feuille, je les ai renommé et je désire les déplacer à partir de leur petit nom. Seulement je n'y arrive pas.

Le nom que j'ai donné à ces graphiques est un nom "fabriqué" à partir de valeur de cellule et de caractère.

voici mon code :
'Création du grapique
...tout se passe bien je vous épargne les lignes inutiles

'Création du titre de graphique
Dim TitlePT as String
TitlePT = Worksheets("Summary").Cells(2, 2).Value & " | P & T"

'Titre du graphique et des axes
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = TitlePT
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Temps"
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Bar | °C"
End With
ActiveChart.HasLegend = True
ActiveChart.Legend.Select
Selection.Position = xlRight

'Déplacement du graphique
ActiveSheet.ChartObjects(TitlePT).Left = Range("J1").Left (ça bugge à ce moment là)


Voici mon message d'erreur :
"Impossible de lire la propriété ChartObjects de la classe Worksheets"

Pour info j'ai déjà fait plusieurs tentatives qui n'ont mené à rien :
. Ne pas déclarer TitlePT (et laisser Excel gérer le type d'objet)
. Mettre des guillemets ex : ChartObjects("TitlePT")
. Ecrire l'adresse complète Worksheets("Summary").ChartObjects........

Et toutes les combinaisons possibles de ces trois tentatives.

Voila, y'a-t-il quelqu'un pour m'aider, l'aide de Excel ne m'avance pas plus.

Merci d'avance.

Kamal

A voir également:

15 réponses

cousinhub29 Messages postés 881 Date d'inscription mardi 10 août 2010 Statut Membre Dernière intervention 16 avril 2024 333
15 nov. 2010 à 14:09
Re-,

Essaie ainsi, non testé (je ne connais pas la disposition de tes données...)

Private Sub ButtonGraphPoint1_Click()

Dim TitlePT As String
Dim TitleQN As String
Dim NameGraph As String

A = Worksheets("Summary").Cells(5, 7).Value
B = Worksheets("Summary").Cells(6, 7).Value
TitlePT = Worksheets("Summary").Cells(2, 2).Value & " | P & T"
TitleQN = Worksheets("Summary").Cells(2, 2).Value & " | Q & N"

Dim c As ChartObject
Set c = Sheets("DATA").ChartObjects.Add(Range("J1").Left, Range("J1").Top, 300, 200)
With c.Chart
    .ChartType = xlXYScatter
    .SetSourceData Source:=Sheets("DATA").Range("E" & A & ":E" & B), PlotBy _
            :=xlColumns
    .SeriesCollection.NewSeries
    .SeriesCollection(1).XValues = "=DATA!R" & A & "C2:R" & B & "C2"
    .SeriesCollection(2).XValues = "=DATA!R" & A & "C2:R" & B & "C2"
    .SeriesCollection(2).Values = "=DATA!R" & A & "C9:R" & B & "C9"
    .SeriesCollection.NewSeries
    .SeriesCollection(3).XValues = "=DATA!R" & A & "C2:R" & B & "C2"
    .SeriesCollection(3).Values = "=DATA!R" & A & "C4:R" & B & "C4"
    .SeriesCollection.NewSeries
    .SeriesCollection(4).XValues = "=DATA!R" & A & "C2:R" & B & "C2"
    .SeriesCollection(4).Values = "=DATA!R" & A & "C8:R" & B & "C8"
    .SeriesCollection(1).Name = "=""P1(bar)"""
    .SeriesCollection(2).Name = "=""P2(bar)"""
    .SeriesCollection(3).Name = "=""T1(°C)"""
    .SeriesCollection(4).Name = "=""T2(°C)"""
    .ChartTitle.Characters.Text = TitlePT
    .Axes(xlCategory, xlPrimary).HasTitle = True
    .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Temps"
    .Axes(xlValue, xlPrimary).HasTitle = True
    .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Bar | °C"
    .Legend.Position = xlRight
End With
End Sub


Essaie, et si cela ne fonctionne pas, donne la disposition de tes données...
2
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
Modifié par ccm81 le 15/11/2010 à 13:37
je crois que ça vient du fait que dans le code
TitilePT est le titre du graphique et pas son nom

ActiveSheet.ChartObjects(TitlePT).Left = Range("J1").Left
(ça bugge à ce moment là fatalement)

la méthode ChartObjects s'utilise soit avec
- ChartObjects(index) où index est le numéro du graphique (dans la collection)
- ChartObjects(nom) où nom est le nom (.name) du graphique

donc donner un nom (.name) au graphique ou l'appeler par son index


bonne suite
0
cousinhub29 Messages postés 881 Date d'inscription mardi 10 août 2010 Statut Membre Dernière intervention 16 avril 2024 333
15 nov. 2010 à 13:05
Bonjour,

'Création du grapique
...tout se passe bien je vous épargne les lignes inutiles


Ben, justement, on pourrait les voir, ces lignes "inutiles"?

Peut-être que ce serait justement à ce moment qu'on pourrait placer le graphique à l'endroit qui va bien....

@ te relire
0
Voici tout le code ce sera plus simple :

Private Sub ButtonGraphPoint1_Click()

Dim TitlePT As String
Dim TitleQN As String
Dim NameGraph As String

'Affectation des numéros de ligne
A = Worksheets("Summary").Cells(5, 7).Value
B = Worksheets("Summary").Cells(6, 7).Value
TitlePT = Worksheets("Summary").Cells(2, 2).Value & " | P & T"
TitleQN = Worksheets("Summary").Cells(2, 2).Value & " | Q & N"

'Création du graphique Pression et Température
        Sheets("DATA").Select
        Charts.Add
        ActiveChart.ChartType = xlXYScatter
        'Série 1 (P1)
        ActiveChart.SetSourceData Source:=Sheets("DATA").Range("E" & A & ":E" & B), PlotBy _
            :=xlColumns
    'Création des nouvelles séries de données
        'Série 2 (P2)
            ActiveChart.SeriesCollection.NewSeries
                'Valeurs de X (toujours les mêmes quelque soit l'index du graphique)
            ActiveChart.SeriesCollection(1).XValues = "=DATA!R" & A & "C2:R" & B & "C2"
            ActiveChart.SeriesCollection(2).XValues = "=DATA!R" & A & "C2:R" & B & "C2"
                'Valeurs de Y
            ActiveChart.SeriesCollection(2).Values = "=DATA!R" & A & "C9:R" & B & "C9"
        'Série 3 (T1)
            ActiveChart.SeriesCollection.NewSeries
                'Valeurs de X (toujours les mêmes quelque soit l'index du graphique)
            ActiveChart.SeriesCollection(3).XValues = "=DATA!R" & A & "C2:R" & B & "C2"
                'Valeurs de Y
            ActiveChart.SeriesCollection(3).Values = "=DATA!R" & A & "C4:R" & B & "C4"
        'Série 4 (T2)
            ActiveChart.SeriesCollection.NewSeries
                'Valeurs de X (toujours les mêmes quelque soit l'index du graphique)
            ActiveChart.SeriesCollection(4).XValues = "=DATA!R" & A & "C2:R" & B & "C2"
                'Valeur de Y
            ActiveChart.SeriesCollection(4).Values = "=DATA!R" & A & "C8:R" & B & "C8"
    'Titres des séries de données
        ActiveChart.SeriesCollection(1).Name = "=""P1(bar)"""
        ActiveChart.SeriesCollection(2).Name = "=""P2(bar)"""
        ActiveChart.SeriesCollection(3).Name = "=""T1(°C)"""
        ActiveChart.SeriesCollection(4).Name = "=""T2(°C)"""
        ActiveChart.Location Where:=xlLocationAsObject, Name:="Summary"
    'Titre du graphique et des axes
        With ActiveChart
            .HasTitle = True
            .ChartTitle.Characters.Text = TitlePT
            .Axes(xlCategory, xlPrimary).HasTitle = True
            .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Temps"
            .Axes(xlValue, xlPrimary).HasTitle = True
            .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Bar | °C"
        End With
        ActiveChart.HasLegend = True
        ActiveChart.Legend.Select
        Selection.Position = xlRight
    'Déplacement de la zone de graphique
        ActiveSheet.ChartObjects(TitlePT).Left = Range("J1").Left
        ActiveSheet.ChartObjects(TitlePT).Top = Range("J1").Top</ital>


Merci d'avance.
0
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
Modifié par ccm81 le 15/11/2010 à 13:57
voila il y a bien une variable NameGraph déclarée qui est prévue
donc

- au moment de la creation du nouveau graphique il faut lui attribuer un nom en dur
1. NameGraph = "zzz"
2. ActiveChart.Name = NameGraph

- puis au moment du déplacement
3. ActiveSheet.ChartObjects(NameGraph).Left = Range("J1").Left

bonne suite
0
salut
Merci pour ton temps, j'ai essayé mais le probleme reste exactement le même "impossible de lire la propriete chartobject de la classe.....

Je vois pas pourquoi ça marche pas. je te renvoie le code juste pour que tu me dises si c'est bon ce que j'ai fait ou pas :
Dim TitlePT1 As String
Dim TitleQN1 As String
Dim NameGraph As String

'Affectation des numéros de ligne
A = Worksheets("Summary").Cells(5, 7).Value
B = Worksheets("Summary").Cells(6, 7).Value
TitlePT1 = Worksheets("Summary").Cells(2, 2).Value & " | P & T_1"
TitleQN1 = Worksheets("Summary").Cells(2, 2).Value & " | Q & N_1"

'Création du graphique Pression et Température
        Sheets("DATA").Select
        Charts.Add
        ActiveChart.Name = TitlePT1
        ActiveChart.ChartType = xlXYScatter
        'Série 1 (P1)
        ActiveChart.SetSourceData Source:=Sheets("DATA").Range("E" & A & ":E" & B), PlotBy _
            :=xlColumns
    'Création des nouvelles séries de données
        'Série 2 (P2)
            ActiveChart.SeriesCollection.NewSeries
                'Valeurs de X (toujours les mêmes quelque soit l'index du graphique)
            ActiveChart.SeriesCollection(1).XValues = "=DATA!R" & A & "C2:R" & B & "C2"
            ActiveChart.SeriesCollection(2).XValues = "=DATA!R" & A & "C2:R" & B & "C2"
                'Valeurs de Y
            ActiveChart.SeriesCollection(2).Values = "=DATA!R" & A & "C9:R" & B & "C9"
        'Série 3 (T1)
            ActiveChart.SeriesCollection.NewSeries
                'Valeurs de X (toujours les mêmes quelque soit l'index du graphique)
            ActiveChart.SeriesCollection(3).XValues = "=DATA!R" & A & "C2:R" & B & "C2"
                'Valeurs de Y
            ActiveChart.SeriesCollection(3).Values = "=DATA!R" & A & "C4:R" & B & "C4"
        'Série 4 (T2)
            ActiveChart.SeriesCollection.NewSeries
                'Valeurs de X (toujours les mêmes quelque soit l'index du graphique)
            ActiveChart.SeriesCollection(4).XValues = "=DATA!R" & A & "C2:R" & B & "C2"
                'Valeur de Y
            ActiveChart.SeriesCollection(4).Values = "=DATA!R" & A & "C8:R" & B & "C8"
    'Titres des séries de données
        ActiveChart.SeriesCollection(1).Name = "=""P1(bar)"""
        ActiveChart.SeriesCollection(2).Name = "=""P2(bar)"""
        ActiveChart.SeriesCollection(3).Name = "=""T1(°C)"""
        ActiveChart.SeriesCollection(4).Name = "=""T2(°C)"""
        ActiveChart.Location Where:=xlLocationAsObject, Name:="Summary"
    'Titre du graphique et des axes
        With ActiveChart
            .HasTitle = True
            .ChartTitle.Characters.Text = TitlePT1
            .Axes(xlCategory, xlPrimary).HasTitle = True
            .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Temps"
            .Axes(xlValue, xlPrimary).HasTitle = True
            .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Bar | °C"
        End With
        ActiveChart.HasLegend = True
        ActiveChart.Legend.Select
        Selection.Position = xlRight
    'Déplacement de la zone de graphique
        ActiveSheet.ChartObjects(TitlePT1).Left = Range("J1").Left
        ActiveSheet.ChartObjects(TitlePT1).Top = Range("J1").Top


Merci d'avance
0

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

Posez votre question
Ccm81,
J'ai essayé ton astuce mais ça ne fonctionne pas
Le problème reste le même

Cousinhub29
Pareil. Le problème est différent, on dirait qu'ici il ne veut même pas changer de nom ça bugge à la ligne
.ChartTitle.Characters.Text = TitlePT

...
Merci les gars de vous être penché dessus
Si vous avez d'autres idées...Sinon bah je vais sillonner le web voir si y'a pas le même souci chez quelqu'un d'autre.
0
cousinhub29 Messages postés 881 Date d'inscription mardi 10 août 2010 Statut Membre Dernière intervention 16 avril 2024 333
15 nov. 2010 à 15:03
Re-,

Scuse, enlève le .Characters en trop...
0
Testé mais rien encore : "impossible definir la propriete"
0
à le même ligne que tu m'as indiqué (chartTitle.Text = TitlePT1)
0
cousinhub29 Messages postés 881 Date d'inscription mardi 10 août 2010 Statut Membre Dernière intervention 16 avril 2024 333
15 nov. 2010 à 15:07
A quelle ligne?
0
cousinhub29 Messages postés 881 Date d'inscription mardi 10 août 2010 Statut Membre Dernière intervention 16 avril 2024 333
15 nov. 2010 à 15:15
Re-,

Si c'est pour AxisTitle, enlève également les .Characters (sur les 2 lignes)
0
non non c'est bien pour le chartTitle
0
C'est bizarre d'ailleurs que ça ne marche pas parce que ça marche bien sur mon module à moi j'ai une ligne :
.ChartTitle.Characters.Text = TitlePT1
et elle fonctionne parfaitement
0
cousinhub29 Messages postés 881 Date d'inscription mardi 10 août 2010 Statut Membre Dernière intervention 16 avril 2024 333
15 nov. 2010 à 15:21
Essaie en rajoutant la ligne

.HasTitle = True


Juste au dessus de cette ligne
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
Modifié par lermite222 le 15/11/2010 à 16:22
Bonjour tous,
J'ai resortit ça de mes archives, je n'ai pas modifié le code pour qu'il coïncide avec la question mais il fonctionne correctement avec l'avantage que l'ont peut le traiter ultérieurement avec sont nom.
Sub graphique() 
Dim graph As ChartObject 
    Set graph = Worksheets("feuil1").ChartObjects.Add(70, 6850, 430, 270) 
    graph.Name = "RRR" 
    With graph.Chart 
        .ChartType = xl3DPie 
        .SeriesCollection.NewSeries 
        .SeriesCollection(1).XValues = Worksheets("feuil1").Range("A1:A20") 
        .SeriesCollection(1).Values = Worksheets("feuil1").Range("A21:A40") 
        .SeriesCollection(1).Name = "Votre financement sur base annuelle" 
        .SeriesCollection(1).HasDataLabels = True 
        .SeriesCollection(1).DataLabels.Position = xlLabelPositionBestFit 
        .SeriesCollection(1).HasLeaderLines = True 
        .SeriesCollection(1).ApplyDataLabels Type:=xlDataLabelsShowValue, _ 
                AutoText:=True, LegendKey:=False, HasLeaderLines:=True 
        '.SeriesCollection(1).LeaderLine.Border.ColorIndex = 20 
        .HasLegend = False 
        .ChartArea.Interior.ColorIndex = xlPatternNone 
        .ChartArea.Border.ColorIndex = xlPatternNone 
        .PlotArea.Interior.ColorIndex = xlPatternNone 
        .SeriesCollection(1).ApplyDataLabels Type:=xlDataLabelsShowLabelAndPercent 
        .SeriesCollection(1).DataLabels.Font.Size = 10 
              '  .Name = "Arial" 
              '  .FontStyle = "Normal" 
              '  .Size = 12 
         
    End With 
Dim pt As Point 
    For Each pt In graph.Chart.SeriesCollection(1).Points 
        pt.Explosion = 10 
    Next pt 
End Sub

pour l'activer ultérieurement
    Chart("RRR").Activate 
'Ou... 
    With Chart("RRR") 
        ..... 

S! ça peu aider...
A+
L'expérience instruit plus sûrement que le conseil. (André Gide)
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
0
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
Modifié par ccm81 le 15/11/2010 à 18:42
autre idée
peut être un problème venant du nom attribué au graphique (TitlePT1), apparemment le caractere & provoque une erreur (chez moi)
donc si le reste de ton code fonctionne, supprimer de & dans TiTlePT1
bon courage
0
Ccm81 ton idée n'était pas bête mais ça n'a pas fonctionné. Dommage
Sinon j'ai remarqué quelque chose :
lorsque j'exécute ma macro en mode pas à pas, au niveau de la commande :
 ActiveChart.Name = "PT_1" 
(ici j'ai changé un peu mais l'esprit reste le même)
le graph est bien nommé PT_1
mais lorsque plus tard je réactive le graphique avec le :
With ActiveChart
...
...
...
End with

le nom du graphique change et devient
ActiveChart.Name = "Summary Graphique 77"


Donc le problème doit venir du With....End With

Sinon pour la création du graphique directement avec :
Dim c As ChartObject
Set c = Sheets("DATA").ChartObjects.Add(Range("J1").Left, Range("J1").Top, 300, 200)
With c.Chart
    .ChartType = xlXYScatter
    .SetSourceData Source:=Sheets("DATA").Range("E" & A & ":E" & B), PlotBy _
            :=xlColumns
    .SeriesCollection.NewSeries
    .SeriesCollection(1).XValues = "=DATA!R" & A & "C2:R" & B & "C2"
    .SeriesCollection(2).XValues = "=DATA!R" & A & "C2:R" & B & "C2"
    .SeriesCollection(2).Values = "=DATA!R" & A & "C9:R" & B & "C9"
    .SeriesCollection.NewSeries
    .SeriesCollection(3).XValues = "=DATA!R" & A & "C2:R" & B & "C2"
    .SeriesCollection(3).Values = "=DATA!R" & A & "C4:R" & B & "C4"
    .SeriesCollection.NewSeries
    .SeriesCollection(4).XValues = "=DATA!R" & A & "C2:R" & B & "C2"
    .SeriesCollection(4).Values = "=DATA!R" & A & "C8:R" & B & "C8"
    .SeriesCollection(1).Name = "=""P1(bar)"""
    .SeriesCollection(2).Name = "=""P2(bar)"""
    .SeriesCollection(3).Name = "=""T1(°C)"""
    .SeriesCollection(4).Name = "=""T2(°C)"""
    .ChartTitle.Characters.Text = TitlePT
    .Axes(xlCategory, xlPrimary).HasTitle = True
    .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Temps"
    .Axes(xlValue, xlPrimary).HasTitle = True
    .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Bar | °C"
    .Legend.Position = xlRight
End With


Ca ne marche pas, le code ne comporte pas de bug mais rien ne se passe...
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
Modifié par lermite222 le 16/11/2010 à 10:19
Re,
Tu ne nomme pas le graph..
Set c = Sheets("DATA").ChartObjects.Add(Range("J1").Left, Range("J1").Top, 300, 200)  
c.Name = "PT_1"  

et après,
With  Sheets("DATA").Shape("PT_1") 
... 
... 
... 
End with

J'ai testé tes premières lignes et chez moi le graph se crée normalement, ensuite comme je n'ai pas tes données... ça va plus.
A+
L'expérience instruit plus sûrement que le conseil. (André Gide)
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
0
Voila ce que j'ai mis :
Dim TitlePT1 As String
Dim TitleQN1 As String
Dim NameGraph As String

A = Worksheets("Summary").Cells(5, 7).Value
B = Worksheets("Summary").Cells(6, 7).Value
TitlePT1 = Worksheets("Summary").Cells(2, 2).Value & " | P & T_1"
TitleQN1 = Worksheets("Summary").Cells(2, 2).Value & " | Q & N_1"

Dim GraphPT1 As ChartObject
Set GraphPT1 = Sheets("DATA").ChartObjects.Add(Range("J1").Left, Range("J1").Top, 300, 200)
GraphPT1.Name = "PT_1" e ' Le graph ne se crée toujours pas
With GraphPT1.Chart
    .ChartType = xlXYScatter
    .SetSourceData Source:=Sheets("DATA").Range("E" & A & ":E" & B), PlotBy _
            :=xlColumns
    .SeriesCollection.NewSeries
    .SeriesCollection(1).XValues = "=DATA!R" & A & "C2:R" & B & "C2"
    .SeriesCollection(2).XValues = "=DATA!R" & A & "C2:R" & B & "C2"
    .SeriesCollection(2).Values = "=DATA!R" & A & "C9:R" & B & "C9"
    .SeriesCollection.NewSeries
    .SeriesCollection(3).XValues = "=DATA!R" & A & "C2:R" & B & "C2"
    .SeriesCollection(3).Values = "=DATA!R" & A & "C4:R" & B & "C4"
    .SeriesCollection.NewSeries
    .SeriesCollection(4).XValues = "=DATA!R" & A & "C2:R" & B & "C2"
    .SeriesCollection(4).Values = "=DATA!R" & A & "C8:R" & B & "C8"
    .SeriesCollection(1).Name = "=""P1(bar)"""
    .SeriesCollection(2).Name = "=""P2(bar)"""
    .SeriesCollection(3).Name = "=""T1(°C)"""
    .SeriesCollection(4).Name = "=""T2(°C)"""
    .HasTitle = True
    .ChartTitle.Text = TitlePT1
    .Axes(xlCategory, xlPrimary).HasTitle = True
    .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Temps"
    .Axes(xlValue, xlPrimary).HasTitle = True
    .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Bar | °C"
    .Legend.Position = xlRight
End With

Mais en faisant un pas à pas sur les promières lignes comme indiqué dans le code le graph ne se crée toujours pas....
0
Au temps pour moi...(ou "Autant pour moi", la grammaire française n'est pas claire à ce sujet)

Le graph se crée bien
Je regardai sur la mauvaise feuille....j'ai honte
0