IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Tracer Graphique par Macro [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Tracer Graphique par Macro
    Bonjour,

    Je veux tracer un graphe dont les valeurs sont contenues dans la colonne C, de C1 a Cx, la premiere valeur est toujours en C1, la derniere dépend de l'utilisateur, je sais que le nombre de données est en NB_Jours.

    Je me suis servi de l'enregistreur de macro, ceci marche bien mais le nombre de valeurs est figée, par exemple la plage $C$1:$C$20 si lors de mon enregistrement il y avait 20 valeurs, j'ai donc remplacé $C$1:$C$20 par $C$1:$C$NB_Jours dans la macro (NB_Jours est définie plus haut).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Sub Tracer_Graphe()
     
        Range("C1").Select
        Range(Selection, Selection.End(xlDown)).Select
        ActiveSheet.Shapes.AddChart.Select
        ActiveChart.SetSourceData Source:=Range("'Graphes'!$C$1:$C$NB_Jours")
        ActiveChart.ChartType = xlLine
     
    End Sub

    A l'excution, j'ai un message d'erreur "Erreur d'execution 1004", la methode 'range' de l'objet'_global' a échoué.

    Ce que je ne comprends pas, c'est qu'a la suite de ce message d'erreur, si je clique sur 'Fin' et que je vais sur la feuille, le graphe est correctement traçé avec la sélection effectuée qui est bonne.

    Puisque la sélection est faite par Range(Selection, Selection.End(xlDown)).Select, y a t-il un moyen de representer graphiquement cette zone autrement que par ma zone $C$1:$C$NB_Jours ?

    Pourquoi Excel m'indique un message d'erreur ? alors que quand je vais sur la feuille de graphe, ce graphe est bien fait ?

    Question subsidiaire :
    Le graphe se positionne en milieu d'ecran, comment definir le positionnement et la taille du graphe dans la feuille ? (je voudrais en mettre plusieurs)


    Merci beaucoup.

  2. #2
    Membre chevronné Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Points : 2 131
    Points
    2 131
    Par défaut
    Une première remarque, remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveChart.SetSourceData Source:=Range("'Graphes'!$C$1:$C$NB_Jours")
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveChart.SetSourceData Source:=Range("'Graphes'!$C$1:$C$" & NB_Jours)
    NB_Jours sera bien remplacer par sa valeur dans la chaine de caractère.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci pour cette réponse, je viens d'essayer, j'ai toujours la même erreur.

    En revanche, en regardant, je me dit que le fait de déterminer la zone de valeurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Range("C1").Select
    Range(Selection, Selection.End(xlDown)).Select
    est contradictoire avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     ActiveChart.SetSourceData Source:=Range("'Graphes'!$C$1:$C$" & NB_Jours)
    Soit j'arrive a passer correctement la valeur NB_Jours, soit je passe pas la selection mais pas les 2.


    Ceci dit, j'ai toujours la même erreur, une autre idée ?

    Merci d'avance

  4. #4
    Membre chevronné Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Points : 2 131
    Points
    2 131
    Par défaut
    Je n'avais pas tout regardé, c'était la syntaxe qui m'avait choquée en premier lieu.

    Si NB_jours est une plage nommée, comme tu as l'air de le dire, tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveChart.SetSourceData Source:=Range("'Graphes'!$C$1:$C$" & Range("NB_Jours").Value)
    Sinon, il y a aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    NB_Jours = Range("C1").End(xlDown).Row
    ActiveChart.SetSourceData Source:=Range("'Graphes'!$C$1:$C$" & NB_Jours)

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Je te remercie mais toujours pas !

    Ca ne marche pas, je n'ai plus rien de traçé (mais je n'ai plus de messages d'erreurs !)
    Je m'exprime mal.

    Juste avant cette macro qui doit tracer le graphe, j'ai demandé a l'utilisateur une date et NB_Jours est la difference entre la date du jour et celle donnée, 5 par exemple s"il a renseigné 24/01/2012

    Ensuite pour chaque jour, je calcule une valeur, disons 2 fois le nb de jour pour faire simple, j'ai donc en colonne C

    2
    4
    6
    8
    10


    La difficulté, c'est que comme je ne connais pas le nombre de jours au départ, elle demarre toujours en C1, se termine en C5 ci-dessus mais ca pourrait etre plus long.
    Dans l'exemple ci-dessus, NB_Jours est de 5, j'essayais donc de passe C5 en argument.

    En resumé, je veux obtenir le graphe C1:C5 en sachant que C5 peut changer et etre C6, C7 etc

  6. #6
    Membre chevronné Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Points : 2 131
    Points
    2 131
    Par défaut
    Tu as plusieurs solutions :
    - Soit tu déclares nbJours comme une variable globale.
    - Soit c'est un paramètre de la procédure Tracer_Graphe.
    - Soit tu utilises ma 2ème proposition qui n'est pas idéale car tu as déjà l'info du nombre de jours.

    Ensuite, je ne suis pas sûr que ton graph se créé bien via ta méthode. S'il s'affichait la dernière fois, alors que le code plantait, c'est surement que tu l'avais déjà créé en enregistrant ta macro, parce que sinon, à moins d'un miracle... !!!

    Donne ton code complet si tu veux

    En attendant ton code pour qq chose de plus propre, ça marche chez moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Sub TracerGraph()
        Dim nbJours As Integer
        nbJours = Range("C1").End(xlDown).Row
     
        Dim ch As Chart
        Set ch = Charts.Add()
     
        ch.SetSourceData Source:=Range("'Graphes'!$C$1:$C$" & nbJours)
        ch.ChartType = xlLine
    End Sub

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Il s'agit en effet peut_être d'une mauvaise déclaration, voici le code complet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    Sub Graphe()
     
    Sheets("Graphes").Visible = True
    Sheets("Graphes").Select
    Range("A1:E10000") = ""
    depGR:
    ' doni est un userform qui sert a entrer les données dont la dae qui m'interesse qui est en T
    doni.Show
     
    If doni.fin = True Then
    quitter
    Else
     
    If doni.S = "" Or doni.X = "" Or doni.T = "" Or doni.v = "" Or doni.r = "" Or doni.b = "" Then
    MsgBox ("Veuillez remplir tous les champs"), vbInformation
    GoTo depGR
    End If
     
    If doni.C = False And doni.P = False Then
    MsgBox ("Veuillez choisir le type de l'option"), vbInformation
    GoTo depGR
    End If
     
    End If
     
    'Affectation des champs aux variables
    S = doni.S
    X = doni.X
    T = doni.T
    ' T est la date qui m'interesse
    v = doni.v / 100
    r = doni.r / 100
    b = doni.b
     
    If 0 = 1 Then
    errb:
    MsgBox ("Veuillez rentrer une date valide")
    doni.T = ""
    Graphe
    End If
     
     
    On Error GoTo errb
    TT = (DateValue(T) - DateValue(Date)) / 365
     
    ' ici, je determine le nombre de valeurs qui seront représentées
    NB_Jours = (DateValue(T) - DateValue(Date))
     
    Range("E9") = S
    Range("E10") = X
    Range("E11") = TT
    Range("E13") = r
    Range("E12") = v
    Range("E14") = b
    Range("E15") = NB_Jours
     
    If doni.C = True Then CP = 1
    If doni.P = True Then CP = 2
    Range("A1") = CP
     
    For i = 1 To (NB_Jours - 1)
    TT = (DateValue(T) - DateValue(Date + i)) / 365
    Range("E11") = TT
    Range("B" & i) = i
    Range("C" & i) = BlackScholes(Range("A1"), Range("E9"), Range("E10"), Range("E11"), Range("E13"), Range("E14"), Range("E12"))
    Next i
     
    ' ************Jusqu'ici, tout est OK, les valeurs sont positionnées en C1, C2 etc
     
    Tracer_Graphe
     
    End Sub
     
     
    Sub Tracer_Graphe()
     
     
    Sheets("Graphes").Select
        Range("C1").Select
        Range(Selection, Selection.End(xlDown)).Select
     
    'Ici le fait de tracer le graphe, j'ai tout effacé pour le moment puisque ca ne fonctionne pas
     
     
     
    End Sub
    J'ai repris ton code, ca marche, grand merci.

    Il ne me reste plus qu'a positionner le graphe etc

    Je vais chercher, J'ai largement assez abusé de ta patience.

    Encore merci

  8. #8
    Membre chevronné Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Points : 2 131
    Points
    2 131
    Par défaut
    Allez, je suis en forme aujourd'hui, voici le code pour placer où tu veux le graph
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Public Sub TracerGraph()
        Dim nbJours As Integer
        Dim ch As Chart
        Dim xPos, yPos, largeur, hauteur As Double
     
        xPos = 10
        yPos = 10
        largeur = 300
        hauteur = 300
     
        nbJours = Range("C1").End(xlDown).Row
     
        Set ch = Worksheets("Graphes").ChartObjects.Add(xPos, yPos, largeur, hauteur).Chart
     
        ch.SetSourceData Source:=Range("'Graphes'!$C$1:$C$" & nbJours)
        ch.ChartType = xlLine
    End Sub
    Par contre, je te conseille vraiment de passer le paramètre du nombre de jours à ta procédure, c'est plus propre que d'aller recompter ça ensuite.

    Autre remarque : si ton nombre de graphiques est fixe, tu n'as peut-être pas besoin de les créer par macro. Tu peux utiliser un range dynamique comme source et ils se mettront à jour après tes calculs.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Grand Merci, super sympa de ta part.

    Bonne soirée, à toi et aux membres de ce site toujours prêts a donner un coup de main.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 01/07/2014, 17h12
  2. Problème génération graphique par macro VBA
    Par Quent4491 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 11/05/2011, 16h00
  3. Rafraichissement d'un Graphique par macro
    Par Djams78 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/03/2011, 14h54
  4. Graphique par macro
    Par GMmaurice dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/04/2008, 16h21
  5. Manipulation de graphiques par une macro
    Par C.R.E.A.M dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 03/08/2007, 17h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo