VB pbs : Trop de séries lors de la créations de Graphiques. Algo Courbes de tend

Young0901 - 12 sept. 2012 à 20:07
 Young0901 - 13 sept. 2012 à 22:49
Bonsoir tout le monde,

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...

4 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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)
0
Utilisateur anonyme
13 sept. 2012 à 01:33
Bonjour,


faire un "petit" programme vba qui


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".

Pour la première question:

Je me méfierais de ces deux lignes :


 .Values = "=" & MaPlage.Rows(Compteur).Address(True, True, xlR1C1, True)
 .XValues = "=" & MaPlage.Rows(1).Address(True, True, xlR1C1, True)


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.
0
Bonsoir,

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).

Cmarcotte, j'ai essayé en remplaçant les lignes :
 .Values = "=" & MaPlage.Rows(Compteur).Address(True, True, xlR1C1, True)
 .XValues = "=" & MaPlage.Rows(1).Address(True, True, xlR1C1, True)


Par :
 .Values = "=" & MaPlage.Rows(Compteur).Address(True, True, xlA1, True)
 .XValues = "=" & MaPlage.Rows(1).Address(True, True, xlA1, True)


Rien n'y change.

Où alors je n'ai pas vraiment compris ta remarque

De plus l'aide de VBA indique que les deux premières options de ".address" renvoie aux lignes absolues et aux colonnes absolues

expression.Address(LigneAbsolue, ColonneAbsolue, SyleRéférence, Externe, ParRapportÀ)


Donc en mettant True et True ça devrait passer...

En tout cas merci, je vais essayer de déplacer le sujet :)
0
Ah non ça a déjà été fait.
Merci les Admin :)
0
Rejoignez-nous