Source de données graphique

Bonjour à tous,

Je génère en VBA 6 graphiques sur une feuille ("DM") qui fait référence à un tableau d'une autre feuille ("D7").

Le truc, c'est que chaque graphique prends tout le tableau comme source de données et donc j'ai beaucoup trop de lignes sur le graphique, le rendant illisible.

Je cherche a écrire "ma source de données est : la première ligne du tableau (pour les abscisses), la ligne dont la valeur en colonne A est égale à Expert (variable String) et les 2 dernières lignes de mon tableau"

Mais je n'arrive pas à trouver de bon cours sur la manipulation des tableaux et du coup je ne sais pas comment je pourrais coder cette phrase...

Je connais le nom de mon tableau,

Ma première ligne = Tableau1[0].Value ?

La dernière ligne = Tableau1[Tableau1.Count-1] ?

L'avant dernière ligne = Tableau1[Tableau1.Count-2] ?

La ligne concernant l'expert = Tableau1[... ??

L'autre soucis que je rencontre, c'est que ma première ligne du tableau (qui représentent les mois de l'année) est traduite graphiquement par son chiffre (au lieu d'avoir janvier, février, mars... j'ai 1, 2, 3, etc.)

Une petite solution ?

Sub CreerGraph(Titre As String, Tableau As String, Expert As String)

Dim NbGraph As Integer
Dim Coords As String
Dim MaPlage As String

'On compte le nombre de graphique sur la page pour connaitre la position du graph en cours de creation
NbGraph = Sheets(Expert).ChartObjects.Count

Select Case NbGraph
Case Is = 0
    Coords = "A1"
Case Is = 1
    Coords = "H1"
Case Is = 2
    Coords = "A16"
Case Is = 3
    Coords = "H16"
Case Is = 4
    Coords = "A31"
Case Is = 5
    Coords = "H31"
Case Is = 6
    Coords = "D46"
End Select

' Identification des données
MaPlage = ""

'tracer le graphique
Charts.Add
ActiveChart.Location _
where:=xlLocationAsObject, name:=Expert
With ActiveChart
.SetSourceData Source:=Sheets("Recap").Range(Tableau), PlotBy:=xlRows
.ChartType = xlLine
.HasTitle = True
.ChartTitle.Characters.Text = Titre & " - " & Sheets("Résultats").Range("B10").Value
.Axes(xlCategory, xlPrimary).HasTitle = False
.Axes(xlValue, xlPrimary).HasTitle = False
.PlotArea.Interior.ColorIndex = 2
.Axes(xlValue).MajorGridlines.Border.LineStyle = xlDot
.ChartArea.Font.Size = 6
End With

With ActiveSheet.ChartObjects(NbGraph + 1)
.Left = Range(Coords).Left
.Top = Range(Coords).Top
End With
End Sub

Merci d'avance


Petit changement à prendre en considération :

Mon tableau a été généré en utilisant un style.

Donc ma première ligne est en fait déjà des données.

L'abscisse doit correspondre aux en-tête du tableau

J'ai essayé certaines choses, mais j'ai une erreur 1004 : Erreur définie par l'application ou par l'objet.

La ligne qui pose problème est :

.SetSourceData Source:=Sheets("Recap").Range(MaPlage), PlotBy:=xlRows

(MaPlage est un String sous forme "Recap!A1:A12;Recap!B1:B12;Recap!D1:D12;Recap!E1:E12")

Et son environnement est le suivant :

Dim PremiereLigne As String
Dim LigneExpert1 As String
Dim AvtDerLigne As String
Dim DerLigne As String
Dim begin As String
Dim fin As String

Sheets("Recap").Select
Range(Tableau).Select

PremiereLigne = Sheets("Recap").ListObjects(Tableau).HeaderRowRange.Address

ActiveSheet.ListObjects(Tableau).ListRows(Cle + 1).Range.Select
LigneExpert = Selection.Address

With Sheets("Recap")
      .ListObjects(Tableau).ListRows(Range(Tableau).Rows.Count - 1).Range.Select
End With
AvtDerLigne = Selection.Address

With Sheets("Recap")
      .ListObjects(Tableau).ListRows(Range(Tableau).Rows.Count).Range.Select
End With
DerLigne = Selection.Address

MaPlage = "Recap!" & DerLigne & ";Recap!" & LigneExpert & ";Recap!" & AvtDerLigne & ";Recap!" & PremiereLigne

'tracer le graphique
Charts.Add
ActiveChart.Location _
where:=xlLocationAsObject, name:=Expert
With ActiveChart
.SetSourceData Source:=Sheets("Recap").Range(MaPlage), PlotBy:=xlRows
.ChartType = xlLine
.HasTitle = True
.ChartTitle.Characters.Text = Titre & " - " & Sheets("Résultats").Range("B10").Value
.Axes(xlCategory, xlPrimary).HasTitle = False
.Axes(xlValue, xlPrimary).HasTitle = False
.PlotArea.Interior.ColorIndex = 2
.Axes(xlValue).MajorGridlines.Border.LineStyle = xlDot
.ChartArea.Font.Size = 6
End With

With ActiveSheet.ChartObjects(NbGraph + 1)
.Left = Range(Coords).Left
.Top = Range(Coords).Top
End With

Des idées ?

Bonjour,

Un fichier?

Cdlt.

Bonjour, je viens enfin de trouver une solution !

Au lieu de chercher à créer un nouveau tableau de données, j'ai en fait supprimé les données qui ne intéressaient pas !

C'est du bidouillage, mais ça donne un truc dans ce genre :

Sub CreerGraph(Titre As String, Tableau As String, Expert As String, Cle As Integer)

Dim NbGraph As Integer
Dim Coords As String
Dim MaPlage As String
Dim LigneExpert As String

'On compte le nombre de graphique sur la page pour connaitre la position du graph en cours de creation
NbGraph = Sheets(Expert).ChartObjects.Count

Select Case NbGraph
Case Is = 0
    Coords = "A1"
Case Is = 1
    Coords = "H1"
Case Is = 2
    Coords = "A16"
Case Is = 3
    Coords = "H16"
Case Is = 4
    Coords = "A31"
Case Is = 5
    Coords = "H31"
Case Is = 6
    Coords = "D46"
End Select

'Sheets("Recap").Select
'Range(Tableau).Select

Charts.Add
ActiveChart.Location _
where:=xlLocationAsObject, name:=Expert
With ActiveChart
'C'est le [#ALL] qui permet de prendre en compte les en tête d'un tableau
.SetSourceData Source:=Sheets("Recap").Range(Tableau & "[#ALL]"), PlotBy:=xlRows
.ChartType = xlLine
.HasTitle = True
.ChartTitle.Characters.Text = Titre & " - " & Sheets("Résultats").Range("B10").Value
.Axes(xlCategory, xlPrimary).HasTitle = False
.Axes(xlValue, xlPrimary).HasTitle = False
.PlotArea.Interior.ColorIndex = 2
.Axes(xlValue).MajorGridlines.Border.LineStyle = xlDot
.ChartArea.Font.Size = 6
End With

Dim d As Integer

For d = 0 To Sheets("D7").Range("Y4:Y" & Range("Y65536").End(xlUp).Row).Count - 1
    If d = Cle Then
        ActiveChart.SeriesCollection(2).Delete
    Else:
    If d < Cle Then
        ActiveChart.SeriesCollection(1).Delete
    Else
        ActiveChart.SeriesCollection(2).Delete
    End If
    End If
Next

With ActiveSheet.ChartObjects(NbGraph + 1)
.Left = Range(Coords).Left
.Top = Range(Coords).Top
End With
End Sub

Merci quand même

Rechercher des sujets similaires à "source donnees graphique"