Voilà je suis étudiant en stage et j'essaie en ce moment de faire un "petit" programme vba qui :
- trace deux courbes à partir de données calculées précédemment
- détermine automatiquement la courbe d'approximation polynomiale d'ordre le plus faible pour un coefficient de détermination R²=1
- sort les coefficients des courbes et renvoie le x auquel les deux courbes se coupent (je sais qu'elles se coupent, et en un seul et unique point) en utilisant la méthode de la dichotomie
Le but étant de trouver un temps de retour sur investissement et que l'utilisateur n'aie à rentrer que les valeurs à l'année 0.
Bon j'ai quasi fini le programme mais il n'est pas "stable" du tout (je veux dire par là qu'il beug une fois sur deux ). Le problème vient des courbes : une fois elles se tracent bien, une autre fois (en utilisant le débogage pas à pas détaillé) je me rend compte que le graphique se crée automatiquement avec 2 ou 4 séries sans données... du coup le reste plante puisque le code n'arrive pas à tracer les courbes de tendance.
Je n'ai pas beaucoup d'expérience en traçage de graphiques par vba, c'est la première fois que je le fais et je trouve pas d'où vient le pb.
Voici mon code :
Dim MonGraph As Chart
Dim MaPlage As Range, MaSerie As Series, Compteur As Integer
With Res
Set MaPlage = .Range("K6", .Range("K10").End(xlToRight))
End With
Set MonGraph = ThisWorkbook.Charts.Add
MonGraph.ChartType = xlXYScatterLines
Charts(1).Activate
ActiveSheet.Name = "Evolution"
Set MonGraph = ActiveChart
For Compteur = 4 To MaPlage.Rows.Count
Set MaSerie = MonGraph.SeriesCollection.NewSeries
With MaSerie
.Values = "=" & MaPlage.Rows(Compteur).Address(True, True, xlR1C1, True)
.XValues = "=" & MaPlage.Rows(1).Address(True, True, xlR1C1, True)
End With
Next Compteur
With MonGraph
With .Axes(xlValue)
.HasTitle = True
.AxisTitle.Caption = "Coût (€ HT)"
End With
With .Axes(xlCategory)
.HasTitle = True
.AxisTitle.Caption = "Années (ans)"
End With
.HasTitle = True
.ChartTitle.Text = Res.Range("F5")
End With
Avez vous une idée d'où peux venir le problème ?
J'aurai aussi une autre question :
Est ce que vous sauriez comment avoir de manière plus précise les coefficients des courbes d'approximation polynomiale ? Parce qu'Excel ne donne pas suffisamment de chiffres significatifs et aux ordres 5 ou 6 j'ai un peu n'importe quoi ...
J'ai pensé au polynome de Lagrange (interpolation et plus approximation du coup) mais j'ai dans les 25 points par courbe à chaque fois et j'ai peur de tomber sur un phénomène de Runge...
Merci d'avance d'avoir pris le temps de me lire, et désolé pour les fautes...
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 13 sept. 2012 à 01:30
Salut
Tu ne fais de VB.Net mais d VBA --> catégorie modifiée
Merci d'en tenir compte la prochaine fois.
Dans ton code, une chose m'intrigue.
Tu as fort justement bien dimensionné tes objets sans avoir recourt aux divers Select. Bonne chose.
Par contre, ceci me parait peu judicieux :
Set MonGraph = ThisWorkbook.Charts.Add
MonGraph.ChartType = xlXYScatterLines
Charts(1).Activate
ActiveSheet.Name = "Evolution"
Set MonGraph = ActiveChart
Es-tu sûr(e) que le Charts(1) soit ton nouveau graphique ?
Pourquoi cette approximation alors que tu viens de créer l'objet MonGraph ?
Je pense que ceci serait plus juste :
Set MonGraph = ThisWorkbook.Charts.Add
MonGraph.ChartType = xlXYScatterLines
MonGraph.Name = "Evolution"
Ce genre de fausse manip peut expliquer le genre de comportement dont tu parles, quand Excel ne sait plus à quel objet envoyer les données - Il suffit que l'utilisateur fasse un malencontreux changement de feuille et paf, ça plante.
"courbe d'approximation polynomiale" = courbe de tendance ?
En ce qui concerne les courbes de tendance, il doit y avoir moyen de récupérer les données en allant questionner les variables autour de cet objet un peu spécial, et là tu auras les données pures.
Quant au polynôme de Lagrange et au Runge, s'ils viennent se plaindre à la maison, on ne te connait pas.
(désolé, je ne sait pas de quoi tu parles)
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Donc, tu as abouti dans la mauvaise section. La bonne section pour VBA passe par VB6 et les langages dérivés. Merci d'avance à l'administrateur qui passera par ici et procèdera "au déménagement".
Parce que tu utilises les références relatives. Je ne suis pas trop sur de mon coup, mais il me semble qu'il y a des cas où elles sont calculées à partir de la situation du curseur. Essaie juste en plaçant toujours ton curseur au même endroit en commançant la macro.
Pour la deuxième question:
Je ne sais pas.
Ceci dit le règlement prévoit une question par message, quitte à ouvrir autant de messages qu'il y a de question. Cela facilite le suivi des questions répondues.
Tout d'abord veuillez vraiment m'excuser pour la confusion dans la section, je croyais que VB et VBA était la même chose. Après vos remarques je me suis un peu plus renseigné...
Pour répondre à Jack, en fait j'avais ajouté cette ligne de code quand le code a commencé à ne pas tracer les graphiques que je voulais... Oui je suis sûr qu'il n'y a qu'une seule courbe : une ligne de code au début efface tous les graphiques présents dans le classeur. J'ai ajouté la précision pour parer au pb mais sans succès...
Rapidement (de tête que quelqu'un me corrige si je me trompe) :
Pour n points, la méthode de Lagrange dont je parle met en place n polynome de degré n-1 permettant d'interpoler (passage par tous les points) une courbe. On ne parle plus d'approximation.
C'est une méthode qui, dans mon cas, serait un peu lourde vu le nombre de points que j'ai à ma disposition (25).