Création & manipulation de graphiques
Créer un graphique en affectant son objet à une variable pour une manipulation simplifiéeEffacer un graphique : Activesheet.Chartobjects(3).DeleteSub 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
Titre d'un graphique Ne pas représenter les valeurs manquantes
Le titre dépend d'une formuleLes 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 de la valeur d'un filtreDans 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 " & B1Voici comment procéder avec des instructions VBA.
activesheet.ChartObjects("Chart 1").Activate
ActiveChart.ChartTitle.select
selection.Text = "=Sheet1!R4C3"
Suggestion en cas de zones sources non adjacentes : newsDim WithEvents Graph As Chart
Const NumCol As Integer = 1Private 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 SubPrivate Sub Workbook_Open()
Set Graph = sheets("Feuil1").ChartObjects(1).Chart
End Sub
Modifier le nom d'un graphiqueSolution : 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
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
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
Ajouter la courbe moyenne de vos données.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.
Trouver un point d'intersection : newsRajouter 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."
Afin d'appliquer un format de pourcentage sur les etiquettes des abscisses, procédez comme suitExcel 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é".
Dessinez une droite de régression avec VBA & la fonction VBA Linest-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'.
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
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 :
Lier le graphique à un contrôle type spinner : newsL'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)
Types de graphique Créer un nouveau type personnalisé de graphique par C. H.
Quel type utilisé de graphique préconiser 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.
Liens sur la personnalisation des types de graphique : newsUtiliser 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.
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 : newsOn 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
Fixer la couleur d'une série d'un graphiquedim Graph As ChartObject
for each Graph In activesheet.ChartObjects
Graph.Chart.Export Filename:=Graph.name & ".gif", Filtername:="GIF"
next GraphVoir aussi la page "Saving Charts in Other Formats" sur le site de John Walkenbach
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 :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
Lister les graphiques dans une listbox & atteindre le graphique sélectionné : news (anglais)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
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