Création & manipulation de graphiques

Créer un graphique en affectant son objet à une variable pour une manipulation simplifiée
La méthode Debug.Print affiche le résultat des instructions dans la fenêtre d'exécution (ctrl + G)

Sub Tester()
Set mongraphique = ActiveSheet.ChartObjects.Add(250, 430, 500, 300)
Debug.Print TypeName(mongraphique); mongraphique.Name
Debug.Print TypeName(mongraphique.Chart), mongraphique.Chart.Name

End Sub

Effacer un graphique : Activesheet.Chartobjects(3).Delete

 


 

Titre d'un graphique Ne pas représenter les valeurs manquantes

Les valeurs manquantes sont représentées comme des valeurs zéro.Ce que je voudrais c'est que les valeurs manquantes ne soient pas représentées et que les points ne se positionnent sur les graphiques que lorsque les valeurs sont saisies dans le tableau de stockage
Solution :
=> entrez #N/A dans les cellules des valeurs manquantes.
=> outils/ options/ Graphique => il y a une option à décocher.

Le titre dépend d'une formule

Dans une cellule => sélectionner le titre, et dans la zone nom écrivez =A1 si le titre est en A1.
Vous pouvez bien sûr écrire ce que vous voulez en A1, ce qui peut donner : ="Résultat du mois de " & B1

Voici comment procéder avec des instructions VBA.
activesheet.ChartObjects("Chart 1").Activate
ActiveChart.ChartTitle.select
selection.Text = "=Sheet1!R4C3"

Le titre dépend de la valeur d'un filtre
De: L.L., objet: "Re: Passage du critère de filtre dans une cellule ou une variable", date : jeudi 20 avril 2000 01:19

Dim WithEvents Graph As Chart
Const NumCol As Integer = 1

Private Sub Graph_Calculate()
Dim Titre As String
With sheets("Feuil1").AutoFilter.range _
.Columns(NumCol).SpecialCells(xlCellTypeVisible)
If .Areas.Count = 1 Then Titre = .Item(2).Text _
Else Titre = .Areas(2).Text
End With
If Not Graph.HasTitle Then
Application.ScreenUpdating = False
Graph.HasTitle = True
End If
If Graph.ChartTitle.Text <> Titre Then Graph.ChartTitle.Text = Titre
End Sub

Private Sub Workbook_Open()
Set Graph = sheets("Feuil1").ChartObjects(1).Chart
End Sub

Suggestion en cas de zones sources non adjacentes : news

Graphique réalisé depuis un tableau variable (C.H.) !!!

Solution : utiliser une référence dynamique à une plage de cellules

- Menu Insertion puis Nom puis Définir
- entrer les fonctions suivantes dans le champ références:
=decaler(feuil1!$A$1;0;0;nb(feuil1!$A:$A)-1)
- entrer Abscisse ou n'importe quel nom dans le champ "nom dans le classeur"
- recommencer la manip pour les ordonnées (en changeant les réfs et le nom)
- créer le graph avec les données disponibles
- cliquer sur la série de données
- modifier la formule:
=SERIES( ; Feuil1!abcsisse; feuil1!ordonnée; 1)
Noter que le point virgule (;) peut être une virgule selon la configuration locale.

voir aussi : http://www.stfx.ca/people/bliengme/exceltips.htm#Dynamic%20chart

Modifier le nom d'un graphique

si le graphique est créé par VBA,
Set nvgr = Charts.Add
permet de donner nvgr comme nom à l'objet graphique que l'on peut alors
faciulement manipuler :
nvgr.ChartType = xlLineMarkers
nvgr.SetSourceData Source:=sheets("Feuil1").range("A1:B7")
nvgr.Name = "tt"
Sinon, juste après la création du graphique, on peut le renommer par
ActiveChart.Name=...
ou bien on peut nommer l'objet par Set ActiveChart = Zaza


Le graphique & ses courbes

Avoir plusieurs courbes sur le même graphique

1)Sélectionner les nouvelles abscisses & ordonnées,
2)Faites <<Copier>>,
3)Activer le graphique existant (en cliquant dessus),
4)Utiliser la commande Edition/Collage spécial. Dans la boîte de dialogue, spécifiez les nouvelles séries et la colonne/ligne qui contient les valeurs en abscisses.
5)Votre graphique a maintenant vos deux séries de données.

