Tracer des graphiques à la chaînes avec Excel/VBA [Résolu]

Tracer des graphiques à la chaînes avec Excel/VBA [Résolu] - VB/VBA/VBS - Programmation

Marsh Posté le 19-08-2008 à 17:02:36    

Bonjour à tous,
 
Je me permets d'ouvrir un nouveau sujet car je n'ai pas trouvé la réponse à ma question en faisant une recherche sur le forum. Merci à ceux qui auront la patience de lire mon sujet en entier.
 
Voilà mon problème : j'ai une feuille Excel avec un certain nombre de tableaux de nombres, tous de la même taille, et je voudrais pour chaque tableau produire une représentation graphique sous forme de surface, dans une nouvelle feuille.
 
Plus précisément disons que les tableaux s'appellent Tabl(A,B) (A et B sont des indices variant de 1 à 12 et 0 à 5 respectivement). Chaque tableau Tabl(A,B) s'étale sur une certaine plage de données : Cells(Ligne(A,B)+i,Colonne(A,B)+j) , pour i,j variant dans un ensemble d'indices. Je voudrais écrire un code VB avec une double boucle sur A et B qui me produise automatiquement des graphiques Graph(A,B) dans de nouvelles feuilles. Comment faire ?
 
J'ai déjà enregistré une macro qui trace le premier tableau Tabl(1,0), voilà le code :
 
Sub DessinerSurface()
    Charts.Add
    ActiveChart.ChartType = xlSurface
    ActiveChart.SetSourceData Source:=Sheets("Resultats" ).Range("E4:AM82" ), _
        PlotBy:=xlColumns
    ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="Don1_Param0"
    With ActiveChart
        .HasTitle = True
        .ChartTitle.Characters.Text = "Don1_Param0"
        .Axes(xlCategory).HasTitle = False
        .Axes(xlSeries).HasTitle = False
        .Axes(xlValue).HasTitle = False
    End With
End Sub
 
OK ça marche bien pour mon premier tableau mais :
 
- suis-je obligé d'utiliser la commade Range pour spécifier la source ? la commande Cells serait plus pratique vu que je connais les fonctions Ligne(A,B) et Colonne(A,B), qui me disent où commence mon Tabl(A,B), sous forme d'entiers et pas sous forme de "BH12:DZ954" ;
 
- au lieu d'écrire "Don1_Param0" comme titre, et surtout comme nom de feuille, je voudrais écrire "DonA_ParamB", où A et B sont mes indices ; comment concaténer chaînes de caractères et variables entières ? je sais le faire en C avec des %ld mais pas en VB ;
 
- pour finir, l'orientation par défaut de la vue 3D ne me plaît pas trop ; j'ai des valeurs qui me plaisent pour les paramètres Hauteur, Perspective et Rotation mais je ne voudrais pas les recopier à la main pour chacun de mes 72 graphiques, comment automatiser le procédé ? il doit bien y avoir une méthode de l'objet Chart qui fait ça mais laquelle...
 
Désolé si les questions sont débiles, mais je ne suis pas un pro du VB et tout ce que j'ai comme référence est un petit bouquin assez limité et plutôt orienté Access. Toute aide est la bienvenu, merci d'avance !
 
Mouletabille.


Message édité par mouletabille le 21-08-2008 à 10:41:16
Reply

Marsh Posté le 19-08-2008 à 17:02:36   

Reply

Marsh Posté le 20-08-2008 à 10:43:37    

essaye avec quelque chose comme ca (a adapter, jai pas tous compris cest koi tes i et j ?)
 
 
Sub DessinerSurface()
for A=1 to 12 step 1
for B=0 (pas bien B=1 to 6) to 5 step 1
sheets.add
nom=activesheets
sheets(nom).name="Don"&A&"_Param"&B
Charts.Add
   ActiveChart.ChartType = xlSurface
   ActiveChart.SetSourceData Source:=Sheets("Resultats" ).Range("&chr(B)&A&":"chr(B)&A&" ), _
        PlotBy:=xlColumns (peut etre remplace & par +)
    ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="Don"&A&"_Param"&B
    With ActiveChart
        .HasTitle = True
        .ChartTitle.Characters.Text ="Don"&A&"_Param"&B
        .Axes(xlCategory).HasTitle = False
        .Axes(xlSeries).HasTitle = False
        .Axes(xlValue).HasTitle = False
    End With
next B
next A
End Sub
 


Message édité par 86vomito33 le 20-08-2008 à 10:44:17
Reply

Marsh Posté le 20-08-2008 à 14:15:28    

Merci vomito pour cette réponse. Je vais tester ton code mais j'aimerais comprendre comment tout ça marche :
- OK pour l'indexation, ce n'est pas trop un problème pour moi qu'elle commence à 1 au lieu de 0, je peux faire les modifs là où elles sont nécessaires ;
- Pourquoi le sheets.add ? Ca ne risque pas d'ajouter autant de feuilles que de graphiques ?
- Merci pour la concaténation des chaînes, j'avais trouvé la même chose entre temps, et tu confirmes donc super.
- On arrive au choses sérieuses ; si je comprends je peux entrer dans un Range l'équivalent de Cells(A,B) en écrivant "chr(B)&A" ? J'ai testé la fonction chr(entier) mais chez moi ça produit des carrés (donc il ne comprend pas le caractère en question).
Cela dit tu me donnes une idée, ce n'est certainement pas ce qu'il y a de plus simple ni de plus propre mais je peux écrire une fonction à base de congruences modulo 26 qui transforme nombre en lettres, genre 8 en H, 28 en AB, 58 en BF etc. Bon enfin je vais quand même expérimenter avec tes idées, merci encore pour ta contribution.
 
Sinon, aucune idée pour le réglage de la vue 3D ?

Reply

Marsh Posté le 20-08-2008 à 16:01:34    

mouletabille a écrit :

Merci vomito pour cette réponse. Je vais tester ton code mais j'aimerais comprendre comment tout ça marche :
- OK pour l'indexation, ce n'est pas trop un problème pour moi qu'elle commence à 1 au lieu de 0, je peux faire les modifs là où elles sont nécessaires ;
- Pourquoi le sheets.add ? Ca ne risque pas d'ajouter autant de feuilles que de graphiques ?
 

mouletabille a écrit :

Bonjour à tous,
 
Voilà mon problème : j'ai une feuille Excel avec un certain nombre de tableaux de nombres, tous de la même taille, et je voudrais pour chaque tableau produire une représentation graphique sous forme de surface, dans une nouvelle feuille.
j'ave compris un graph par feuille


 
- Merci pour la concaténation des chaînes, j'avais trouvé la même chose entre temps, et tu confirmes donc super.
- On arrive au choses sérieuses ; si je comprends je peux entrer dans un Range l'équivalent de Cells(A,B) en écrivant "chr(B)&A" ? J'ai testé la fonction chr(entier+64 dsl) mais chez moi ça produit des carrés (donc il ne comprend pas le caractère en question).
Cela dit tu me donnes une idée, ce n'est certainement pas ce qu'il y a de plus simple ni de plus propre mais je peux écrire une fonction à base de congruences modulo 26 qui transforme nombre en lettres, genre 8 en H, 28 en AB, 58 en BF etc. Bon enfin je vais quand même expérimenter avec tes idées, merci encore pour ta contribution.
a priori ton fonction à base de congruences modulo 26=chr(...+64)
Sinon, aucune idée pour le réglage de la vue 3D ?


Message édité par 86vomito33 le 20-08-2008 à 16:03:56
Reply

Marsh Posté le 20-08-2008 à 16:37:50    

Oui OK chr(entier) ça doit donner le caractère correspondant au code ASCII entier et effectivement à partir de 65 on obtient les majuscules de A à Z mais problèmes après ça ne continue pas par AA..AZ, BA..BZ, etc. D'où l'idée de ma procédure à base de modulo : écrire mon entier en base 26 en fait.
 
Bon mais je vais opter pour plus simple avec un Select Case sur l'entier en donnant les bonnes colonnes pour chaque cas (vu que je n'ai que 6 valeurs pour mon entier B ça va aller) ; du genre :
 
Select Case B
   Case 0
      ColonneInitiale = "AB"
      ColonneFinale = "BD"
   Case 1
     etc
End Select
 
Ensuite je rentre dans mon Range :  
 
ColonneInitiale(B) & LigneInitiale(A) & ":" & ColonneFinale(B) & LigneFinale(A)
 
Donc là ça roule.  
 

Reply

Marsh Posté le 20-08-2008 à 18:00:40    

J'ai finalement trouvé comment modifier les propriétés de vue 3D de mon graphique, il s'agit d'aller modifier les propriétés Elevation, Rotation et Perpective de l'objet ActiveChart.
 
Il me reste donc un seul problème, que je n'avais pas détecté au départ : le type de graphique "xlSurface" et ses dérivés ne fonctionnent pas ! J'obtiens Erreur d'exécution '1004': La méthode 'ChartType' de l'objet '_Chart' a échoué. Ca marche si je remplace par "xl3DArea" par exemple, mais évidemment ce n'est pas ce que je veux. Et pourtant le code de la Sub est mot-à-mot celui de la macro enregistrée.. c'est à n'y rien comprendre.
 
Please help !

Reply

Marsh Posté le 21-08-2008 à 09:59:47    

Alors, personne n'aurait une petite idée de comment résoudre cette erreur 1004 ?

Reply

Marsh Posté le 21-08-2008 à 10:40:46    

Bon, et bien j'ai fini par trouver la réponse à mon problème sur un forum anglophone : on commence par créer un graphique de type xl3DArea et au dernier moment on change la propriété ChartType à la valeur xlSurface. Intuitif non ?
 
Merci à vomito et aux autres pour leur participation discrète mais efficace !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed