Se connecter avec
S'enregistrer | Connectez-vous

Macro pour changer les dates de reférence d'un graph

Dernière réponse : dans Programmation

Bonjour à tous,

Je suis débutant sur vba et les macros, mais je dois (dans le cadre d'un stage), faire une macro qui m'a l'air complexe pour moi...

J'ai déjà chercher dans les anciens messages du forum mais je n'ai hélas rien trouvé

Le problème est le suivant:

J'ai une feuille excel avec beaucoup de graphs et les données associées à ces graphs en dessous. Je dois faire une macro pour me permettre d'afficher ces graphiques que pour une certaine période ( j'ai des donnés pour les 10 dernieres années). Il faudrait donc qu'en mettant la date du début et de fin de la période qui m'interresse, le graphique se redimmensionne en n'affichant que la période qui m'interesse.

Je ne sais pas si j'ai été très clair, mais j'ai vraiment besoin d'aide.

Merci d'avance

Matthieu
Lassé par la pub ? Créez un compte
Expert Programmation

Salut,

Si tu es en stage, c'est que tu y es pour apprendre. Je ne vais donc pas te donner la solution. Mais je vais t'aider à la trouver.

T'es d'accord ?

Alors, à l'aide de l'enregistreur de macro, crée un petit graphe sur des données de test. Vois-tu dans le code produit par l'enregistreur où se situe l'affectation des données ? C'est en te servant de cette méthode que tu pourras restreindre l'étendue des données de tes graphes.

Publie ici (relis bien le règlement pour ne pas commettre d'impair ;)  ) le code obtenu, qu'on s'en serve comme support.

Bonjour Zeb,

Je crois que tu as (hélas) un peu raison, j'ai donc fait ce que tu m'as dit et j'obtiens le code suivant:

  1. Range("A12:N13").Select
  2. ActiveSheet.Shapes.AddChart.Select
  3. ActiveChart.SetSourceData Source:=Range("'Sheet1'!$A$12:$N$13")
  4. ActiveChart.ChartType = xlLine


J'avais essayer hier quelque chose d'autre en enregistrant une macro oú je changeais la source du graphique et après j'ai regardé ce que cela donnait... Mais le truc que je n'arrive vraiement pas à comprendre c'est comment faire pour que, en entrant une date, la macro aille chercher cette date sur la ligne des dates et commence à partir de cette date....

Merci d'avance



Expert Programmation

Alors d'après ton code, il faut référencer un graphique et lui appliquer la méthode SetSourceData(). Bon, personnellement, plutôt que de les pointer à la souris et de laisser le système faie sur l'objet actif, je préfère être plus précis. Seulement, il faut connaître le nom de chaque graphique.

  1. Worksheets("Sheet1").ChartObjets("Graphique 1").Chart.SetSourceData Source:=Range("'Sheet1'!A12:N13")


Comment, tu ne connais pas le nom de tous tes graphiques ?
En voici la liste :
  1. Dim co As ChartObject
  2. Dim s As String
  3.  
  4. s = "La liste des graphique de la feuille 1"
  5. For Each co In Worksheets(1).ChartObjects
  6. s = s & vbCrLf & " * " & co.Name
  7. Next
  8. MsgBox s


  1. zone = "A12:N13"
  2. Worksheets("Sheet1").ChartObjets("Graphique 1").Chart.SetSourceData Source:=Range("'Sheet1'!" & zone)


Bon, donc en fait, il juste faut fabriquer la chaîne zone.
Pour cela, il suffit de parcourir tes données...

T'as une idée de comment faire ?

Bonjour,

Désole de ma réponse tardive mais c'était la folie au bureau!
Merci beaucoup de ta réponse, j'ai regardé comment faire mais en faite je crois que je comprend pas très bien l'histoire des noms de graphiques.... Donc forcement je ne vois pas non plus comment faire pour la chaine zone.

Parce que effectivement, ce que je veux créer c'est pour ne pas avoir à pointer la souris.

Mais dans l'ensemble, j'avoue que je suis totalement perdu...

Expert Programmation

Oki. Pour me suivre, pars d'un classeur vide. Exécute le code La liste des graphique. Tu obtiens exactement rien. C'est normal :spamafote: 

Bon, maintenant, écris un peu de données dans le premier onglet, et crée un graphique basé sur ces données dans cet onglet. Réexécute le code La liste des graphique. Tu obtiens un nom de graphique que tu n'as pourtant pas donné explicitement.

Donc première difficulté, soit se servir des noms qu'Excel donne à ses graphiques, soit décider nous-même de ces noms.

Comprends-tu ce premier problème ?

ok, quand j'excute cette macro, excel m'envoie un message avec la liste des graphiques de la feuille. Effectivement, il donne des noms que je n'ai pas du tout mis.

Il faudrait donc qu'à un moment donné il me demande le nom du graphique que je veux transformer pour au'il aille choisire les bonnes données ou quelque chose comme ca?
Expert Programmation

Ah... En voilà un qui à tout compris ! :D 

Donc maintenant, il va falloir identifier quel(s) graphique(s) tu veux changer.
Moi, je serais partisan d'imposer des noms explicites à chaque graphe.

Voilà comment l'enregistreur de macro voit la création d'un graphe tout bête :
  1. Charts.Add
  2. ActiveChart.ChartType = xlColumnClustered
  3. ActiveChart.SetSourceData Source:=Sheets("Feuil1").Range("A12:N13"), PlotBy:=xlRows
  4. ActiveChart.Location Where:=xlLocationAsObject, Name:="Feuil1"

Le revoilà à faire confiance au fait qu'un objet plutôt qu'un autre est actif. (Il m'énerve cet enregistreur de macro :fou:  )
  1. Dim ch As Chart
  2. Set ch = Charts.Add
  3. ch.ChartType = xlColumnClustered
  4. ch.SetSourceData Source:=Sheets("Feuil1").Range("A12:N13"), PlotBy:=xlRows
  5. ch.Location Where:=xlLocationAsObject, Name:="Feuil1"
J'utilise une variable - C'est quand même plus "informatique" - que j'initialise au moment de la création.
J'exécute ce code pas-à-pas. Et je m'aperçois qu'il fabrique un onglet de type Chart et qu'à la ligne 5, il transforme mon onglet en objet de feuille :pfff: 

On va réécrire tout ça, avec un objet ChartObjet, directement !
  1. Dim sh As Worksheet
  2. Dim co As ChartObject
  3.  
  4. Set sh = Worksheets(1)
  5.  
  6. Set co = sh.ChartObjects.Add(100, 100, 200, 100)
  7. co.Name = "Un graphe pour Matthieu"
  8. co.Chart.ChartType = xlColumnClustered
  9. co.Chart.SetSourceData Source:=sh.Range("A12:N13"), PlotBy:=xlRows

Ah, c'est pas mal hein ? Et surtout, on a nommé nous même notre graphe. Comme ça, on peut changer la plage des données facilement :

  1. Dim sh As Worksheet
  2. Dim co As ChartObject
  3.  
  4. Set sh = Worksheets(1)
  5.  
  6. Set co = sh.ChartObjects("Un graphe pour Matthieu")
  7. co.Chart.SetSourceData Source:=sh.Range("A12:B13")


Et voilà :bounce: 

------------------------------------

Bon, évidemment, il faut avoir nommé soi-même ses graphes à la création, d'une part, et surtout, il faut avoir des noms uniques. :spamafote: 

Or, donc, comment nommé ses graphes quand ils sont déjà créés ?
Voià une question intéressante.

Je te laisse chercher un peu. Tu as presque tous les éléments. Il faut :
  • Savoir parcourir tous les graphes (cf. La liste des graphique de la feuille 1)
  • Savoir en sélectionner un (l'enregistreur t'a montré comment faire)
  • Savoir afficher le nom actuel du graphe
  • Savoir demander à l'utilisateur d'en changer (ah, j'ai encore des choses à t'apprendre si tu ne sais pas te débrouiller ;)  )

    Quand tu sauras faire ça, il restera à gérer les dates et tu auras trouvé une solution à ton problème de départ.

    Alors quand j'excute ma nouvelle macro, je commencé par mettre la liste des graphes mais il me les affiche pas tous... (6 au lieu de 25).

    Mon problème c'est que je n'arrive pas a selectionner un graphique particulier pour en chager le nom, je n'arrive pas à comprendre comment faire pour qu'il m'affiche le nom de tel ou tel graphique... Bref j'arrive pas a grand chose, je pense comprendre le raisonement mais je suis très loin de réussir a le traduire en VBA


    Alors je commence par tenter d'afficher la liste des graphs:

    1. Dim co As ChartObject
    2. Dim s As String
    3.  
    4. s = "La liste des graphique de la feuille 1"
    5. For Each co In Worksheets(1).ChartObjects
    6. s = s & vbCrLf & " * " & co.Name
    7. Next
    8. MsgBox s


    Donc la il m'affiche certains graphs, et après j'essaye de d'en nommer un mais je suis pas sur de comprendre très bien le code sur leque je m'appuie:

    1. Set co = sh.ChartObjects.Add(100, 100, 200, 100)
    2. co.Name = "Un graphe pour Matthieu"
    3. co.Chart.ChartType = xlColumnClustered
    4. co.Chart.SetSourceData Source:=sh.Range("A12:N13"), PlotBy:=xlRows


    Est ce qu'il nomme "un graph pour Matthieu" le graphe qui a comme source "A12:N13" ? Et à quoi sert la ligne Add100, 100,200,100?

    La j'ai l'impression qu'avec mon code il me donne une liste de graph puis me creer un graph à chaque fois basé sur A12:N13...
    Expert Programmation

    Ohlala !!!!
    Il ne faut pas exécuter bêtement les codes que je te propose, il faut les étudier et les comprendre !!!!

    Ton nouvel ami est la touche F1.

    Alors tu vas te balader sur chacun des mots de ton code, et tu vas appuyer sur F1.
    Quand je le fais pour Add par exemple, j'obtiens :

    _______________________________________________________________
    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯


    Méthode Add telle qu'elle s'applique à l'objet ChartObjects.

    Cette méthode crée un graphique incorporé. Elle renvoie un objet ChartObject.

    expression.Add(Left, Top, Width, Height)


    expression Obligatoire. Expression qui renvoie un objet ChartObjects.

    Left, Top Argument de type Double obligatoire. Coordonnées initiales du nouvel objet (en points), par rapport au coin supérieur gauche de la cellule A1 d'une feuille de calcul ou du coin supérieur gauche d'un graphique.

    Width, Height Argument de type Double obligatoire. Taille initiale du nouvel objet, en points.

    _______________________________________________________________
    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯


    A cette très enrichissante lecture, je me dis que ce n'est pas la méthode Add qu'il faut utiliser. N'est-ce pas ?

    Je reprends :
    1°) parcourir tous les graphes
    2°) en sélectionner un
    3°) afficher le nom actuel du graphe
    4°) demander à l'utilisateur d'en changer

    1. Dim co As ChartObject
    2. Dim nom As String
    3.  
    4. ' // Parcourir tous les graphiques de la feuille 1
    5. For Each co In Worksheets(1).ChartObjects
    6. ' // En sélectionner un :
    7. co.Activate
    8. co.Chart.ChartArea.Select
    9.  
    10. ' // Afficher son nom
    11. If MsgBox("Voulez-vous changer le nom du graphique " & co.Name & " ?", _
    12. vbQuestion Or vbYesNo, "Graphique") = vbYes Then
    13. ' // Oui, il veut !
    14. nom = InputBox("Nouveau nom")
    15.  
    16. ' // Si quelque chose a été saisi et que l'utilisateur n'a pas annulé...
    17. If nom <> "" Then
    18. ' // ... On change le nom
    19. co.Name = nom
    20. End If
    21. End If
    22. Next


    A étudier :o 

    Alleluia, ca marche!!

    Je crois comprendre à peu près comment le code marche, j'ai rajouté une partie pour qu'il m'affiche d'abord le nom de tous les graphes présent.

    Il faut maintenant que je fasse un code pour choisir le graphique que je veux renommer, sinon avec la boucle "for", il me redemande à chaque fois de tous les renommer...

    Je pensais donc faire avec un "If", tel ou tel graph est activé alors le code me demande de changer el nom de ce graph.

    1. MsgBox ("Selectionnez un graph")
    2. ActiveSheet.ChartObjects("Chart 3 ").Activate
    3. ActiveChart.SeriesCollection(1).Select
    4.  
    5. If co("Chart 3 ").ChartObjects = Activate Then
    6. co.Activate
    7. co.Chart.ChartArea.Select


    Et je continue avec le code précedent, mais j'ai un probleme avec mon if et avec le fait qu j'arrive pas a selctionner le graph que je veux autrement que en mettant son nom dans le code...
    Expert Programmation

    :pfff: 

    Voila comment on fait pour être sûr de ce qui est sélectionné ou pas. Ensuite, on peut travailler dessus :

    1. Dim co As ChartObject
    2.  
    3. If TypeOf Selection Is ChartObject Then
    4. Set co = Selection
    5. ElseIf TypeOf Selection Is ChartArea Or _
    6. TypeOf Selection Is Axis Or _
    7. TypeOf Selection Is Legend Or _
    8. TypeOf Selection Is PlotArea Then
    9. Set co = Selection.Parent.Parent
    10. ElseIf TypeOf Selection Is Gridlines Or _
    11. TypeOf Selection Is Series Or _
    12. TypeOf Selection Is AxisTitle Then
    13. Set co = Selection.Parent.Parent.Parent
    14. ElseIf TypeOf Selection Is DataLabels Then
    15. Set co = Selection.Parent.Parent.Parent.Parent
    16. Else
    17. MsgBox "Vous avez sélectionné un '" & TypeName(Selection) & "', qui n'est pas (encore) pris en compte"
    18. Exit Sub
    19. End If
    20. co.Activate
    21. co.Chart.ChartArea.Select
    22. MsgBox "L'objet sélectionné est '" & o.Name & "'" & vbCr & " (en fait, c'est la zone de chart du chart de l'objet)"

    Bonjour,

    Merci encore une fois de ta réponse,

    Je ne comprends pas trés bien ton dernier code: ce que je crois comprendre c'est qu'avant de l'excuter je clique sur un objet et si c'est un graph il me donne le non de ce graph. Cependant, quand je l'execute, il y a un problème au niveau de la ligne 20, il me dit que la variable n'est pas "set" alors que j'ai l'impression qu'elle l'est en ligne 4.

    Expert Programmation

    Salut,

    En fait, quand tu cliques sur un graphe pour le sélectionner, tu n'es pas sûr de l'objet exact sur lequel tu es. Est-ce le graphe, l'objet conteneur du graphe, la zone de dessin du graphe, le titre, etc.

    D'où la succession de tests et de Sets pour choisir le bon objet.

    Il y avait une petite coquille dans mon code, j'avais écrit xo pour co. C'est mal. J'ai corrigé.
    Mais il y a pire. Tu n'as pas utilisé l'option explicit, ce qui t'aurait permis de t'en apercevoir toi-même !!!! C'est très mal. Alors, utilise-la.

    --------------

    Ça y est ? Tu peux renommer tes graphes, et changer leurs données comme tu l'entends ?

    Bonjour,

    Je me suis focalisé sur la ligne 20 pour comprendre ce qui aller pas et je ne suis pas aller plus haut :whistle: 

    Donc maintenant je peux renomer mes graphes, ce qui me semble pas mal du tout. J'ai rajouté quelque chose pour que si je ne change pas le nom il continue quand meme.

    Après, je rajoute une ligne pour demander a l'utilisateur s'il veut changer la source, puis une ligne pour changer la source.

    On en arrive donc au deuxieme problème, comment faire pour que je décide des dates, sans rentrer dans le code.

    Mon deuxieme probleme est que j'ai une série de date, et en dessous j'ai toutes les données, il faut donc que mon graphes prennent les bonnes données.

    Je me disais de peut etre essayer de demander a l'utilisateur de mettre un "range" pour les données que la macro irait rechercher avec le "setcourcedate". Ca serait une premiere étape pour ensuite n'avoir qu'à rentrer les dates et que ma macro aille chercher les données.
    Expert Programmation

    Bon. On a donc un nom explicite pour chaque graphe.
    Et le graphe "grafdaté" peut changer en fonction des dates.

    Bon. Ben voilà :
    1. Dim plage As Range
    2. Worksheets(1).ChartObjets("grafdaté").Chart.SetSourceData Source:=plage


    Y'a plus qu'à alimenter la zone plage. Facile :

    1. plage = vide
    2. Pour toutes les cellules concernées,
    3. Si date est correcte Alors plage = plage + cellule


    1. For Each cell In Range("A1:E1")
    2. If cell.Column <> 3 Then
    3. Set plage = Union(zone, cell)
    4. End If
    5. Next


    Bon, la fonction Union() n'est pas fichue de traiter des arguments vides. C'est nul. Donc on le gère :
    1. For Each cell In Range("A1:E1")
    2. If cell.Column <> 3 Then
    3. If plage Is Nothing Then
    4. Set plage = cell
    5. Else
    6. Set plage = Union(plage, cell)
    7. End
    8. End If
    9. Next

    Bon, ma condition c'est que je n'aime pas les colonnes 3.
    Toi, c'est un problème de choix dans la date.

    Tu vois ce qui te reste à faire ?
    Expert Programmation

    Pour remplir la variable plage, je parcours la zone "A1:E1", et je prends toutes les cellules qui ne sont pas dans la colonne 3.

    Toi, tu dois parcourir la zone ?????, et tu dois prendre toutes les cellules qui correspondent ????? à telle période.

    Comme je ne connais pas l'organisation de ton fichier, je te laisse le faire.
    (De toute façon, je préfère que tu le fasses toi-même).

    Vois-tu un peu mieux ce que tu as à faire ?

    Bonjour,

    Je crois comprendre ce que fait le code. Ca veut dire que si j'ai une ligne avec toutes mes dates et en dessous les données pour chacun des graphes (une ligne pour un graph). Il faut que je fasse un changement de source de ce graphe la:

    1. Set sh = Worksheets(3)
    2.  
    3. Set co = sh.ChartObjects(nom)
    4. co.Chart.SetSourceData Source:=sh.Range(plage)



    Et avant, il faut que je prennent les bonnes données quand je "set" ma plage. C'est donc à ce moment que je dois pouvoir rentrer les dates de début et de fin, qu'en les notant, ma boucle for ne travaille que pour ce range, tout en allant cherchant les bonnes données (ca ca doit etre grace au nom qu j'y arrive si je ne me trompe pas).

    Je pensais donc faire queque chose comme ca:

    1. Dim datedébut As Date
    2.  
    3. datedébut = InputBox("Entrez la date de début")
    4. If datedébut <> "" Then
    5. Cells.Find(What:="datedébut", After:=ActiveCell, LookIn:=xlFormulas, _
    6. LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    7. MatchCase:=False, SearchFormat:=False).Activate
    8. End If


    Et pareil pour la date de la fin et après je sais pas torp comment faire pour que mon for ne cherche que pour les bonnes dates...


    Expert Programmation

    Bon, tu cherches trop compliqué.

    Regarde :
    1. Dim Periode(0 To 1) As Date
    2.  
    3. ' // Je mets les dates que je veux, na !
    4. Periode(0) = CDate("1 février 2011")
    5. Periode(1) = CDate("14 février 2011")
    6.  
    7. Dim plage_totale As Range
    8. Dim plage_date As Range
    9. Dim plage_graphe As Range
    10.  
    11. ' // La ligne 12 contient les dates
    12. ' // La ligne 13 contient les valeurs
    13. ' // C'est ça ?
    14. Set plage_totale = ws.Range("A12:N13")
    15. Set plage_date = plage_totale.Rows(1)
    16.  
    17. Dim cell As Range
    18. Dim cell_ajoute_moi As Range
    19.  
    20. ' // On parcourt toutes les dates.
    21. For Each cell In plage_date.Cells
    22. If CDate(cell.Value) >= Periode(0) And _
    23. CDate(cell.Value) <= Periode(1) Then
    24. ' // La cellule qu'il faut ajouter est juste en dessous de cell
    25. ' // Pour se décaler d'une ligne, on utilise Offset qui en anglais signifie : ?????
    26. Set cell_ajoute_moi = cell.Offset(1)
    27.  
    28. ....
    29.  
    30. End If
    31. Next

    Bonjour,

    Je me demandais s'il existe une boucle pour que je fasse : tant que la date n'est pas bonne il fasse tourner la boucle pour reduire les periodes?

    Si je comprend bien ton code, il faut qu'apres je mete le code pour "set" une nouvel plage (en m'inspirant de ce que tu m'as dit à propos de union etc) et il faut que je fasse ca en étant sur qu'il réduise la zone pour les valeurs aussi.

    Donc a la fin il faut que je set la plage date, set la plage total et fasse le changement de source sur cette nouvelle plage?
    Expert Programmation

    Oui, c'est exactement ça.
    Mais tu as besoin des dates ET des valeurs ?

    Alors le code devient :
    1. For Each cell In plage_date.Cells
    2. If CDate(cell.Value) >= Periode(0) And _
    3. CDate(cell.Value) <= Periode(1) Then
    4. Set cell_ajoute_moi_je_suis_une_date = cell
    5. Set cell_ajoute_moi_je_suis_une_valeur = cell.Offset(1)
    6.  
    7. ....
    8.  
    9. End If
    10. Next


    :) 

    Bonjour,

    Alors maintenant j'arrive a changer les valeur du graph que j'ai selectionné, le problème c'est qu'il ne prend pas les valeur que je veux et surtout il ne prend pas de valuer du tout j'ai l'impression.. Il ne prend que les dates et il met un titre au graph ( qui est la premiere date en faite...). En faite la je crois que je me perd un peu dans les differents code, dans ce que je dois faire, je vois plus du tout ou je dois aller, je sais meme plus ce que je dois faire...


    Expert Programmation

    Oki.

    Fais-toi une feuille très simple, avec des données type, un graphe bien nommé et ta macro. Et révise-le tout.

    Si tu as encore des problèmes, publie ici le code complet de la macro, et explicite-nous très précisément l'organisation de tes données.

    A te lire.

    Bonjour,

    J'ai fait ce que tu m'as dit de faire mais j'ai un autre probleme qui est que excel plante juste apres que je renomme mon graph, et je ne comprend pas pourquoi...

    Pour ce qui de ma "vrai" macro:

    Mon fichier est organisé de la facon suivante: sur la troisième page de mon fichier j'ai 25 graphs en haut de la page, grosso modo entre B2 et X100.

    En dessous à la ligne 151 j'ai une première série de dates : de D150 à BM 150 ( du 30/12/2005 au 30/01/2011). En dessous entre la ligne 151 et 168 j'ai les donné qui vont avec ces dates pour completer le graph. Sachant que la colonne juste à gauche donne à quoi correspondent ces données ( ex PIB de Chine).

    Après à partir de la ligne 171 j'ai une nouvelle serie de dates, pour certaine valeures (ligne 171 à174) spécifique à quelques graphs. J'ai la meme chose entre les lignes 176 et 179 (176 les dates et en dessous les valeurs), aux lignes 180 à 183, 185 à187 et 189 à 191.

    En gros pour faire cette macro j'ai importé plein de données puis j'ai fait des graphs en selectionnant les bonnes valeurs. Le truc c'est qu'on me demande souvent de sortir ces graphs pour une certaine période d'ou lobjet de ma question initiale. J'aimerai bien m'en servir dans d'autre contexte ou je dois updater des graphs en selectionnant des données qui sont géneralement sur une autre feuille...

    Mon code pour l'instant donne ca:

    1. Sub Select_graph()
    2. '
    3. ' Select_graph Macro
    4. '
    5. Dim co As ChartObject
    6. Dim s As String
    7. Dim nom As String
    8. Dim sh As Worksheet
    9. Dim plage As Range
    10. Dim datedébut As Date
    11.  
    12.  
    13.  
    14. s = "La liste des graphique de la feuille 3"
    15. For Each co In Worksheets(3).ChartObjects
    16. s = s & vbCrLf & " * " & co.Name
    17. Next
    18. MsgBox s
    19.  
    20.  
    21. If TypeOf Selection Is ChartObject Then
    22. Set co = Selection
    23. ElseIf TypeOf Selection Is ChartArea Or _
    24. TypeOf Selection Is Axis Or _
    25. TypeOf Selection Is Legend Or _
    26. TypeOf Selection Is PlotArea Then
    27. Set co = Selection.Parent.Parent
    28. ElseIf TypeOf Selection Is Gridlines Or _
    29. TypeOf Selection Is Series Or _
    30. TypeOf Selection Is AxisTitle Then
    31. Set co = Selection.Parent.Parent.Parent
    32. ElseIf TypeOf Selection Is DataLabels Then
    33. Set co = Selection.Parent.Parent.Parent.Parent
    34. Else
    35. MsgBox "Vous avez sélectionné un '" & TypeName(Selection) & "', qui n'est pas (encore) pris en compte"
    36. Exit Sub
    37. End If
    38. co.Activate
    39. co.Chart.ChartArea.Select
    40. MsgBox "L'objet sélectionné est '" & co.Name & "'" & vbCr & " (en fait, c'est la zone de chart du chart de l'objet)"
    41.  
    42. If MsgBox("Voulez-vous changer le nom du graphique " & co.Name & " ?", _
    43. vbQuestion Or vbYesNo, "Graphique") = vbYes Or vbNo Then
    44. nom = InputBox("Nouveau nom")
    45.  
    46. If nom <> "" Then
    47. ' // ... On change le nom
    48. co.Name = nom
    49.  
    50. End If
    51. End If
    52.  
    53.  
    54. Dim Periode(0 To 1) As Date
    55.  
    56.  
    57.  
    58. ' // Je mets les dates que je veux
    59. Periode(0) = CDate("12/30/2005")
    60. Periode(1) = CDate("03/31/2006")
    61.  
    62. Dim plage_totale As Range
    63. Dim plage_date As Range
    64. Dim plage_graphe As Range
    65.  
    66. ' // La ligne 12 contient les dates
    67. ' // La ligne 13 contient les valeurs
    68. Set plage_totale = Worksheets(3).Range("D150:E191")
    69. Set plage_date = plage_totale.Rows(1)
    70.  
    71. Dim cell As Range
    72. Dim cell_ajoute_moi As Range
    73.  
    74. ' // On parcourt toutes les dates.
    75. For Each cell In plage_date.Cells
    76. If CDate(cell.Value) >= Periode(0) And _
    77. CDate(cell.Value) <= Periode(1) Then
    78. Set cell_ajoute_moi = cell.Offset(1)
    79. Set cell_ajoute_moi = cell.Offset(1)
    80. Set cell_ajoute_moi = cell.Offset(1)
    81. Set cell_ajoute_moi = cell.Offset(1)
    82.  
    83. If plage Is Nothing Then
    84. Set plage = cell
    85. Else
    86. Set plage = Union(plage, cell)
    87. End If
    88.  
    89. End If
    90.  
    91. Set zone = plage
    92. ActiveChart.SetSourceData Source:=zone
    93.  
    94.  
    95. Next
    96.  
    97. End Sub


    Voila, c'est à peu près tout je crois,

    En tout cas, merci encore pour ton aide
    Expert Programmation

    Salut,

    Comment ça le renommage ne fonctionne plus ?
    Il fonctionnait avant ?

    1. If MsgBox("blabla", vbQuestion Or vbYesNo, "Graphique" ) = vbYes Or vbNo Then
    C'est pas moi qui t'ai dit de faire ça :non:  Vire le Or vbNo et réfléchis au pourquoi :o 

    Eh, pourquoi tu fais 4 fois la même chose de la ligne 78 à la ligne 81 ?
    Et lignes 84 et 86, tu ajoutes la cellule cell, qui est la cellule de parcours, et non pas celle qu'on veut ajouter. (Je rappelle que la cellule qu'on veux ajouter s'appelle cell_ajoute_moi :whistle:  ).

    Tu sais, je pense qu'on peut simplifier les lignes 91-92 ;) 

    ------------

    :fou:  :fou:  :fou:  COMMENT OSES-TU UTILISER UN ACTIVECHART, A LA LIGNE 92 ?? :fou:  :fou:  :fou: 


    Pour rappel, si par ailleurs (ben oui, qu'est-ce qu'elle fait là la procédure de renommage ? - Faut la mettre à part) on imposait des noms à nos graphes, c'était en pour changer la SourceData de façon explicite, comme ça :
    1. ChartObjects("le_nom").Chart.SetSourceData Source:=plage
    Lassé par la pub ? Créez un compte