2 courbes sur un même graphe

L'une utilisant l'axe des ordonnées classique et l'autre un autre axe sur la droite et, en +, celui ci allant de 100 à 0 en ordre décroissant (de 0 à 100 de haut en bas). Inspiré d'un message sur le forum microsoft.public.fr.excel le 15/01/200 "Re : 2 axes des ordonnées".

Sur ta deuxième série, Clic Droit, Format de la série de données [sélection de l'axe] Axe secondaire. Puis sur ce deuxième axe à droite, Clic Droit Format de l'axe [échelle], et cocher Valeurs en ordre inverse.

Ajouter la courbe moyenne de vos données.

Rajouter des valeurs à vos données de la manière suivante :
Soit des données en A2:L2, saisissez AVERAGE(A2:L2) en A3, puis =A3 en B3, & copier les données jusqu'à L3.
Lancer maintenant l'assistant graphique, vous verrez alors cette ligne moyenne.

Cf http://www.deja.com/getdoc.xp?AN=538033767&fmt=text

Dixit L.L => "J'ajouterais à cette réponse qu'il est possible également de se passer d'une colonne supplémentaire contenant la moyenne dupliquée X fois dans la plage source, mais c'est un peu compliqué. Il faut pour cela affecter une matrice de constantes comme valeurs de la série contenant la moyenne, et ensuite utiliser sous VBA la procédure événementielle Calculate du graphique pour recalculer automatiquement la nouvelle moyenne à chaque changement dans les données sources et réaffecter cette moyenne à la série, de manière à ce que la ligne de tendance soit ajustée à chaque fois à la hauteur correspondante."

Trouver un point d'intersection : news
Axe à abcisse automatique
: news
Etiquettes textes DANS les rectangles correspondants de l'histogramme ?

Excel propose de les mettre au-dessus ou au-dessous du graphique ; mais dans les rectangles ?
il faut sélectionner les étiquettes une fois qu'elles sont créées (et non pas la série), puis faire format -> Etiquettes de données sélectionnées -> onglet "Alignement", et mettre l'option "Position" sur "Centré".

Afin d'appliquer un format de pourcentage sur les etiquettes des abscisses, procédez comme suit
De: Georges Lucas, "Re: Histogramme s/xl97", lundi 31 janvier 2000 12:31

-double cliquez sur l'axe des abscisses.
-Dans la boite de dialogue apparaissant à l'écran , cliquez sur l'onglet 'Nombre'.
-Choisissez le format 'Pourcentage' apparaissant dans l'encadré 'catégories'.
-Cliquez sur 'Ok'.

Dessinez une droite de régression avec VBA & la fonction VBA Linest

Soit vous récupérez les données d'une feuille, soient vous assignez les valeurs à des variables tableaux. La seconde alternative a été marquée comme commentaire dans les lignes de code ci-dessous.

' y = array(100, 120, 135, 150)
y = range("A1:A4").value
' x = array(18, 20, 30, 35)
x = range("B1:B4").value
result = application.LinEst(y, x, , true)
range("H1:I5").value = result
msgbox result(1, 2)

Autre utilisation de linest() : news


Soit 2 colonnes de données, comment connaitre la fonction d'une droite qui décrirait le nuage de points
: news

Colorier l'aire sous jacente d'une courbe tracée en mode "nuage de points"
: voir la conversation "Re: Graphique aire + nuage de points ???" sur le forum microsoft.public.fr.excel au mois d'août 2000

Croisement de l'axe x avec l'axe y déterminé par la valeur de la cellule A1

Inspirée du message du 26/08/1999 sur microsoft.public.fr.excel, sujet : "Re: axe varible", microsoft.public.fr.excel)

ChartObjects(1).Chart.Axes(xlValue).CrossesAt = [A1]

Pour faire en sorte que l'axe se repositionne automatiquement dès que la valeur de cette cellule change, tu peux utiliser la macro suivante, à entrer dans le module de code de la feuille contenant le graphique (Excel 97 et sup.)

Private Sub Worksheet_Change(ByVal Target As Excel.range)
If Target.Address = "$A$1" Then _
ChartObjects(1).Chart.Axes(xlValue).CrossesAt = [A1]
End Sub

Afficher sur une feuille graphique "chart" une série de segments parallèles espacés régulièrement : news

Soit un graphique (x,y), je ne veux voir apparaitre que les valeurs associées, pour chaque point de la série on reporte avec un trait en pointillé la valeur sur x et sur y : news

Bâtir un histogramme avec une ligne horizontale indiquant un seuil déterminé d'avance :

L'idée est un histogramme qui peut être mis à jour régulièrement mais avec une ligne qui ne bouge pas et qui indique soit le seuil, minimum, maximum, moyenne,etc. Jetez un coup d'oeil là : news (web)

Lier le graphique à un contrôle type spinner : news

 


 

Types de graphique Créer un nouveau type personnalisé de graphique par C. H.

Créer d'abord le graphique désiré, puis :
- cliques droit sur le graph
- type de graphiques
- onglet types personnalisés
- coche types personnalisés
- bouton Ajouter
- donne lui un nom
Quand vous créerez un nouveau graphique, il suffira de sélectionner ce type personnalisé sans passer par la cascade d'étape habituelle.

Quel type utilisé de graphique préconiser par C. H.

Utiliser le format "nuage de points" pour représenter une variable en fonction d'une autre (Y f de X).
Utiliser les autres formats pour représenter une seule variable ou pour représenter une variable en utilisant une autre variable en guise d'étiquettes.

Liens sur la personnalisation des types de graphique : news

Ajouter des effets ou des images à un graphique : sélectionner le graph et faire Format\Select Plot Area puis Fill effects et là, on trouve plein d'options.

Qu'est-ce qu'un graphique type bulle
: news
Lien sur le graphique type Tornado
(bar chart that is used in decision analysis) : news
Graphique type Pyramide des âges
: news

Des infos sur Microsoft Map
: je n'ai rien de bien intéressant mais vous devez pouvoir trouver sur le site de Microsoft un article de Riki Shore intitulé "S'il te plaît, Map, dessine-moi une carte", sur "l'Utilisation de Microsoft Map pour afficher vos données géographiques".

 


 

Lier par VBA les couleurs de segment d'un graphique à d'autres valeurs :

Dans un graphique (un camembert éclaté), j'aimerais que la couleur de mes segments soit fonction de la légende et non pas aléatoire. J'ai une base de données avec les correspondances entre couleurs et légendes mais je n'arrive pas à la mettre en relation avec mon graphique.

Réponse par J@C, sujet : "Re: pb de couleur de graphique", le lundi 8 novembre 1999 21:34. Retrouver ce message ici : news

On suppose que le graphique s'appelle Graphique1 dans la feuille Feuil1. On a, quelque part dans Feuil1 une liste des étiquettes du graphique (plage de cellules nommée "palette"), chaque fond de cellule étant de la couleur correspondant à l'étiquette (Format / cellules / motif pour choisir la couleur).

En recopiant la macro ci-dessous dans un module du classeur, on peut adapter la couleur de chaque tranche de camembert en fonction du nom de l'étiquette

Sub couleur_des_yeux_de_zaza()
sheets("feuil1").ChartObjects("Graphique 1").Activate
For Each ppt In ActiveChart.SeriesCollection(1).Points
étiq = ppt.DataLabel.Caption
sheets("feuil1").range("palette").Select
Selection.Find(What:=étiq, After:=ActiveCell).Activate
couleur = ActiveCell.Interior.ColorIndex
sheets("feuil1").ChartObjects("Graphique 1").Activate
ppt.Interior.ColorIndex = couleur
Next
sheets("feuil1").Cells(1).Select
End Sub

L'exemple suivant boucle justement sur chaque série du premier graphique de la feuille feuil1 (nom de la feuille de code)

Sub ChangeColour()
Dim chrt As Chart, ng As range, sr As Series,c As Integer,v As Variant
Set chrt = feuil1.ChartObjects(1).Chart
With chrt
For Each sr In .SeriesCollection
For c = 1 To UBound(sr.Values)
Select Case sr.Values(c)
Case 1 To 5 : sr.Interior.ColorIndex = 3
Case 6 To 10: sr.Interior.ColorIndex = 5
End Select
Next
Next
End With
End Sub

 


 

