excel-vba
Graphiques et graphiques
Recherche…
Créer un graphique avec des plages et un nom fixe
Vous pouvez créer des graphiques en travaillant directement avec l’objet Series
qui définit les données du graphique. Pour accéder à la Series
sans graphique existant, vous créez un objet ChartObject
sur une Worksheet
donnée, puis vous obtenez l'objet Chart
. L'avantage de travailler avec la Series
objet est que vous pouvez définir les Values
et XValues
en se référant à Range
objets. Ces propriétés de données définiront correctement la Series
avec des références à ces plages. L'inconvénient de cette approche est que la même conversion n'est pas gérée lors de la définition du Name
; c'est une valeur fixe. Il ne s'ajustera pas avec les données sous-jacentes dans la Range
origine. En cochant la formule SERIES
, il est évident que le nom est fixe. Cela doit être géré en créant directement la formule SERIES
.
Code utilisé pour créer un graphique
Notez que ce code contient des déclarations de variables supplémentaires pour le Chart
et la Worksheet
. Ceux-ci peuvent être omis s'ils ne sont pas utilisés. Ils peuvent cependant être utiles si vous modifiez le style ou d'autres propriétés du graphique.
Sub CreateChartWithRangesAndFixedName()
Dim xData As Range
Dim yData As Range
Dim serName As Range
'set the ranges to get the data and y value label
Set xData = Range("B3:B12")
Set yData = Range("C3:C12")
Set serName = Range("C2")
'get reference to ActiveSheet
Dim sht As Worksheet
Set sht = ActiveSheet
'create a new ChartObject at position (48, 195) with width 400 and height 300
Dim chtObj As ChartObject
Set chtObj = sht.ChartObjects.Add(48, 195, 400, 300)
'get reference to chart object
Dim cht As Chart
Set cht = chtObj.Chart
'create the new series
Dim ser As Series
Set ser = cht.SeriesCollection.NewSeries
ser.Values = yData
ser.XValues = xData
ser.Name = serName
ser.ChartType = xlXYScatterLines
End Sub
Données / plages d'origine et Chart
résultant après l'exécution du code
Notez que la formule SERIES
inclut un "B"
pour le nom de la série au lieu d'une référence à la Range
qui l'a créé.
Créer un graphique vide
Le point de départ de la grande majorité des codes graphiques est de créer un Chart
vide. Notez que ce Chart
est soumis au modèle de graphique par défaut actif et peut ne pas être vide (si le modèle a été modifié).
La clé de ChartObject
détermine son emplacement. La syntaxe de l'appel est ChartObjects.Add(Left, Top, Width, Height)
. Une fois l'objet ChartObject
créé, vous pouvez utiliser son objet Chart
pour modifier le graphique. Le ChartObject
se comporte plus comme une Shape
pour positionner le graphique sur la feuille.
Code pour créer un graphique vide
Sub CreateEmptyChart()
'get reference to ActiveSheet
Dim sht As Worksheet
Set sht = ActiveSheet
'create a new ChartObject at position (0, 0) with width 400 and height 300
Dim chtObj As ChartObject
Set chtObj = sht.ChartObjects.Add(0, 0, 400, 300)
'get refernce to chart object
Dim cht As Chart
Set cht = chtObj.Chart
'additional code to modify the empty chart
'...
End Sub
Graphique résultant
Créer un graphique en modifiant la formule SERIES
Pour un contrôle complet sur un nouvel objet Chart
et Series
(en particulier pour un nom de Series
dynamique), vous devez modifier directement la formule SERIES
. Le processus de configuration des objets Range
est simple et le principal obstacle est simplement la création de chaînes pour la formule SERIES
.
La formule SERIES
prend la syntaxe suivante:
=SERIES(Name,XValues,Values,Order)
Ces contenus peuvent être fournis sous forme de références ou de valeurs de tableau pour les éléments de données. Order
représente la position de la série dans le graphique. Notez que les références aux données ne fonctionneront que si elles sont pleinement qualifiées avec le nom de la feuille. Pour obtenir un exemple de formule de travail, cliquez sur une série existante et vérifiez la barre de formule.
Code pour créer un graphique et configurer les données à l'aide de la formule SERIES
Notez que la construction de la chaîne pour créer la formule SERIES
utilise .Address(,,,True)
. Cela garantit que la référence de plage externe est utilisée pour inclure une adresse complète avec le nom de la feuille. Vous obtiendrez une erreur si le nom de la feuille est exclu .
Sub CreateChartUsingSeriesFormula()
Dim xData As Range
Dim yData As Range
Dim serName As Range
'set the ranges to get the data and y value label
Set xData = Range("B3:B12")
Set yData = Range("C3:C12")
Set serName = Range("C2")
'get reference to ActiveSheet
Dim sht As Worksheet
Set sht = ActiveSheet
'create a new ChartObject at position (48, 195) with width 400 and height 300
Dim chtObj As ChartObject
Set chtObj = sht.ChartObjects.Add(48, 195, 400, 300)
'get refernce to chart object
Dim cht As Chart
Set cht = chtObj.Chart
'create the new series
Dim ser As Series
Set ser = cht.SeriesCollection.NewSeries
'set the SERIES formula
'=SERIES(name, xData, yData, plotOrder)
Dim formulaValue As String
formulaValue = "=SERIES(" & _
serName.Address(, , , True) & "," & _
xData.Address(, , , True) & "," & _
yData.Address(, , , True) & ",1)"
ser.Formula = formulaValue
ser.ChartType = xlXYScatterLines
End Sub
Données d'origine et graphique résultant
Notez que pour ce graphique, le nom de la série est correctement défini avec une plage dans la cellule souhaitée. Cela signifie que les mises à jour se propageront au Chart
.
Organiser des graphiques dans une grille
Une tâche courante avec les graphiques dans Excel est la standardisation de la taille et de la disposition de plusieurs graphiques sur une seule feuille. Si c'est fait manuellement, vous pouvez maintenir ALT tout en redimensionnant ou en déplaçant le graphique pour "coller" aux limites de la cellule. Cela fonctionne pour quelques graphiques, mais une approche VBA est beaucoup plus simple.
Code pour créer une grille
Ce code créera une grille de graphiques commençant à une position donnée (en haut, à gauche), avec un nombre défini de colonnes et une taille de graphique commune définie. Les graphiques seront placés dans l'ordre dans lequel ils ont été créés et entoureront l'arête pour former une nouvelle ligne.
Sub CreateGridOfCharts()
Dim int_cols As Integer
int_cols = 3
Dim cht_width As Double
cht_width = 250
Dim cht_height As Double
cht_height = 200
Dim offset_vertical As Double
offset_vertical = 195
Dim offset_horz As Double
offset_horz = 40
Dim sht As Worksheet
Set sht = ActiveSheet
Dim count As Integer
count = 0
'iterate through ChartObjects on current sheet
Dim cht_obj As ChartObject
For Each cht_obj In sht.ChartObjects
'use integer division and Mod to get position in grid
cht_obj.Top = (count \ int_cols) * cht_height + offset_vertical
cht_obj.Left = (count Mod int_cols) * cht_width + offset_horz
cht_obj.Width = cht_width
cht_obj.Height = cht_height
count = count + 1
Next cht_obj
End Sub
Résultat avec plusieurs graphiques
Ces images montrent la disposition aléatoire originale des graphiques et la grille résultante d'exécuter le code ci-dessus.
Avant
Après