Générer graphique (macro)
Bonjour,
si possible je fais appel à votre aide pour générer un graphique à partir de données stockées dans une base se trouvant dans le même classeur. Je joins le fichier à ce message.
Les feuilles qui nous intéressent sont celles intitulées "2013" et "Feuil3".
La feuille Feuil3 possède un bouton accroché à la macro que l'on doit créer ainsi qu'une liste déroulante (en jaune).
La feuille 2013 est la base avec des noms de captages en colonne C, des dates sur la ligne 2 et les données associées.
La manip est la suivante : on choisit un captage dans la liste déroulante et la macro nous génère un graphique en nuage de point (reliés par des lignes) à l'emplacement signalé par un cadre bleu en feuille "Feuil3" des données en abscisse et des dates en ordonnées que l'on retrouve dans la feuille "2013". Et l'idée est de ne pas prendre en compte les cellules vides.
Vous verrez j'ai démarré un bout de code mais inefficace pour le moment.
Merci d'avance pour votre aide.
Olivier
Bonjour,
réponse retirée car sans relation avec le prolème posé
Bonjour,
merci pour ta réponse.
A vrai dire j'ai du mal à savoir quoi faire de ce bout de code, j'ai essayé de le copier/coller dans une fenêtre VB mais ça me dit que le "Me" est mal utilisé. Tu parles d'un textbox mais...lequel? (parles tu du commandButton de mon fichier excel??).
Idem pour l'utilisation de la séquence, je ne sais même pas ce que ça veut dire.
Bref, vraiment merci de m'aider mais avec quelques explications supplémentaires ça serait chouette
A+
Oliv
bonjour et désolé,
ceci m'a tout l'air 'd'être une réponse à un autre message.
toutes mes excuses !
Ah ok...
Pas grave, au moins je comprends mieux mon incompréhension!
A+
bonjour,
essaie ceci
Sub graph_source()
Set wsf3 = Worksheets("Feuil3")
Set ws2013 = Worksheets("2013")
captage = wsf3.Range("A3")
dl2013 = ws2013.Range("C" & Rows.Count).End(xlUp).Row
lc = ws2013.Cells(2, Columns.Count).End(xlToLeft).Column
Set re = ws2013.Range("C1:C" & dl2013).Find(captage, lookat:=xlWhole)
If Not re Is Nothing Then
colc = 0
wsf3.Rows("30:31").Delete
For i = 8 To lc
If ws2013.Cells(re.Row, i) <> "" Then
colc = colc + 1
wsf3.Cells(30, colc) = ws2013.Cells(2, i)
wsf3.Cells(30, colc).NumberFormat = "dd/mm"
wsf3.Cells(31, colc) = ws2013.Cells(re.Row, i)
End If
Next i
If colc > 0 Then
rgc = wsf3.Cells(30, 1).Address & ":" & wsf3.Cells(31, colc).Address
Set donneecell = wsf3.Range(rgc)
For i = 0 To wsf3.ChartObjects.Count - 1
On Error Resume Next
wsf3.ChartObjects(i).Delete
on error goto 0
Next i
Set ch = wsf3.Shapes.AddChart
rgg = "A5:D20"
With wsf3.ChartObjects(1)
.Top = wsf3.Range(rgg).Top
.Left = wsf3.Range(rgg).Left
.Height = wsf3.Range(rgg).Height
.Width = wsf3.Range(rgg).Width
.Placement = xlMove
End With
ch.Select
ActiveChart.ChartType = xlXYScatterSmooth
ActiveChart.SetSourceData Source:=donneecell
ActiveChart.PlotVisibleOnly = True
Else
MsgBox "pas de données pour ce captage"
End If
Else
MsgBox "captage non trouvé"
End If
End Subbonjour,
code adapté, une meilleure gestion des erreurs liées à la créarion du graphique
Sub graph_source()
' wsf3 identifiatnn feuil3
Set wsf3 = Worksheets("Feuil3")
'ws2013 identifiant feuille 2013
Set ws2013 = Worksheets("2013")
' mémoriser captage choisi via liste déroulante
captage = wsf3.Range("A3")
' dl2013 dernière ligne utilise de feuille 2013
dl2013 = ws2013.Range("C" & Rows.Count).End(xlUp).Row
' ld dernière colonne utile de feuille 2013 (basée sur la ligne des dates
lc = ws2013.Cells(2, Columns.Count).End(xlToLeft).Column
' on rechercher le captage dans la feuille 2013, resultat dans l'objet re
Set re = ws2013.Range("C1:C" & dl2013).Find(captage, lookat:=xlWhole)
If Not re Is Nothing Then
' on a trouvé le captage, on va copier les données de captage qui existent, sur le feuil 3 en ligne 30 et 31
' colc pointeur de données de captage pour ce captage
colc = 0
' on nettoie la zone de réception des données (on enlève les données précédentes éventuelles
wsf3.Rows("30:31").Delete
' on passe en revue toutes les dates
For i = 8 To lc
' s'l y a une donnée pour la date
If ws2013.Cells(re.Row, i) <> "" Then
' on ajoute la date et la donnée en ligne 30 et 31 sur feuil3, avec le bon format
colc = colc + 1
wsf3.Cells(30, colc) = ws2013.Cells(2, i)
wsf3.Cells(30, colc).NumberFormat = "dd/mm"
wsf3.Cells(31, colc) = ws2013.Cells(re.Row, i)
End If
Next i
' si on a trouvé des données on peut faire le graphique
If colc > 0 Then
' rgc = plage de données pour le graphique ligne 30 et 31 limité aux nombres de données en colonne
rgc = wsf3.Cells(30, 1).Address & ":" & wsf3.Cells(31, colc).Address
Set donneecell = wsf3.Range(rgc)
On Error GoTo terreur
erreur = False
'on ouvre l'objet chart s'il existe
Set ch = wsf3.ChartObjects(1)
On Error GoTo 0
If erreur Then
's'il n'existe pas on le crée
Set ch = wsf3.Shapes.AddChart
End If
' on definit la plage (rgg) sur laquelle positionner le graphique et on adapte les dimensions du graphique à cette plage
rgg = "A5:D20"
With wsf3.ChartObjects(1)
.Top = wsf3.Range(rgg).Top
.Left = wsf3.Range(rgg).Left
.Height = wsf3.Range(rgg).Height
.Width = wsf3.Range(rgg).Width
.Placement = xlMove
End With
ch.Select
' on definit le graphique
ActiveChart.ChartType = xlXYScatterSmooth
ActiveChart.SetSourceData Source:=donneecell
ActiveChart.PlotVisibleOnly = True
Else
' si colc=0
MsgBox "pas de données pour ce captage"
End If
Else
'si objet re est vide
MsgBox "captage non trouvé"
End If
Exit Sub
terreur:
' traitement d'erreur pour la création du graphique
erreur = True
Resume Next
End SubSalut,
c'est excellent. Je te remercie.
Je pense pouvoir faire des adaptations de code par la suite au besoin, mais pour un débutant comme moi, la base que tu me donnes est plus que suffisante.
Merci beaucoup. Tu as répondu au bon sujet cette fois et de belle manière
Bonjour,
commentaires ajoutés dans le code du message précédent.
Yes avec les commentaires c'est encore mieux.
Merci encore.