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 Sub

bonjour,

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 Sub

Salut,

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.

Rechercher des sujets similaires à "generer graphique macro"