Exporter les graphiques au format image Gif

dim Graph As ChartObject
for each Graph In activesheet.ChartObjects
Graph.Chart.Export Filename:=Graph.name & ".gif", Filtername:="GIF"
next Graph

Voir aussi la page "Saving Charts in Other Formats" sur le site de John Walkenbach

Fixer la couleur d'une série d'un graphique

Worksheets(MaFeuille).ChartObjects(MonCamembert).Chart.SeriesCollection(1).Interior.Color = Couleur souhaitee pour la série 1
A répéter bien sur pour chaque série.

 



Les limites d'Excel quand on parle de graphique !

en appliquant une macro du type suivant :
For i = 1 To intNumberOfScans * intNumberOfVisits
sheets("Graphs").Paste
Next i
Excel plante et affiche le message Not Enough Memory.

La résolution passe par la mise à jour d'excel 97 avec le correctif SR-2 et par quelques changements dans la base de registres ou out simplement, le déplacement de ces graphiques dans un autre classeur (?). Regardez l'article suivant pour en savoir plus : XL97: "Not Enough Memory" Error Adding Chart to Workbook


 

Manipuler les graphiques de MS Graph : http://support.microsoft.com/support/kb/articles/Q190/2/39.ASP Imprimer la liste des graphiques

Sub lister_graph()
dim objcht As ChartObject
dim cht As Chart
for each objcht In activesheet.ChartObjects
Set cht = objcht.Chart
Debug.Print cht.name, objcht.name
next
end Sub

Lister les graphiques dans une listbox & atteindre le graphique sélectionné : news (anglais)
Comment gérer un évènement type mouseover avec un graphique : news (anglais)

Coller un graphique dans un autre classeur excel et le rendre independant d'un tableau de données

Eric J, "Re: Help VBAExcel", date : dimanche 7 mai 2000 20:32
Avec copier l'image (appuyer sur chift en même temps que menu édition/copier). En enregistreur, ça donne :

ActiveSheet.ChartObjects("Graphique 1").Activate
ActiveChart.ChartArea.Select
ActiveChart.CopyPicture Appearance:=xlPrinter, Size:=xlScreen, Format:= xlPicture
ActiveWindow.Visible = False
Workbooks.Add Template:="Classeur"
ActiveSheet.Paste

 


 

Graphs excel et le web : message diffusé sur un newsgroup (10/11/99, excel.charting)

We have developed an ActiveX which wraps Excel and exposes its charting capabilities in a very simple to use fashion. It can be used with VB or ASP. resides on server, no client activeX etc. required exports to GIF outstanding effects. values can be input directly from ADO recordset Its free. Just email us at vikash_agarwal@hotmail.com or rohitn@iname.com with subject excel chart and we will mail it to you free.

Logiciel gratuit pour réaliser des graphiques 3D : ftp://ftp.faf.cuni.cz/mswindows/GNUPLOT & ftp://ftp.ird.ub.es/public/mac/grafics/Gnuplot

 


 

Evènements de l'objet Chart

Les événements de graphique surviennent lorsque l'utilisateur active ou modifie un graphique. Les événements de feuilles graphiques sont activés par défaut. Pour afficher les procédures d'événements d'une feuille, cliquez avec le bouton droit de la souris sur l'onglet de feuille et sélectionnez Code dans le menu contextuel. Sélectionnez le nom de l'événement dans la zone de liste déroulante Procédure.

Activate
BeforedoubleClick
BeforeRightClick
Calculate
Deactivate
DragOver
DragPlot
Mousedown
MouseMove
MouseUp
Resize
Select
SeriesChange

Note : Pour écrire des procédures d'événements pour un graphique incorporé, vous devez créer un objet à l'aide du mot clé WithEvents dans un module de classe. Pour plus d'informations, consultez Utilisation d'événements avec des graphiques incorporés.

Cet exemple montre comment modifier la couleur de bordure d'un point lorsque l'utilisateur modifie la valeur du point.

Private Sub Chart_SeriesChange(ByVal SeriesIndex As long, _
ByVal PointIndex As long)
Set p = ActiveChart.SeriesCollection(SeriesIndex). _
Points(PointIndex)
p.Border.ColorIndex = 3
End Sub

 


 

