Se connecter avec
S'enregistrer | Connectez-vous

Problème de création de série graphique en VBA

Dernière réponse : dans Programmation

Bonjour à tous,

On m'a il y a quelques jours demander de codé une routine Excel qui aurait pour but de réaliser automatiquement des graphique de comparaison, sous forme de radar, entre plusieurs listes de données que l'on aura au préalablement sélectionné.

J'ai d'or est déjà créer un petit UserForm permettant de selectionner les différentes listes que l'on voudrait selectionner.
Le problème à l'heure actuelle viens de la création du graphique.

En effet en fonction des listes selectionnées apparaissent différentes erreurs de type run-time '1004' ou '1005' le plus souvent.

Bien qu'ayant des bases solide en programation je débute en vba.
Je cherche depuis un certain moment sur divers forums mais j'ai trouvé très peu de solution aux problèmes similaires et elles ont toutes échoué pour moi.

Je joins donc le code de la fonction posant problème:

  1. Sub Create_graph(StartV As Integer, EndV As Integer)
  2. 'StartV:first line index EndV: last line index
  3.  
  4. Dim n As Integer, pos As Integer
  5.  
  6. Worksheets("matrix").Activate
  7.  
  8. 'Graph creation
  9. Charts.Add
  10. ActiveChart.ChartType = xlRadarMarkers
  11.  
  12. For n = 0 To (Worksheets("ggg").Cells(1, 1) - 1) 'loop on total list number
  13. If UserForm1.Frame1(n).Value = True Then 'Frame1 is a controls collection of checkbox
  14.  
  15. 'Serie creation for each list of data selected
  16. ActiveChart.SeriesCollection.NewSeries
  17. pos = n * 2 + 3 'Colunm index calcul
  18. ActiveChart.SeriesCollection(n + 1).Values = "=matrix!R" & StartV & "C" & pos & ":R" & EndV & "C" & pos
  19. ActiveChart.SeriesCollection(n + 1).Name = "=matrix!R130C" & pos
  20.  
  21. End If
  22. Next n
  23.  
  24. 'Values names
  25. ActiveChart.SeriesCollection(1).XValues = "=matrix!R" & StartV & "C2:R" & EndV & "C2"
  26.  
  27. 'Graph design elements
  28. ActiveChart.Location Where:=xlLocationAsObject, Name:="ggg"
  29. ActiveChart.HasTitle = False
  30. End Sub


Je vous remercie d'avance pour vos réponses si possible rapide SVP

PS: Si ça peut être utile il s'agit d'une suite office 2007
Lassé par la pub ? Créez un compte

Meilleure solution

Bon problème résolu...

Il a suffit que je poste ce message au bout de 3h de recherche pour que ça me saute au yeux! :sweat: 

Il s'agit d'un simple problème algorithmique les seriecollection ne devant pas utiliser la variable n mais une autre variable compteur...

Ceci semble avoir résolu la majorité des erreurs, mais j'ai toujours en revanche l'apparition dans mon graphique d'une série fantôme dont l'unique valeur est {1}... Des idées quand à ce défaut?

Oui bien sur! Mais j'avais chercher pendant un moment comment le faire sans trouver.
Donc je me suis rabbattu vers cette solution.
Je voulais régler ça car m'étant déjà occuper d'un forum je sais à quel point ça peut être ch.. pardon ennuyeux de repasser derrière chacun.

Merci quand même!
Expert Programmation

J'avais posé un drapeau sur ton sujet pour pouvoir y revenir. Comme tu avais donné la solution, ça n'urgait pas. Et pis voilà, je l'avais oublié.

Or donc, je voulais critiquer, très objectivement ton code.

A la ligne 6, tu actives une feuilles, je me demande bien pourquoi.
Ligne 10 et suivantes, tu utilises l'objet courant, c'est maladroit. Définit une variable plutôt que de faire confiance à Excel.
Ligne 12, tu utilises trop de parenthèses, ça surcharge.
Ligne 13, tu testes par rapport à vrai. C'est vrai que vraiment, en vrai, ça change rien à ce qui est vrai, toute chose étant vraie par ailleurs Mais c'est un peu lourd (moins que mes commentaires, il est vrai :D  )
Rhooo, ligne 22, tu reportes la variables derrière le Next. Depuis les années 1990, c'est l'indentation qui permet de revoir le code, pas ce vestige des temps préhistoriques.

Ces remarques pour que tu puisses prochainement dire "Ayant des bases solide en programation (sic) dont VBA." !

Ton code, revu :
  1. Dim n As Integer, pos As Integer
  2. Dim gr As Chart
  3.  
  4. Set gr = Charts.Add
  5. gr.ChartType = xlRadarMarkers
  6.  
  7. For n = 0 To Worksheets("ggg").Cells(1, 1) - 1
  8. If UserForm1.Frame1(n).Value Then
  9. gr.SeriesCollection.NewSeries
  10. pos = n * 2 + 3
  11. gr.SeriesCollection(n + 1).Values = "=matrix!R" & StartV & "C" & pos & ":R" & EndV & "C" & pos
  12. gr.SeriesCollection(n + 1).Name = "=matrix!R130C" & pos
  13. End If
  14. Next
  15.  
  16. gr.SeriesCollection(1).XValues = "=matrix!R" & StartV & "C2:R" & EndV & "C2"
  17. gr.Location Where:=xlLocationAsObject, Name:="ggg"
  18. gr.HasTitle = False


Peux-tu sur cette base, apporter tes corrections ?
On verra ensuite pour "{1}".

Bon pour répondre à tes commentaires:

l'activation de la feuille... oui effectivement surement un résidu du moment ou j'ai démarrer mon code, je pensais avoir besoin d'activer la feuille pour aller chercher les données qu'elle contient sans la rappeler à chaque fois. Depuis j'ai complètement changer le système.

Pour l'objet courant j'avoue qu'encore maintenant après une bonne semaine de prog sur VB et VBA je m'y fit encore trop. (l'appli fonctionne du tonnerre cependant, je verrais si je renvois à mon partron une version corrigé... ils ne sont pas très exigeant sur la qualité du code... Mais j'ai pris note pour la suite)

A les parenthèses! Une réminiscence de mes études lorsque je travaillais sur le Lisp?

Le true... bon ok là j'ai un peu honte...

Ok pour le next j'avais trouver ça sur un cours qui apparemment n'est plus tout à fait à jour!

Concernant au final cette histoire de {1} j'ai finalement fait une suppression conditionnelle sur l'éventuelle série supplémentaire... c'est du bricolage... c'est moche mais ça marche...

Bref merci de tous tes conseils, comme je l'ai dit je ne suis pas sur de revenir sur ce programme en particulier mais je suis quand même intéressé par ton avis sur l'apparition de cette série supplémentaire, par curiosité et pour une possible utilisation futur.
J'en avais pour ma part conclu qu'il s'agissait d'une plage de donnée selectionné au moment de l'activation de la macro créant ainsi automatique une série vide, comme lorsqu'on lance une création graphique manuellement avec une cellule selectionnée.
Lassé par la pub ? Créez un compte