Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/12/2011, 13h15   #1
Invité de passage
 
Inscription : juin 2010
Messages : 7
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 7
Points : 2
Points : 2
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 :
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.
Caennais est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 15h54   #2
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

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

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Une première remarque, remplace
Code :
ActiveChart.SetSourceData Source:=Range("'Graphes'!$C$1:$C$NB_Jours")
par
Code :
ActiveChart.SetSourceData Source:=Range("'Graphes'!$C$1:$C$" & NB_Jours)
NB_Jours sera bien remplacer par sa valeur dans la chaine de caractère.
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/12/2011, 16h26   #3
Invité de passage
 
Inscription : juin 2010
Messages : 7
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 7
Points : 2
Points : 2
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 :
1
2
3
 
Range("C1").Select
Range(Selection, Selection.End(xlDown)).Select
est contradictoire avec
Code :
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
Caennais est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 16h37   #4
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

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

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
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 :
ActiveChart.SetSourceData Source:=Range("'Graphes'!$C$1:$C$" & Range("NB_Jours").Value)
Sinon, il y a aussi
Code :
1
2
NB_Jours = Range("C1").End(xlDown).Row
ActiveChart.SetSourceData Source:=Range("'Graphes'!$C$1:$C$" & NB_Jours)
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 16h59   #5
Invité de passage
 
Inscription : juin 2010
Messages : 7
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 7
Points : 2
Points : 2
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
Caennais est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 17h06   #6
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

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

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
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 :
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
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/12/2011, 17h26   #7
Invité de passage
 
Inscription : juin 2010
Messages : 7
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 7
Points : 2
Points : 2
Il s'agit en effet peut_être d'une mauvaise déclaration, voici le code complet

Code :
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
Caennais est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 18h02   #8
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

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

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Allez, je suis en forme aujourd'hui, voici le code pour placer où tu veux le graph
Code :
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.
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/12/2011, 18h53   #9
Invité de passage
 
Inscription : juin 2010
Messages : 7
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 7
Points : 2
Points : 2
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.
Caennais est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h11.


 
 
 
 
Partenaires

Hébergement Web