Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3078 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1774525
mouletabil​le
Posté le 19-08-2008 à 17:02:36  profilanswer
 

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
mood
Publicité
Posté le 19-08-2008 à 17:02:36  profilanswer
 

n°1774765
86vomito33
Posté le 20-08-2008 à 10:43:37  profilanswer
 

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
n°1774926
mouletabil​le
Posté le 20-08-2008 à 14:15:28  profilanswer
 

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 ?

n°1775020
86vomito33
Posté le 20-08-2008 à 16:01:34  profilanswer
 

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
n°1775030
mouletabil​le
Posté le 20-08-2008 à 16:37:50  profilanswer
 

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.  
 

n°1775109
mouletabil​le
Posté le 20-08-2008 à 18:00:40  profilanswer
 

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 !

n°1775326
mouletabil​le
Posté le 21-08-2008 à 09:59:47  profilanswer
 

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

n°1775373
mouletabil​le
Posté le 21-08-2008 à 10:40:46  profilanswer
 

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 !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 

Sujets relatifs
[RESOLU]SOAP & WSDL (java6)[RESOLU] [EXCEL] rechercher un caractere dans un texte
[VBA] concaténer une chaîne de caractère dans une date[VBA] Importation de modules 1 seul fois
[résolu] visual c++ 2008 équivalent de l'app.path [résolu]Sélection de données après filtre excel et envoi par Outlook
[résolu] pb fonctions javascriptRequete site web à la manière d'excel mais en plus grand
[RESOLU] Assistant d'installation pour programme Java [newb inside] 
Plus de sujets relatifs à : Tracer des graphiques à la chaînes avec Excel/VBA [Résolu]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR