FAQ VBA

FAQ VBAConsultez toutes les FAQ
Nombre d'auteurs : 10, nombre de questions : 133, dernière mise à jour : 15 juin 2021
Sommaire→Excel→Graphiques- Quelles sont les méthodes pour créer un graphique ?
- Comment créer un graphique composé ?
- Comment ajouter du texte sur un graphique ?
- Comment lister tous les graphiques d'un classeur ?
- Comment vérifier si un graphique existe dans une feuille ?
- Comment créer un graphique à partir de tableaux dynamiques ?
- Comment insérer l'image d'un graphique dans un commentaire ?
- Comment appliquer un format particulier pour une des séries du graphique ?
- Comment extraire les valeurs de chaque série d'un graph ?
- Comment afficher l'évolution d'une série en fonction du point précédent ?
- Comment imprimer un graphique ?
- Comment empecher le copier/coller d'une feuille graphique ?
Il en existe vraiment plusieurs, je ne vais vous donner ici que les principales. Par interprétation de la selection. Ce type de création est peu souple et souvent source d'erreur.
Range("A1").CurrentRegion.Select
ThisWorkbook.Charts.AddLe graphique créera des abscisses par défaut. Cela veut dire aussi qu'une plage sélectionnée avant la création d'un graphique sera tracée à la création de celui-ci. Avec SourceData. Si votre tableau est continu avec les abcisses à gauche, c'est la méthode la plus rapide
Dim objChart As Chart, objRange As Range
Set objRange = Worksheets("Feuil1").Range(Worksheets("Feuil1").Cells(1, 1), Worksheets("Feuil1").Cells(21, 3))
Set objChart = ThisWorkbook.Charts.Add
objChart.ChartType = xlXYScatter
objChart.SetSourceData objRange, xlColumnsIl existe une autre syntaxe équivalente
Dim objChart As Chart, objRange As Range
Set objRange = Worksheets("Feuil1").Range(Worksheets("Feuil1").Cells(1, 1), Worksheets("Feuil1").Cells(21, 3))
Set objChart = ThisWorkbook.Charts.Add
objChart.ChartType = xlXYScatter
objChart.SeriesCollection.Add objRange, xlColumns, True, TruePar manipulation de séries
Dim objChart As Chart, objRange As Range, MaSerie As Series, compteur As Long
Set objRange = Worksheets("Feuil1").Range(Worksheets("Feuil1").Cells(1, 1), Worksheets("Feuil1").Cells(21, 3))
Set objChart = ThisWorkbook.Charts.Add
objChart.ChartType = xlXYScatter
objChart.SeriesCollection.Add objRange, xlColumns, True, True
For compteur = 2 To objRange.Columns.Count
Set MaSerie = objChart.SeriesCollection.NewSeries
MaSerie.Values = "=" & objRange.Columns(compteur).Address(True, True, xlR1C1, True)
MaSerie.XValues = "=" & objRange.Columns(1).Address(True, True, xlR1C1, True)
Next compteurIl faut d'abord créer le graphique puis manipuler les séries
Public Sub CreationGraphe1()
Dim MonGraphe As Chart, MaPlage As Range
Set MaPlage = Worksheets("donnees").Range(Cells(2, 7), Cells(14, 12))
Set MonGraphe = ThisWorkbook.Charts.Add
MonGraphe.ChartType = xlColumnStacked100
MonGraphe.SetSourceData MaPlage, xlColumns
With MonGraphe.SeriesCollection(5)
.ChartType = xlXYScatterSmoothNoMarkers
.AxisGroup = 2
With .Border
.Weight = xlMedium
.LineStyle = xlAutomatic
.ColorIndex = 4
End With
End With
With MonGraphe
.HasTitle = True
With .ChartTitle
.Characters.Text = "ANNEE 2001"
.Shadow = True
.Border.Weight = xlHairline
End With
With .Axes(xlValue, xlPrimary)
.HasTitle = True
.AxisTitle.Characters.Text = "Proportion"
End With
With .Axes(xlValue, xlSecondary)
.HasTitle = True
.AxisTitle.Characters.Text = "Total (hrs)"
End With
End With
End SubIl est possible de manipuler des objets Shapes sur une feuille graphique
ActiveChart.Shapes.AddTextbox(msoTextOrientationHorizontal, 100, 100, 100#, 100#).Select
Selection.Characters.Text = "Le Texte"Cette procédure permet de boucler sur tous les onglets du classeur et de lister les feuilles graphiques (Charts) ainsi que les graphiques incorporés (ChartObjects).
Private Sub CommandButton1_Click()
Dim j As Byte, i As Byte
Dim Ch As Chart
'Recherche les onglets graphiques
For Each Ch In Charts
Debug.Print "Feuille graphique " & vbTab & Ch.Name
Next Ch
'Boucle sur tous les onglets du classeur
For j = 1 To Sheets.Count
'Recherche les graphiques incorporés dans la feuille
For i = 1 To Sheets(j).ChartObjects.Count
Debug.Print "Nom: " & Sheets(j).ChartObjects(i).Name & vbTab & _
" dans " & Sheets(j).Name
Next i
Next j
End SubCet exemple vérifie si un graphique nommé "Graphique 1" existe dans la Feuil2
Dim Grph As ChartObject
On Error Resume Next
Set Grph = Sheets("Feuil2").ChartObjects("Graphique 1")
If Not Grph Is Nothing Then MsgBox "Le graphique existe"
La première partie de la procédure permet de remplir deux tableaux.
Ces tableaux sont ensuite utilisés pour alimenter les valeurs d'ordonnées et d'abscisses.
Sub creationGraphiqueParTableau()
Dim i As Byte
Dim Tableau(10) As Integer, Tableau2(10) As Integer
'Création du tableau pour les Abscisses
For i = 1 To 10
Tableau(i) = i * 2
Next i
'Création d'un tableau pour les Ordonnées
For i = 1 To 10
'Le tableau est rempli par des valeurs aléatoires pour
'cet exemple
Tableau2(i) = Int((50 * Rnd) + 1)
Next i
'Création graphique
Charts.Add
'Définit la localisation du graphique:
'dans la feuille de calcul Feuil1 pour cet exemple
ActiveChart.Location _
Where:=xlLocationAsObject, Name:="Feuil1"
'Ajoute une série dans le graphique
With ActiveChart
.SeriesCollection.NewSeries
.SeriesCollection(1).XValues = Tableau() 'Abscisses
.SeriesCollection(1).Values = Tableau2() 'Ordonnées
'Définit le type (Courbe)
.ChartType = xlLine
End With
End SubRemarque:
Cette méthode est limitée par le nombre de caractères que vous pourrez insérer dans la barre de formules (La fonction qui s'affiche lorsque vous sélectionnez une série dans le graphique)
Par exemple:
=SERIE(;{0.1.2.3.4.5.6.7.8.9.10};{36.13.10.45.21.44.40.19.49.44};1)
Cette limite est d'environ 450 caractères.
Cet exemple exporte un graphique au format image GIF pour ensuite l'insérer comme image de fond dans le commentaire d'une cellule.
Cette solution prend un peu d'espace mémoire mais permet de stocker avantageusement un graphique (ou plutôt son image) quand on manque de place dans une feuille de calcul.
Sub ImageGraphiqueDansCommentaire_CelluleA1()
Dim nomImage As String
Dim Grph As ChartObject
Dim Hauteur As Single, Largeur As Single
nomImage = "C:\imageTemp.gif"
'Définit le 1er graphique dans la Feuil1
Set Grph = Feuil1.ChartObjects(1)
'Exporte le graphique au format image GIF
Grph.Chart.Export nomImage, "GIF"
'récupère la dimension du graphique pour l'appliquer au commentaire
Hauteur = Grph.Height
Largeur = Grph.Width
'Vérifie s'il existe déja un commentaire dans la cellule A1
'et le supprime si c'est le cas
If Not Feuil1.Range("A1").Comment Is Nothing Then _
Feuil1.Range("A1").Comment.Delete
'Creation du nouveau commentaire dans la cellule A1
With Feuil1.Range("A1")
.AddComment
.Comment.Visible = False
'Définit la hauteur du commentaire
'le graphique
.Comment.Shape.Height = Hauteur
'Définit la largeur du commentaire
.Comment.Shape.Width = Largeur
'Insère l'image dans le commentaire
.Comment.Shape.Fill.UserPicture nomImage
End With
'Supprime l'image exportée
Kill nomImage
'Supprime le graphique
Grph.Delete
End SubSi vous utilisez un graphique de type histogramme composé de plusieurs séries, vous pouvez spécifier qu'une des séries doit être de type courbe (Pour par exemple créer une ligne de repère).
'Définit un type d'affichage spécifique pour la 1ere série du graphique
'xlLine = Courbe
Feuil1.ChartObjects(1).Chart.SeriesCollection(1).ChartType = xlLine
Lorsqu'un graphique a perdu ses liaisons vers la source de données, la question peut se poser de savoir comment extraire les différentes valeurs contenues dans chaque série.
Une solution consiste à boucler sur tous les points afin d'en récupérer les valeurs.
Les étiquettes doivent impérativement être affichées (HasDataLabel = True) pour que les données puissent être récupérées.
Sub extractionValeursOrdonnees_Series()
Dim Cible As ChartObject
Dim i As Integer, j As Integer
'Définit le 1er graphique de la Feuil1
Set Cible = Feuil1.ChartObjects(1)
'Boucle sur toutes les séries du graphique
For j = 1 To Cible.Chart.SeriesCollection.Count
'Récupère le nom de la série
Debug.Print Cible.Chart.SeriesCollection(j).Name & ":"
'boucle sur tous les points de la série
For i = 1 To Cible.Chart.SeriesCollection(j).Points.Count
With Cible.Chart.SeriesCollection(j).Points(i)
'Affiche les étiquettes
.HasDataLabel = True
'Extrait la valeur du point
Debug.Print .DataLabel.Characters.Text
'Masque les étiquettes
.HasDataLabel = False
End With
Next i
Debug.Print "----"
Next j
End Sub
Cette procédure permet d'afficher (en pourcentage) l'évolution des valeurs d'une série en fonction du point précédent.
La macro boucle sur tous les points d'une série, calcule le rapport entre 2 points et ajoute le résultat dans une étiquette (DataLabel).
Sub afficherEvolutionPourcentage_enFonctionDuPointPrecedent()
'Remarque : les labels ne seront pas mis à jour automatiquement
'si les données sont modifiées dans le tableau
Dim j As Integer
Dim X As Single, Y As Single
Dim Resultat As String
Dim Grph As ChartObject
'Définit le graphique cible dans la Feuil1
Set Grph = Feuil1.ChartObjects(1)
On Error Resume Next
'suppression des Labels existants dans la 1ere série
Grph.Chart.SeriesCollection(1).DataLabels.Delete
On Error GoTo 0
'affiche les Labels (Ordonnées) de la 1ere série
'pour en extraire les valeurs
Grph.Chart.SeriesCollection(1).ApplyDataLabels _
Type:=xlDataLabelsShowValue
'boucle sur les point de la 1ere serie (en dehors du premier point)
For j = 2 To Grph.Chart.SeriesCollection(1).Points.Count
X = Grph.Chart.SeriesCollection(1).Points(j). _
DataLabel.Characters.Text 'valeur du point
Y = Grph.Chart.SeriesCollection(1).Points(j - 1). _
DataLabel.Characters.Text 'valeur du point précédent
'Insère le pourcentage pour chaque point de la série.
'Cette ligne est placée avant la ligne
'"Resultat = Format((X / Y) - 1, "0.00%")" et permet ainsi
'de ne rien afficher pour le 1er point.
Grph.Chart.SeriesCollection(1).Points(j - 1). _
DataLabel.Characters.Text = Resultat
'calcul le pourcentage entre les 2 points
Resultat = Format((X / Y) - 1, "0.00%")
Next j
'Affiche le pourcentage pour le dernier point de la série
Grph.Chart.SeriesCollection(1).Points(j - 1).DataLabel. _
Characters.Text = Resultat
'Mise en forme des étiquettes
With Grph.Chart.SeriesCollection(1).DataLabels
.Font.ColorIndex = 5 'couleur bleue
.Position = xlLabelPositionAbove 'position au dessus du point
.Orientation = xlUpward 'orientation verticale (vers le haut)
End With
End SubRemarques:
La procédure ne gère pas les cellules vides (division par 0).
Les étiquettes ne seront pas mises à jour automatiquement si les données sont modifiées dans les cellules.
Cet exemple imprime le 2eme graphique de la Feuil1 :
Feuil1.ChartObjects(2).Chart.PrintOutPour imprimer une feuille graphique, utilisez :
Charts("Graph1").PrintOut
Cette procédure evenementielle doit être placée au niveau du classeur "ThisWorkBook"
La macro boucle les feuilles graphiques et annule le mode Couper ou Copier si l'onglet qui vient d'être désactivé est trouvé dans la collection.
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
Dim Ch As Chart
'Boucle sur la collection de feuilles graphiques
For Each Ch In Charts
If Ch.Name = Sh.Name Then Application.CutCopyMode = False
Next Ch
End SubUne autre possibilité, en utilisant l'evenement Deactivate du graphique :
Private Sub Chart_Deactivate()
Application.CutCopyMode = False
End Sub


