Construction d'un graphique à partir d'un tableau (type array) de plusieurs lign

Signaler
-
 duredurelaprog -
Bonjour, bonsoir,

Je commence à comprendre certaines choses, à force d'insister. Malheureusement, je bloque sur cela :
Actuellement, j'arrive à récupérer une plage de cellules d'une feuille Excel pour faire un graphique. Mon problème est que désormais, je préférerais éviter de passer par l'intermédiaire de la feuille Excel et me servir directement de mon tableau pour en faire un graphique. Mon tableau se présente ainsi:

il y a 8 lignes et 48 colonnes
la première ligne me sert d'abscisse
je souhaite donc obtenir 7 courbes.

J'ai vu qu'il est possible d'utiliser deux tableaux d'une seul ligne pour avoir x et y, mais il n'est pas expliqué la syntaxe et je n'ai pas réussi à la trouver ou l'adapter à mon cas ...

SVP, cordialement.

8 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Bonjour,
je ne te comprends pas suffisamment.
Peux-tu oublier la finalité et te concentrer sur le résultat technique ?
1) Ce que je tire pour l'instant comme conclusion de tes explications est que tu cherches à créer un tableau dynamique de 8 lignes et 48 colonnes (peu importent les valeurs qu'il doit héberger). C'est cela ?
Si non (tu saurais déjà faire le 1): explique techniquement :
- comment tu alimentes ton tableau
- comment tu comptes en exploiter (donc lire) les valeurs (peu nous importe à quelle fin, cet aspect ne regardant que toi et/ou étant autre)

En d'autres termes : reste technique et ne traite qu'une difficulté ponctuelle, parfaitement isolée.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.

Bonsoir et merci de la réponse ... Avant, je dois préciser que je ne suis pas informaticien, j'ai appris sur le tas et ne connais donc pas très bien les termes techniques ...

Je vais essayer d'expliquer ce que je souhaite faire:

En fait, le tableau je l'ai déjà ... ainsi :

Public BILAN_LARVAIRE_ANNUEL(9, 120) As Double et je le rempli de la sorte

For C = 1 To 120
For L = 1 To 120

BILAN_LARVAIRE_ANNUEL(C,L) = Application.Sheets("Feuil1").Cells(C, L)

Next L
Next C

J'ai également fait une procédure pour tracer le graphique dont voici le début (entre parenthèses). Les données du tableau doivent se lire ligne par ligne : la première ligne du tableau contient les abscisses,avec la deuxième ligne je dessine la première série, puis avec la troisième ligne, je fait la deuxième série ... en utilisant la première ligne pour les abscisses.

( ...

Sub GRAPHIQUE(numero As Integer, localisation As String, titre As String, axe_x As String, axe_y As String, plage As String, couleur As Integer, nom_image As String, dimension As Integer)

(plage correspond à : "B23:AX30")
'--------------------------------------------------------------------------
'AJOUT OU CREATION D'UN GRAPHE :

Charts.Add

'--------------------------------------------------------------------------

'On définit la plage de données( ou SERIE), et la manière dont elle est lue (ici, en colonne):

ActiveChart.SetSourceData Source:=Sheets(localisation).Range(plage), PlotBy:=xlRows


'--------------------------------------------------------------------------

'Le type du graphe est HISTOGRAMME :

ActiveChart.ChartType = xlXYScatterSmooth
'--------------------------------------------------------------------------
'On indique où l'on trace le graphe (ici, sur la feuille 1) :

ActiveChart.Location Where:=xlLocationAsObject, Name:=localisation

... )


C'EST A LA LIGNE :

ActiveChart.SetSourceData Source:=Sheets(localisation).Range(plage), PlotBy:=xlRows

QUE JE BLOQUE CAR LA, JE DÉFINI UNE PLAGE DE CELLULES POUR LE GRAPHIQUE, ET QUE JE PREFERAIS UTILISER LE TABLEAU DIRECTEMENT EN PARAMÈTRE !!!

A LA PLACE DE ".Range (plage)", J'AURAIS AIME AVOIR QUELQUE CHOSE DU GENRE :

"ActiveChart.SetSourceData Source:= BILAN_LARVAIRE_ANNUEL(9, 120)"

En espérant être un peu plus clair ...

Cela précisera peut-être mieux ce que je cherche à faire :

http://silkyroad.developpez.com/vba/tableaux/#LXIV-G

(et encore merci pour votre intéressement.)
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Merci de t'expliquer toi-même, sans nous inviter, pour comprendre, à aller voir ce qu'un autre aurait écrit.
POour en venir à ce qui t'intéresse :
le paramètre source de ActiveChart.SetSourceData ne saurait être autre qu'une plage (écrit dans ton aide VBA !)
Je me demande d'ailleurs bien pourquoi tu tenterais de passer par un tableau dynamique (au lieu d'une plage, au besoin une à la fois) alors que tu alimenterais (ce que tu nous dis faire) ton tableau dynamique à partir d'une plage de cellules ! .
Ce n'est pas vraiment sérieux, comme "démarche" .
je souhaite donc obtenir 7 courbes.

utilise donc 7 fois ta procédure en lui lui passant, tour à tour, le paramètre plage que tu entends utiliser pour ton graphique.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.

En fait, mon problème est très simple, je ne veux pas passer par l'intermédiaire d'une feuille Excel car cela prend du temps au programme d'écrire des lignes et des lignes alors que toutes les données sont déjà stockées dans un tableau . Je veux donc utiliser directement non pas mon petit tableau, mais ma flopée de tableaux c'est à dire éviter au programme d'aller copier 800 lignes pour ensuite lui faire dessiner mes graphiques.

