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