Utilisation d'événements avec des graphiques incorporés

Par défaut, les événements sont activés pour les feuilles graphiques. Avant d'utiliser des événements avec un objet Chart représentant un graphique incorporé, vous devez créer un nouveau module de classe et déclarer un objet de type Chart avec des événements. Par exemple, supposons qu'un nouveau module de classe est créé et nommé « EventClassModule » ; il contient le code suivant :

Public WithEvents myChartClass As Chart
Après que le nouvel objet a été déclaré avec événements, il apparaît dans la zone de liste déroulante Objet dans le module de classe et vous pouvez écrire des procédures d'événements pour cet objet. Lorsque vous sélectionnez le nouvel objet dans la zone Objet, les événements valides pour cet objet sont listés dans la zone de liste déroulante Procédure.

Mais avant l'exécution de vos procédures, vous devez connecter l'objet déclaré dans le module de classe avec le graphique incorporé. Faites-le en utilisant le code suivant à partir d'un module quelconque.

Dim myClassModule As New EventClassModule

Sub InitializeChart()
Set myClassModule.myChartClass = _
Worksheets(1).ChartObjects(1).Chart
End Sub
Après avoir lancé la procédure InitializeChart, l'objet myChartClass du module de classe pointe sur le graphique incorporé 1 de la feuille de calcul 1 et les procédures événement du module de classe s'exécuteront lorsque les événements surviendront.

 


 

'The following technique allows you to highlight data in a worksheet while displaying an Userform that presents the data in chart form when the focus returns to the Userform. This action can be repeated as many 'times as desired before closing the Userform.

'Place the event procedures in the module for an Userform that is named chartssUserform and the MakeNewChart procedure in a module in the same 'workbook. The Userform needs to have a Spreadsheet object named Spreadsheet1 (which is not visible) and a ChartSpace object named ChartSpace1 (which is 'visible). The two events in the Userform module each call the same 'procedure. This is a workaround for the lack of an event that is triggered 'when an Userform loses or gains focus. A modeless Userform is created in 'Excel 2000 by setting the showModal property to false in the Properties box.

'Private Sub ChartSpace1_Click(ByVal ChartEventInfo As OWC.WCChartEventInfo)
' MakeNewChart
'end Sub

Private Sub Userform_Click()
MakeNewChart
end Sub

Sub MakeNewChart()

On Error Goto NoChart

with chartssUserform
.ChartSpace1.Clear
.ChartSpace1.Charts.add
.ChartSpace1.DataSource = .Spreadsheet1
.Spreadsheet1.cells.Clear
application.screenupdating = false
selection.Copy
sheets.add
range("a1").PasteSpecial
selection.Copy
.Spreadsheet1.activesheet.range("a1").Paste
application.DisplayAlerts = false
ActiveWindow.selectedsheets.delete
application.DisplayAlerts = true
application.screenupdating = true
Set cr = .Spreadsheet1.activesheet.cells(1, 1).CurrentRegion
TheMax = application.Worksheetfunction.Max(range(cr.address))
Therows = cr.rows.count
TheCols = cr.Columns.count
end with

with chartssUserform.ChartSpace1.Charts(0)

for NumSeries = 1 to TheCols - 1
.SeriesCollection.add
next

for n = 0 to TheCols - 2

with chartssUserform.Spreadsheet1.activesheet

theseriesnamesrange = .cells(1, n + 2).address

thecatagoriesrange = .range(.cells(2, 1), _
.cells(Therows, 1)).address

thevaluesrange = .range(.cells(2, n + 2), .cells(Therows, n + 2)).address

end with

with chartssUserform.ChartSpace1.Charts(0).SeriesCollection(n)
.SetData chdimSeriesnames, 0, theseriesnamesrange
.SetData chdimCategories, 0, thecatagoriesrange
.SetData chdimvalues, 0, thevaluesrange
end with

next

.HasLegend = true
.Axes(chAxisPositionLeft).Numberformat = "General"
.Axes(chAxisPositionLeft).Majorunit = 0.1 * TheMax

end with

chartssUserform.show

Exit Sub
NoChart:
msgbox "Your data range is not valid!", , "Try again"
end Sub