FAQ VBA
FAQ VBAConsultez toutes les FAQ
Nombre d'auteurs : 10, nombre de questions : 133, dernière mise à jour : 15 juin 2021
- 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.Add
Le 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, xlColumns
Il 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
, True
Par 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
compteur
Il 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
Sub
Il 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
Sub
Cet 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
Sub
Remarque:
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
Sub
Si 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
Sub
Remarques:
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.PrintOut
Pour 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
Sub
Une autre possibilité, en utilisant l'evenement Deactivate du graphique :
Private
Sub
Chart_Deactivate
(
)
Application.CutCopyMode
=
False
End
Sub