(Je ne suis surement pas très aguerri en langage VBA et peut-être même un peu stupide de ma personne mais je savais très bien qu'on ne peut pas utiliser un tableau à la suite de " .SetSourceData" c'est pour ça que je disais que je définissais d'une plage de cellule. Ce que j'ai écrit en mettant un tableau était juste pour essayer de montrer un exemple de ce que je voulais : NE PLUS PASSER PAR L'INTERMEDIAIRE D'UNE FEUILLE EXCEL MAIS TRAVAILLER DIRECTEMENT AVEC MES TABLEAUX, L'EXECUTION ETANT ALORS BEAUCOUP PLUS RAPIDE)

Ceci dit, si ce n'est pas possible, je ferais sans, ou je pense qu'à force d'y penser je vais finir par écrire le code intuitivement ou autre ... comme d'hab ... Je me suis adressé au forum car je pensais qu'il existait une syntaxe pour passer un tableau en entrée pour un graph. Mais si mon explication de ce que je souhaite faire est si imcompréhensible, je ne comprend pas pourquoi vous perdez votre temps à y répondre ! A mes yeux ce que je demandais était assez clair, je ne pense pas qu'il y avait à chipoter plus que ça (au risque de me faire bannir de cet espace) !

On recherche une aide, et on se prend des critiques non constructibles, ça sert à rien ! Bien le merci pour la leçon.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
On recherche une aide, et on se prend des critiques non constructibles, ça sert à rien ! Bien le merci pour la leçon

C'est une plaisanterie ?
- je ne vois pas à quelle "critique" tu te réfères
- je t'ai par contre demandé de t'expliquer toi-même et non de nous inviter à une lecture tierce pour comprendre ce que tu cherches à faire. Je persiste et signe.
- l'objet chart de Excel n'est pas le même que l'objet du même nom que l'on peut trouver dans d'autres logiciels (MSCHART.ocx, par exemple, est utilisé depuis VB6). Celui de vb6 ne sait utiliser que les données d'un datagrid. Celui de Excel ne sait utiliser directement la propriété .SourceData que celles d'une plage.
Il est possible de se passer du confort de cette propriété en utilisant un objet SeriesCollection qui, elle, pourra utiliser des valeurs provenant de tableaux unidimensionnels (2 arrays, en fait). Mais :
1) cette "méthode" ne sera pas plus rapide que l'utilisation de la plage car, en interne, Excel sait lui-même extraire agilement les valeurs dont il a besoin
2) pour réaliser ce que tu exposes : plusieurs courbes à partir d'un seul tableau multidimensionnel, il te faudrait préalablement en extraire deux arrays pour chaque courbe (donc travailler en boucle sur ton tableau, donc ralentir l'exécution).
Bonne chance dans ta démarche.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Si ce que je te raconte plus haut reste pour toi ésotérique, je te propose alors de t'intéresser aux séries.
Voici ce que j'ai trouvé de plus clair (c'est toutefois en anglais, une fois de plus, que les choses sont exprimées de manière plus rationnelle !) :

Tapez le texte de l'url ici.

Attarde-toi plus particulièrement sur le dernier paragraphe du tout premier chapître.

Tu comprendras mieux ...
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.

Bonjour,
oui, hier soir, j'étais fatigué de ne pas trouver la solution de quelque chose qui paraissait aussi "simple". Aussi veuillez excuser mon impatience.
Et vous avez raison, j'ai trouvé aussi qu'on pouvait faire avec les ".SeriesCollection", type:

'1) Création des nouveaux tableaux unidimensionnels à partir du tableau
'bidimensionnel d'origine :

ReDim Tab_Abscisses(1,10)
ReDim Tab_Ordonnees1(1,10)
ReDim Tab_Ordonnees2(1,10)

For i = 1 To 10
Tab_Abscisses(1, i) = mon_tableau_d_origine(1, i)
Tab_Ordonnees1(1, i) = mon_tableau_d_origine(2, i)
Tab_Ordonnees2(1, i) = mon_tableau_d_origine(3, i)
Next i

' 2) Puis utilisation de ces tableaux ...

Charts.Add

ActiveChart.Location Where:=xlLocationAsObject, Name:="Feuil1"

With ActiveChart

.SeriesCollection.NewSeries
.SeriesCollection(1).XValues = Tab_Abscisses()
.SeriesCollection(1).Values = tab_Ordonne1()

.SeriesCollection.NewSeries
.SeriesCollection(2).XValues = Tab_Abscisses()
.SeriesCollection(2).Values = tab_Ordonne2() ...

End With

et faire autant de NewSeries que j'ai besoin et donc de décomposer mon tableau à plusieurs lignes en autant de tableaux qu'il est nécessaire pour faire l'ensemble de mes courbes.

Cependant cette manière est peu esthétique, et comme vous le signalez, (je ne l'ai pas encore testé sur mes propres tableaux !), il est possible qu'il n'y ait pas ou peu de temps de gagné .

Finalement, et sans succès, j'avais essayé d'écrire quelque chose comme cela :

.SeriesCollection(1).Values = mon_tableau_d_origine(2,) ...
.SeriesCollection(1).Values = mon_tableau_d_origine[2,] ...
.SeriesCollection(1).Values = mon_tableau_d_origine("2;") ...


soit de manipuler (au pif ...et en écrivant des conneries sans noms) les arguments du tableau, persuadé de l’existence d'une syntaxe adaptée.

Cordialement, encore une fois désolé, et plus que jamais, également Merci (car même si sur le coup, je me suis un peu trop emballé, ça a au moins eu le mérite de me faire réfléchir).