[VBA] Graphique dynamique
guinpin
-
lermite222 Messages postés 9042 Statut Contributeur -
lermite222 Messages postés 9042 Statut Contributeur -
Bonjour, le forum!
Je rencontre actuellement un petit problème concernant un graphique. Je souhaite, à chaque affichage du graphique, qu'une colonne donnant un pourcentage soit ajoutée, et en abscisse que la date soit marquée.
Ne sachant pas trop comment résonner, j'ai utilisé une feuille "cachée" dans laquelle je rentre mes données à chaque actualisation, et mon graphique est créé en se basant uniquement sur ces données.
Jusque la tout va bien. C'est dans la création du graphique que tout pêche...
Je me suis renseigné sur un site qui disait que pour créer un graphique, il était bon de passer par des tableaux, ce que j'ai fait, puis par des SeriesCollection.
Cependant une série est ajoutée à chaque utilisation, ce qui ne correspond pas vraiment à mon ajout d'une seule colonne :(
Voila mon code à l'heure actuelle (désolé pour les puristes, je débute donc c'est très moche):
Sub ActuGraph()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For Each x In Sheets
If x.name = "GraphPapet" Then x.Delete
Next
For Each x In Sheets
If x.name = "GraphTransfo" Then x.Delete
Next
Application.DisplayAlerts = True
Sheets("Feuil1").Visible = True
Sheets("Feuil1").Select
Range("D3").Select
Dim Y As Object
Dim tabl() As Integer
Dim table() As Variant
Dim i As Integer
Dim j As Integer
i = 0
j = 1
Dim myrange As Range
Dim monrange As Range
Dim Datarange As Range
While ActiveCell.Value <> ""
ActiveCell.Offset(0, 1).Select
i = i + 1
Wend
ActiveCell.Value = Range("Résultats!N7").Value
ReDim table(i)
ReDim tabl(i)
For j = 1 To UBound(tabl)
tabl(j) = ActiveCell.Offset(i + 1 - j, 0).Value
table(j) = ActiveCell.Offset(i + 1 - j, 0).Value
Next j
tabl(i) = ActiveCell.Value
table(i) = ActiveCell.Offset(1, 0).Value
ActiveCell.Offset(1, 0).Value = Range("Résultats!N56").Value
ActiveCell.Offset(2, 0).Value = Date
'Set myrange = Range(Cells(3, 4), ActiveCell)
'Set Datarange = Range(Cells(5, 4), ActiveCell.Offset(2, 0))
Charts.Add
ActiveChart.ChartType = xlColumnClustered
'ActiveChart.SetSourceData Source:=myrange, PlotBy _
':=xlColumns
'ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(1).XValues = table()
ActiveChart.SeriesCollection(1).Values = tabl()
ActiveChart.name = "GraphPapet"
'Sheets("Feuil1").Select
'ActiveCell.Offset(1, 0).Select
'Set monrange = Range(Cells(4, 4), ActiveCell)
'Charts.Add
''ActiveChart.ChartType = xlColumnClustered
'ActiveChart.SetSourceData Source:=monrange, PlotBy _
':=xlColumns
'ActiveChart.name = "GraphTransfo"
'Sheets("Feuil1").Visible = False
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
Toute proposition de modification est la bienvenue :)
Cordialement
guinpin
Je rencontre actuellement un petit problème concernant un graphique. Je souhaite, à chaque affichage du graphique, qu'une colonne donnant un pourcentage soit ajoutée, et en abscisse que la date soit marquée.
Ne sachant pas trop comment résonner, j'ai utilisé une feuille "cachée" dans laquelle je rentre mes données à chaque actualisation, et mon graphique est créé en se basant uniquement sur ces données.
Jusque la tout va bien. C'est dans la création du graphique que tout pêche...
Je me suis renseigné sur un site qui disait que pour créer un graphique, il était bon de passer par des tableaux, ce que j'ai fait, puis par des SeriesCollection.
Cependant une série est ajoutée à chaque utilisation, ce qui ne correspond pas vraiment à mon ajout d'une seule colonne :(
Voila mon code à l'heure actuelle (désolé pour les puristes, je débute donc c'est très moche):
Sub ActuGraph()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For Each x In Sheets
If x.name = "GraphPapet" Then x.Delete
Next
For Each x In Sheets
If x.name = "GraphTransfo" Then x.Delete
Next
Application.DisplayAlerts = True
Sheets("Feuil1").Visible = True
Sheets("Feuil1").Select
Range("D3").Select
Dim Y As Object
Dim tabl() As Integer
Dim table() As Variant
Dim i As Integer
Dim j As Integer
i = 0
j = 1
Dim myrange As Range
Dim monrange As Range
Dim Datarange As Range
While ActiveCell.Value <> ""
ActiveCell.Offset(0, 1).Select
i = i + 1
Wend
ActiveCell.Value = Range("Résultats!N7").Value
ReDim table(i)
ReDim tabl(i)
For j = 1 To UBound(tabl)
tabl(j) = ActiveCell.Offset(i + 1 - j, 0).Value
table(j) = ActiveCell.Offset(i + 1 - j, 0).Value
Next j
tabl(i) = ActiveCell.Value
table(i) = ActiveCell.Offset(1, 0).Value
ActiveCell.Offset(1, 0).Value = Range("Résultats!N56").Value
ActiveCell.Offset(2, 0).Value = Date
'Set myrange = Range(Cells(3, 4), ActiveCell)
'Set Datarange = Range(Cells(5, 4), ActiveCell.Offset(2, 0))
Charts.Add
ActiveChart.ChartType = xlColumnClustered
'ActiveChart.SetSourceData Source:=myrange, PlotBy _
':=xlColumns
'ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(1).XValues = table()
ActiveChart.SeriesCollection(1).Values = tabl()
ActiveChart.name = "GraphPapet"
'Sheets("Feuil1").Select
'ActiveCell.Offset(1, 0).Select
'Set monrange = Range(Cells(4, 4), ActiveCell)
'Charts.Add
''ActiveChart.ChartType = xlColumnClustered
'ActiveChart.SetSourceData Source:=monrange, PlotBy _
':=xlColumns
'ActiveChart.name = "GraphTransfo"
'Sheets("Feuil1").Visible = False
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
Toute proposition de modification est la bienvenue :)
Cordialement
guinpin
A voir également:
- [VBA] Graphique dynamique
- Changer carte graphique - Guide
- Tableau croisé dynamique - Guide
- Exemple tableau croisé dynamique télécharger - Télécharger - Tableur
- Graphique sparkline - Guide
- Liste déroulante dynamique excel - Guide
2 réponses
Bonjour,
J'ai réussi à bricoler un petit quelque chose via l'enregistreur de macros, cependant il me reste un tout petit rien à modifier :$
Je crée un ensemble de séries qui marche très bien, ca me donne le résultat escompté, mais je n'arrive pas à bien fixer les plages de données de chacunes d'elles.
Je m'explique: sur la ligne 1, j'ai un tableau de pourcentages dans lequel, à chaque affichage du graphique, une colonne est ajoutée donnant le pourcentage actuel.
Sur la ligne trois, j'inscrit la date de l'actualiation.
J'ai donc un nombre variable de séries (auquel j'ai accès via un compteur), et je défini les valeurs de chacunes d'elles dans une boucle for. Or, la syntaxe selon l'enregistreur est la suivante:
ActiveChart.SeriesCollection(1).name = "='Feuil1'!$D$5"
Comment puis-je adapter celà pour un valeur variable du numéro de colonne? :$
Merci
Cordialement,
guinpin
J'ai réussi à bricoler un petit quelque chose via l'enregistreur de macros, cependant il me reste un tout petit rien à modifier :$
Je crée un ensemble de séries qui marche très bien, ca me donne le résultat escompté, mais je n'arrive pas à bien fixer les plages de données de chacunes d'elles.
Je m'explique: sur la ligne 1, j'ai un tableau de pourcentages dans lequel, à chaque affichage du graphique, une colonne est ajoutée donnant le pourcentage actuel.
Sur la ligne trois, j'inscrit la date de l'actualiation.
J'ai donc un nombre variable de séries (auquel j'ai accès via un compteur), et je défini les valeurs de chacunes d'elles dans une boucle for. Or, la syntaxe selon l'enregistreur est la suivante:
ActiveChart.SeriesCollection(1).name = "='Feuil1'!$D$5"
Comment puis-je adapter celà pour un valeur variable du numéro de colonne? :$
Merci
Cordialement,
guinpin
Bonjour,
Il n'est pas nécessaire de créer un Graph à chaque fois si c'est pour uniquement l'actualiser au nombre de données.
Exemple :
Sur Feuil1 rapatrier les données (par formule ou copîer/coller) en C1:D1
pour les abscisses rapatrier les données en C2:D2
Crée manuellement un graph comme souhaiter et donner les plages C1:D1 pour source et C2:D2 pour abscisse
quand c'est fait.
Ajoute des données en E1 et E2 et lance la macro..
Juste changer le nom du graph.
A+
Il n'est pas nécessaire de créer un Graph à chaque fois si c'est pour uniquement l'actualiser au nombre de données.
Exemple :
Sur Feuil1 rapatrier les données (par formule ou copîer/coller) en C1:D1
pour les abscisses rapatrier les données en C2:D2
Crée manuellement un graph comme souhaiter et donner les plages C1:D1 pour source et C2:D2 pour abscisse
quand c'est fait.
Ajoute des données en E1 et E2 et lance la macro..
Sub ActuGraph()
Dim DerColonne As Integer
DerColonne = Range("C1").End(xlToRight).Column
ActiveSheet.ChartObjects("Graphique 1").Activate
ActiveChart.SetSourceData Source:=Range(Cells(1, 3), Cells(1, DerColonne))
ActiveChart.SeriesCollection(1).XValues = Range(Cells(2, 3), Cells(2, DerColonne))
End Sub
Juste changer le nom du graph.
A+