TUTO EXCELLONS : Manipuler les graphes (charts) par VBA

Les graphiques représentent de présente les données de façon parlante et rapidement compréhensible.

A travers la programmation VBA, EXCEL possèdent un riche ensemble d’objets permettant de créer les graphes (charts) et gérer leurs présentations, leurs couleurs, leurs compositions…

Ce TUTO EXCELLONS décrit de façon succinte les principaux objets de cet ensemble.

(Les copies-écrans du présent document sont réalisées avec EXCEL version 365)

UTILISATION DE L’ENREGISTREUR DE MACROS

Du fait de la richesse et de la diversité des méthodes et propriétés exposées par l’objet graphique (chart), beaucoup de temps sera économisé par l’utilisation de l’enregistreur de macros.

Le TUTO EXCELLONS VBA Enregistreur de macro donne des détails sur cette fonctionnalité VBA.

Dans le cas de son utilisation sur les graphiques, bien noter que l’enregistreur de macros :

  • N’a pas la capacité de générer du code VBA pour toutes les manipulations que nous pouvons réaliser sur un graphique.
  • Génère un code VBA souvent ‘bavard’ et non optimisé.

De ce fait, il est recommandé d’utiliser l’enregistreur de macros pour découvrir les objets graphiques manipulés puis, dans un second temps, de reprendre et corriger le code VBA généré pour l’adapter et/ou le simplifier.

LES 2 TYPES DE GRAPHIQUES EXCEL

La représentation ci-dessous, illustre les imbrications des objets EXCEL et montre les 2 types possibles de graphique (chart) dans EXCEL.

Un graphique peut être :

  • soit un objet de la collection ‘ChartObjects’ d’une feuille (Worksheet). On parle alors de graphique incorporé (Chart Embedded).Une feuille peut contenir plusieurs graphiques incorporés.
    soit un objet d’une feuille de type ‘Graphique’ (Chart Sheet). On parle alors de graphique isolé (Standalone chart). Une feuille graphique ne peut contenir qu’un seul graphique isolé.
VBA_InventaireFormes

Il faut noter qu’un graphique incorporé possède un « don d’ubiquité » : il est membre de la collection « ChartObjects » et en même temps, membre de la collection des formes « Shapes ». De ce fait, lors de la programmation VBA des graphiques incorporés, les méthodes et propriétés de l’objet « Chart » sont mises en oeuvre mais également, certaines méthodes et propriétés de l’objet « Shape ».

Le TUTO EXCELLONS Manipuler les formes par VBA donne des détails sur sur ces méthodes et fonctions qui ne sont pas reprises ici.

CREER UN GRAPHIQUE INCORPORE

Un graphique incorporé est créé à l’aide de l’une des 2 méthodes suivantes :

La méthode  ChartObjects.Add (Left, Top, Width, Height)

Cette méthode insère dans une feuille un graphique incorporé du type défini par défaut, dont la position est déterminée par les paramètres ‘Left (gauche)’ et ‘Top (haut)’ et la taille par les paramètres ‘Width (largeur)’ et ‘Height (hauteur)’ exprimés en points.

Le fragment de code ci-dessous créé un nouveau graphique incorporé du type défini par défaut :

Sub AddDefaultChart()
    Dim oSheet As Worksheet
    Dim oChartObject As ChartObject
    Dim oChart As Chart    
    'On référe la feuille
    Set oSheet = ThisWorkbook.Worksheets(1)
    'On créé un nouveau graphique incorporé du type par défaut
    Set oChartObject = oSheet.ChartObjects.Add(600, 20, 300, 200)
    ‘On réfère le graphique (pour utilisation ultérieure)
    Set oChart = oChartObject.Chart    
End Sub

Pour définir ou modifier le type de graphique par défaut, se référer à la page :

https://fr.officetooltips.com/excel_2016/tips/comment_changer_le_graphique_par_defaut.html)

La méthode Shapes.AddChart2

Cette méthode, plus ‘riche’ que la précédente insère dans la feuille un graphique incorporé en définissant son style et son type, ainsi que sa position déterminée par les paramètres ‘Left (gauche)’ et ‘Top (haut)’ et la taille par les paramètres ‘Width (largeur)’ et ‘Height (hauteur)’ tous exprimés en points.

Dans le fragment de code ci-dessous :

  • Le paramètre Style est positionné à ’12’ 
  • Le paramètre Type est valorisé avec ‘xlColumnClustered’ c’est à dire un ‘Histogramme groupé’
  • Le paramètre NewLayout valorisé à ‘True’ indique que le titre et les légendes du graphique sont automatiquement activés.
Sub AddTypedChart()
    Dim oSheet As Worksheet
    Dim oShape As Shape
    Dim oChart As Chart
    'On référe la feuille
    Set oSheet = ThisWorkbook.Worksheets(1)
    'On créé un nouveau graphique incorporé d'un style et d’un type déterminés
    Set oShape = oSheet.Shapes.AddChart2(12, xlColumnClustered, 600, 20, 600, 460, True)
    ‘On réfère le graphique (pour utilisation ultérieure)
    Set oChart = oShape.Chart
End Sub

Le paramétrage de la méthode « Shapes.AddChart2 » comporte les particularités suivantes :

  • Pour positionner le paramètre ‘Style’ sur le style par défaut du Type indiqué, le valoriser à « -1 ».
  • Il n’est pas évident de connaitre la valeur désirée du paramètre « Style ». Le plus simple pour la déterminer consiste à utiliser l’enregistreur de macros.
  • Pour déterminer la valeur du paramètre « Type », on se reportera à l’énumération : https://docs.microsoft.com/fr-fr/office/vba/api/excel.xlcharttype

CREER UN GRAPHIQUE ISOLE

Un graphique isolé est créé à l’aide de :

La méthode  Charts.Add2

Cette méthode comporte les paramètres suivants :

  • Les paramètres « Before (avant) » et « After (après) » permettent de positionner la nouvelle feuille graphique dans le classeur.
  • Le paramètre « Count (nombre) » permet d’indiquer le nombre de feuilles graphiques identiques à créer (par défaut = 1).
  • Le paramètre NewLayout indique que le titre et les légendes du graphique sont automatiquement activés lorsqu’il est valorisé à « true ».

Le fragment de code suivant créé une feuille graphique du type défini par défaut, positionné comme première feuille du classeur, ayant pour titre ‘ComparatifDépenses’ :

Sub Add2StandaloneChart()
    Dim oChart As Chart
    
    'On créé une nouvelle feuille graphique du type par défaut positionnée comme première feuille du classeur
    Set oChart = ThisWorkbook.Charts.Add2(ThisWorkbook.Sheets(1), , , True)
    With oChart
        'On nomme la nouvelle feuille graphique
        .Name = "ComparatifDepenses"
    End With
End Sub

EXEMPLE COMPLET DE CREATION D’UN GRAPHIQUE INCORPORE

Soit un classeur dont la feuille ‘Données’ contient un tableau structuré contenant les montant de dépenses par poste budgétaire :

(Cliquer sur l’image pour télécharger le classeur exemple).

Ruban Insertion Graphiques

Le code VBA suivant créé un graphique incorporé illustrant les dépenses pour le mois de janvier 2020

Sub AddSampleChart()
    Dim oSheet As Worksheet
    Dim oChartObject As ChartObject
    Dim oChart As Chart
    Dim oSerie As Series
    
    'On référe la feuille de destination du graphique contenant les données
    Set oSheet = ThisWorkbook.Worksheets("Données")
    'On créé un nouveau graphique incorporé du type par défaut
    Set oChartObject = oSheet.ChartObjects.Add(1, 200, 300, 200)
    'On réfère le graphique créé
    Set oChart = oChartObject.Chart
    'On ajoute une série au graphique
    Set oSerie = oChart.SeriesCollection.NewSeries
    With oSerie
        'On indique la plage utilisée pour les valeurs de la série
        .Values = oSheet.Range("B3:B11")
        'On indique la plage utilisée pour les libellés de l'axe horizontal
        .XValues = oSheet.Range("A3:A11")
    End With
End Sub

Résultat obtenu :

Exemple de graphe obtenu par VBA

SPECIFIER LES DEUX ZONES DE L’OBJET CHART

Un objet graphique possède 2 zones particulières :

  • Zone de graphique (Chart area)
  • Zone de traçage (Plot area)
Exemple de graphe obtenu par VBA

La propriété Chart.ChartArea

La propriété Chart.ChartArea représente la zone du graphique.

Le code VBA suivant modifie certains attributs (Hauteur, largeur et coins arrondis) de la zone de graphique :

Sub ModifyChartAreaProperties()
    Dim oSheet As Worksheet
    Dim oChart As Chart
    Dim oChartArea As ChartArea
    'On référe la feuille
    Set oSheet = ThisWorkbook.Worksheets("Données")
    'On référe le graphique incorporé
    Set oChart = oSheet.ChartObjects(1).Chart
    'On réfère la zone de graphique
    Set oChartArea = oChart.ChartArea
    With oChartArea
        'On modifie la hauteur , la position gauche et la forme de la bordure extérieure de la zone de graphique
        .Height = 400
        .Width = 600
        .RoundedCorners = True
    End With
End Sub

Résultat obtenu :

Légende

Il est à noter que l’objet Format de l’objet ChartArea d’un graphique incorporé est en lecture seule.

Pour modifier, la couleur de fond du graphique, nous utilisons l’objet parent de l’objet Chart (i.e. ChartObject).

Pour obtenir les paramètres de la fonction RGB() correspondants à la couleur désirée, reporterons-nous à la page :

https://www.excel-pratique.com/fr/vba/liste-couleurs-rgb

Le code VBA suivant modifie la couleur de fond du graphique :

Sub modifyChartAreaBackcolor()
    Dim oSheet As Worksheet
    Dim oChart As Chart
    Dim oChartArea As ChartArea
    'On référe la feuille
    Set oSheet = ThisWorkbook.Worksheets("Données")
    'On référe le graphique incorporé
    Set oChart = oSheet.ChartObjects(1).Chart
    'L'objet Format de ChartArea est en lecture seule -> on passe par l'objet parent (ChartObject) 
     oChart.Parent.Interior.Color = RGB(224, 238, 224)
End Sub

Résultat obtenu :

Légende

La propriété Chart.PlotArea

La propriété Chart.PlotArea représente la zone de traçage du graphique.

Le code VBA suivant modifie la taille et la couleur de la zone de traçage :

Sub ModifyPlotAreaProperties()
    Dim oSheet As Worksheet
    Dim oChart As Chart
    Dim oPlotArea As PlotArea
    'On référe la feuille
    Set oSheet = ThisWorkbook.Worksheets("Données")
    'On référe le graphique incorporé
    Set oChart = oSheet.ChartObjects(1).Chart
    'On réfère la zone de traçage
    Set oPlotArea = oChart.PlotArea
    With oPlotArea
        'On modifie certaines propriétés de la zone de traçage : hauteur et largeur à 75% de la zone de graphique
        .InsideHeight = oChart.ChartArea.Height * 0.75
        .InsideWidth = oChart.ChartArea.Width * 0.75
        'On efface les éventuels formats de la zone de traçage
        .ClearFormats
        'On affecte les caractéristiques du fond de la zone de traçage
        With .Format.Fill
            'On affecte un dégradé depuis le coin
            .OneColorGradient msoGradientFromCorner, 1, 1
            'On affecte la couleur grise estompée
            .BackColor.RGB = RGB(153, 153, 153)
        End With
    End With
End Sub

Résultat obtenu :

Légende

SPECIFIER LES OBJETS PRINCIPAUX D’UN GRAPHIQUE

Les graphiques (charts) EXCEL exposent 4 objets qu’il est nécessaire de distinguer :

L’objet ChartTitle

L’objet ChartTitle représente le titre du graphique.

Le code VBA suivant affecte un titre au graphique sur 2 lignes et spécifie la taille des caractères, leurs styles (gras ou italiques) et leurs couleurs distinctes pour chaque ligne :

Sub SetChartTitle()
    Dim oSheet As Worksheet
    Dim oChart As Chart
    Dim oChartTitle As ChartTitle
    Dim lPos As Long
    
    'On référe la feuille
    Set oSheet = ThisWorkbook.Worksheets("Données")
    'On référe le graphique incorporé
    Set oChart = oSheet.ChartObjects(1).Chart
    'On indique que le graphique possède un titre
    oChart.HasTitle = True
    'On réfère le titre
    Set oChartTitle = oChart.ChartTitle
    With oChartTitle
        'On compose le texte du titre composé de 2 lignes
        .Text = "Dépenses mensuelles" & vbCr & "par postes budgétaires"
        'On récupère la position du saut de ligne
        lPos = InStr(1, .Text, vbCr)
        'On modifie les caractéristiques de la première ligne du titre
        With .Characters(1, lPos - 1)
            .Font.Size = 12
            .Font.Bold = True
            .Font.Color = vbBlue
        End With
        'On modifie les caractéristiques de la deuxième ligne du titre
        With .Characters(lPos)
            .Font.Size = 10
            .Font.Bold = False
            .Font.Italic = True
            .Font.Color = vbYellow
        End With
    End With
End Sub

Résultat obtenu :

Courbe de Bézier

Remarque :  Dans la version EXCEL 365 utilisée (juillet 2025) et les versions antérieures, la longueur du texte du titre d’un graphique est limitée à 255 caractères. Lorsque la longueur du titre dépasse 255 caractères, VBA retourne une erreur à l’exécution.

Le code VBA précédent positionne le titre à l’intérieur de la zone de traçage. Le code VBA suivant positionne ce titre à l’extérieur de la zone de traçage :

Sub IsoleChartTitle()
    Dim oSheet As Worksheet
    Dim oChart As Chart
    Dim oPlotArea As PlotArea
    'On référe la feuille
    Set oSheet = ThisWorkbook.Worksheets("Données")
    'On référe le graphique incorporé
    Set oChart = oSheet.ChartObjects(1).Chart
    'On réfère la zone de traçage
    Set oPlotArea = oChart.PlotArea

    oPlotArea.InsideTop = oChart.ChartArea.Top - 20
End Sub

Résultat obtenu :

Courbe de Bézier
L’objet Legend

L’objet Lengend représente le cartouche de légende du graphique.

Le code VBA suivant déplace le cartouche de légende en bas du graphique et lui affecte une bordure :

Sub SetChartLegend()
    Dim oSheet As Worksheet
    Dim oChart As Chart
    Dim oChartLegend As Legend
    
    'On référe la feuille
    Set oSheet = ThisWorkbook.Worksheets("Données")
    'On référe le graphique incorporé
    Set oChart = oSheet.ChartObjects(1).Chart
    'On indique que le graphique possède un cartouche de légende
    oChart.HasLegend = True
    'On réfère le cartouche
    Set oChartLegend = oChart.Legend
    With oChartLegend
        'On déplace la légende en bas du graphique
        .Position = xlLegendPositionBottom
        'On formate la bordure
        With .Border
            .Color = vbBlack
            .LineStyle = xlDashDot
            .Weight = xlThin
        End With
    End With
End Sub

Résultat obtenu :

Courbe de Bézier

Le code VBA précédent positionne le cartouche de légende trop près des libellés de l’axe des abscisses. Le code VBA suivant isole le cartouche de légende  :

Sub IsoleLegend()
    Dim oSheet As Worksheet
    Dim oChart As Chart
    Dim oPlotArea As PlotArea
    'On référe la feuille
    Set oSheet = ThisWorkbook.Worksheets("Données")
    'On référe le graphique incorporé
    Set oChart = oSheet.ChartObjects(1).Chart
    'On réfère la zone de traçage
    Set oPlotArea = oChart.PlotArea
    
    oPlotArea.InsideHeight = oPlotArea.InsideHeight * 0.85
End Sub

Résultat obtenu :

Courbe de Bézier
L’objet Axis

L’objet Axis représente l’un des axes du graphique.

La collection Axes (xlAxisType) permet de référencer un objet Axis particuler.

L’énumération xlAxisType contient les constantes suivantes :

  • xlCategory désigne l’axe des abscisses.
  • xlValue désigne l’axe des ordonnées.
  • xlSeriesAxis désigne l’axe de la 3ième dimension d’un graphique en 3D.

Le code VBA suivant affecte un titre à l’axe des abscisses et modifie sa couleur :

Sub SetAbscisses()
    Dim oSheet As Worksheet
    Dim oChart As Chart
    Dim oAxis As Axis
    Dim lgvsViolet As Long
    
    'On valorise une variable locale à la couleur violet
    lgvsViolet = RGB(112, 48, 160)
   
    'On référe la feuille
    Set oSheet = ThisWorkbook.Worksheets("Données")
    'On référe le graphique incorporé
    Set oChart = oSheet.ChartObjects(1).Chart
    'On réfère l'axe des abscisses
    Set oAxis = oChart.Axes(xlCategory)
    With oAxis
        'On indique que l'axe a un titre
        .HasTitle = True
        With .AxisTitle
            'On indique le titre de l'axe
            .Text = "Postes budgétaires"
            'On formate et colorise le titre de l'axe
            .Font.Size = 10
            .Font.Italic = True
            .Font.Color = lgvsViolet
        End With
        'On colorise les étiquettes
        .TickLabels.Font.Color = lgvsViolet
    End With
End Sub

Résultat obtenu :

Courbe de Bézier

Le code VBA suivant affecte un titre à l’axe des ordonnées et modifie sa couleur :

Sub SetOrdonnees()
    Dim oSheet As Worksheet
    Dim oChart As Chart
    Dim oAxis As Axis
    Dim lgvsViolet As Long
    
    'On valorise une variable locale à la couleur violet
    lgvsViolet = RGB(112, 48, 160)
   
    'On référe la feuille
    Set oSheet = ThisWorkbook.Worksheets("Données")
    'On référe le graphique incorporé
    Set oChart = oSheet.ChartObjects(1).Chart
    'On réfère l'axe des ordonnées
    Set oAxis = oChart.Axes(xlValue)
    With oAxis
        With .Format.Line
            'On positionne une flêche sur l'axe des ordonnées
            .EndArrowheadStyle = msoArrowheadTriangle
            'On fixe la taille de l'axe
            .Weight = 1.5
            'On colorise l'axe des ordonnées en bleu
            .ForeColor.RGB = RGB(0, 0, 255)
            'On indique que l'axe a un titre
        End With
        'On indique que l'axe a un titre
        .HasTitle = True
        With .AxisTitle
            'On indique le titre de l'axe
            .Text = "Dépenses"
            'On formate et colorise le titre de l'axe
            .Font.Size = 10
            .Font.Italic = True
            .Font.Color = vbBlue
        End With
        'On colorise les étiquettes
        .TickLabels.Font.Color = vbBlue
    End With
End Sub

Résultat obtenu :

Courbe de Bézier

SPECIFIER LA COLLECTION ‘SERIESCOLLECTION’

La collection SeriesCollection rassemble toutes les séries de valeurs présentes dans le graphique.

L’objet Series désigne les séries du graphique. On réfère une série particulière de valeurs en spécifiant son index.

De plus, l’objet Series possède la collection DataLabels référençant les étiquettes de données de la série.

Le code VBA suivant ajoute des étiquettes à la série de donnée d’index 1 et les met en forme :

Sub addDatalabels()
    Dim oSheet As Worksheet
    Dim oChart As Chart
    Dim oSerie As Series
    Dim oDatalabel As DataLabel
    
    'On référe la feuille
    Set oSheet = ThisWorkbook.Worksheets("Données")
    'On référe le graphique incorporé
    Set oChart = oSheet.ChartObjects(1).Chart
    'On réfère la première série
    Set oSerie = oChart.SeriesCollection(1)
    'On indique que la série possède des étiquettes
    oSerie.HasDataLabels = True
    For Each oDatalabel In oSerie.DataLabels
        'On colorise le texte de l'étiquette et la met en italique
        With oDatalabel
            .Font.Color = vbBlue
            .Font.Italic = True
        End With
    Next
End Sub

Résultat obtenu :

Courbe de Bézier

AJOUTER DES SERIES DE DONNEES A UN GRAPHIQUE

La méthode SeriesCollection.NewSeries permet d’ajouter de nouvelles séries de données au graphique.

Le code VBA suivant ajoute 3 nouvelles séries de données se référant aux dépenses des mois de février, mars et avril :

Sub AddSeries()
    Dim oSheet As Worksheet
    Dim oChart As Chart
    Dim oSerie As Series
    Dim i As Integer
    
    'On réfère la feuille
    Set oSheet = ThisWorkbook.Worksheets("Données")
    'On réfère le graphique incorporé
    Set oChart = oSheet.ChartObjects(1).Chart
    'On réalise une boucle de 3 itérations
    For i = 1 To 3
        'On ajoute une série de données
        Set oSerie = oChart.SeriesCollection.NewSeries
        'On référençe la plage de valeurs de la colonne correspondante du tableau de données
        oSerie.Values = oSheet.Range("B3:B11").Offset(, i)
    Next
End Sub

Résultat obtenu :

Liste déroulante

MODIFIER LES CARACTERISTIQUES DES SERIES

Les objets Series.Values et Series.XValue permettent d’indiquer les références de plages, respectivement pour les données et pour les étiquettes d’une série.

Le code VBA suivant spécifie la plage de données EXCEL pour les valeurs et les étiquettes d’une série d’un graphique :

Sub AddSampleChart()
    Dim oSheet As Worksheet
    Dim oChartObject As ChartObject
    Dim oChart As Chart
    Dim oSerie As Series
    
    'On référe la feuille de destination du graphique contenant les données
    Set oSheet = ThisWorkbook.Worksheets("Données")
    'On créé un nouveau graphique incorporé du type par défaut
    Set oChartObject = oSheet.ChartObjects.Add(1, 200, 300, 200)
    'On réfère le graphique créé
    Set oChart = oChartObject.Chart
    'On ajoute une série au graphique
    Set oSerie = oChart.SeriesCollection.NewSeries
    With oSerie
        'On indique la plage utilisée pour les valeurs de la série
        .Values = oSheet.Range("B3:B11")
        'On indique la plage utilisée pour les libellés de l'axe horizontal
        .XValues = oSheet.Range("A3:A11")
    End With
End Sub
L’objet Series.Format permet d’agir sur les caractéristiques de l’objet Serie.

Le code VBA suivant modifie la couleur des barres de la serie d’index 3 du graphique :

Sub changeBarColor()
    Dim oSheet As Worksheet
    Dim oChart As Chart
    Dim oSerie As Series
    Dim oFormat As ChartFormat
    
    'On référe la feuille
    Set oSheet = ThisWorkbook.Worksheets("Données")
    'On référe le graphique incorporé
    Set oChart = oSheet.ChartObjects(1).Chart
    'On réfère la troisième série
    Set oSerie = oChart.SeriesCollection(3)
    'On réfère le format de la série
    Set oFormat = oSerie.Format
    'On modifie la couleur de la barre
    oFormat.Fill.ForeColor.RGB = RGB(153, 102, 0)
End Sub

Résultat obtenu :

Liste déroulante
La propriété Series.Name permet d’affecter un nom aux séries de données.

Le code VBA suivant affecte un nom a chacune des 4 séries de données du graphique :

Sub SetSeriesName()
    Dim oSheet As Worksheet
    Dim oChart As Chart
    Dim oSerie As Series
    Dim i As Integer
    
    'On réfère la feuille
    Set oSheet = ThisWorkbook.Worksheets("Données")
    'On réfère le graphique incorporé
    Set oChart = oSheet.ChartObjects(1).Chart
    For i = 1 To 4
        Set oSerie = oChart.SeriesCollection(i)
        'On affecte le nom de la série par référence à l'entête de la colonne du tableau
        oSerie.Name = oSheet.Range("A2").Offset(, i).Value
    Next    
End Sub

Résultat obtenu :

Liste déroulante

AJOUTER UNE COURBE DE TENDANCE

La collection TrendLines d’un objet Serie réfère toutes les courbes de tendance définies pour une série.

L’objet TrendLine désigne une courbe de tendance particulière pour une série donnée.

La méthode Serie.TrendLines.Add(xlTrendLineType,…) permet d’ajouter une nouvelle courbe de tendance à une série de données.

Le code VBA suivant crée une courbe de tendance sur la moyenne de 2 valeurs successives pour la série de données d’index 1 et formate cette courbe :

Sub AddTrendLine()
    Dim oSheet As Worksheet
    Dim oChart As Chart
    Dim oTendance As Trendline
    
    'On référe la feuille
    Set oSheet = ThisWorkbook.Worksheets("Données")
    'On référe le graphique incorporé
    Set oChart = oSheet.ChartObjects(1).Chart
    'On ajoute une courbe de tendance sur la moyenne entre 2 valeurs de la série 1
    Set oTendance = oChart.SeriesCollection(1).Trendlines.Add(xlMovingAvg)
    'On formate la courbe de tendance : couleur rouge, épaisseur 1.5
    With oTendance.Format.Line
        .Visible = msoTrue
        .ForeColor.RGB = RGB(255, 0, 0)
        .Weight = 1.5
    End With
End Sub

Résultat obtenu :

Liste déroulante

APPLIQUER UN STYLE PREDEFINI AU GRAPHIQUE

Plutôt que de modifier individuellement les caractéristiques des objets d’un graphique, EXCEL offre la possibilité d’appliquer un style prédéfini.

La propriété Chart.Style (lStyle) permet d’appliquer un style prédéfini à un graphique.

Pour déterminer la valeur du paramètre « lStyle», le plus simple consiste à utiliser l’enregistreur de macros en effectuant manuellement la transformation désirée.

Le code VBA suivant applique le style prédéfini d’index 294 au graphique :

Sub changeChartStyle()
    Dim oSheet As Worksheet
    Dim oChart As Chart
    
    'On référe la feuille
    Set oSheet = ThisWorkbook.Worksheets("Données")
    'On référe le graphique incorporé
    Set oChart = oSheet.ChartObjects(1).Chart
    'On rétablit la mise en forme par défaut du graphique
    oChart.ClearToMatchStyle
    'On applique le style désiré : Barres 3D fond noir
    oChart.ChartStyle = 294
End Sub

Résultat obtenu :

Liste déroulante

DESCRIPTION DE QUELQUES METHODES UTILES DE LA CLASSE CHART

 

EXPORTER UN GRAPHIQUE EN PDF

La méthode Chart.ExportAsFixedFormat

La méthode Chart.ExportAsFixedFormat (Type, FileName,…) permet d’exporter un graphique au format PDF.

Le code VBA suivant exporte le graphique dans un fichier PDF ayant pour nom ‘EXCELLONS_TUTO_VBA_GRAPHE.pdf’ :

Private Sub exportChart()
    Dim sMess As String
    Dim lElementID As Long, lArg1 As Long, lArg2 As Long
    Dim oSheet As Worksheet
    Dim oChart As Chart
    
    'On référe la feuille
    Set oSheet = ThisWorkbook.Worksheets("Données")
    'On référe le graphique incorporé
    Set oChart = oSheet.ChartObjects(1).Chart
    'On exporte le graphique dans un fichier PDF
    oChart.ExportAsFixedFormat ExportAsFixedFormat, ThisWorkbook.Path & "\" & "EXCELLONS_TUTO_VBA_GRAPHE.pdf"

End Sub

EXPORTER UN GRAPHIQUE AU FORMAT JPEG

La méthode Chart.Export

La méthode Chart.Export (FileName) permet d’exporter un graphique au format JPEG.

Le code VBA suivant exporte le graphique dans un fichier JPEG ayant pour nom ‘EXCELLONS_TUTO_VBA_GRAPHE.jpg’ :

Private Sub exportToJPEG()
    Dim lElementID As Long, lArg1 As Long, lArg2 As Long
    Dim oSheet As Worksheet
    Dim oChart As Chart
    
    'On référe la feuille
    Set oSheet = ThisWorkbook.Worksheets("Données")
    'On référe le graphique incorporé
    Set oChart = oSheet.ChartObjects(1).Chart
    'On exporte le graphique au format image JPEG
    oChart.Export ThisWorkbook.Path & "\" & "EXCELLONS_TUTO_VBA_GRAPHE.jpg"    
End Sub

IMPRIMER UN GRAPHIQUE

La méthode Chart.PrintOut

La méthode Chart.PrintOut permet d’imprimer un graphique.

Le code VBA suivant lance l’impression du graphique par l’imprimante par défaut du poste de travail :

Private Sub printChart()
    Dim sMess As String
    Dim lElementID As Long, lArg1 As Long, lArg2 As Long
    Dim oSheet As Worksheet
    Dim oChart As Chart
    
    'On référe la feuille
    Set oSheet = ThisWorkbook.Worksheets("Données")
    'On référe le graphique incorporé
    Set oChart = oSheet.ChartObjects(1).Chart
    'On imprime le graphique
    oChart.PrintOut
End Sub

ENREGISTRER UN GRAPHIQUE EN TANT QUE MODELE

La méthode Chart.SaveChartTemplate

La méthode La méthode Chart.SaveChartTemplate permet de sauvegarder un graphique en tant que modèle..

Le code VBA suivant sauvegarde le graphique comme modèle sous le nom ‘DepensesParPostes’ :

Private Sub SaveChartAsTemplate()
    Dim oSheet As Worksheet
    Dim oChart As Chart
    
    'On référe la feuille
    Set oSheet = ThisWorkbook.Worksheets("Données")
    'On référe le graphique incorporé
    Set oChart = oSheet.ChartObjects(1).Chart
    'On exporte le graphique sous forme de graphique modèle
    oChart.SaveChartTemplate ThisWorkbook.Path & "\" & "DepensesParPostes.crtx"
End Sub

Q

TUTO EXCELLONS : Créer des 3D Maps à partir de données EXCEL

La fonctionnalité 3D Maps permet de représenter des données EXCEL sous la forme de carte en 3D.

Ce tutoriel montre, par l’exemple et pas à pas, la mise en œuvre de cette fonctionnalité à partir de données, récupérées sur le WEB, stockées dans une feuille EXCEL.

Ce tutoriel ne couvre pas l’intégralité du sujet. Son objectif est de fournir les bases nécessaires pour utiliser cette fonctionnalité.

 (Tutoriel réalisé avec des copies-écrans issues d’EXCEL version Business 365)

LES DONNEES DU WEB RECUPEREES

Pour ce tutoriel, les données relatives à la consommation d’électricité par habitant et pays sont utilisées, Ces données sont récupérées sur le WEB depuis la page Wikipédia :

https://fr.wikipedia.org/wiki/Liste_de_pays_par_consommation_d%27électricité

Pour des détails concernant la récupération de données du WEB, se reporter au TUTO EXCELLONS : Capturons et transformons les données du WEB.

(Cliquer sur l’image pour télécharger le classeur exemple).

La tableau structuré contenant les données comporte uniquement 2 colonnes des données du WEB : ‘Pays/région‘ et ‘Énergie moyenne par habitant (kWh par habitant par an)‘.

CREER LA ‘VISITE GUIDEE 1’

Pour créer la ‘Visite guidée 1’ de la 3D Maps, sélectionner une cellule quelconque du tableau de données, dans le ruban ‘Données’, sélectionner ‘3D Maps‘ :

Site cours Crypto-monnaies

Cliquer sur ‘Visite guidée 1‘ dans la fenêtre ‘Lancer 3D Maps’ :

Dans la partie ‘Donnée’ de la fenêtre qui s’ouvre, choisir la colonne ‘Énergie moyenne par habitant (kWh par habitant par an)‘ pour la laliste déroulante ‘Hauteur‘ :

La carte 3D obtenu se présente alors ainsi :

AMELIORER LA PRESENTATION DE LA ‘VISITE GUIDEE 1’

 

Modifions le titre de ‘Visite guidée 1’ en le remplaçant par « L’inégalité énergétique (Electricité) » :

  1. (Si non affiché) sélectionner ‘Liste des champs’
  2. Cliquer sur l’icone ‘Modifier’ du titre.
  3. Remplacer le titre par ‘L’inégalité énergétique (Electricité)’
Site cours Crypto-monnaies

Modifions la couleur des barres : dans la partie ‘Options du calque’ de la fenêtre ‘Calque’, on choisit la couleur désirée pour les barres ‘Énergie moyenne par habitant…’ :

Site cours Crypto-monnaies

Modifions la présentation du cartouche de légende du calque par clic droit sur la légende et ‘Modifier

  1. la taille des caractères
  2. la couleur du titre
  3. la couleur de fond
  4. la couleur de la catégorie
Site cours Crypto-monnaies

Pour modifier la position de la légende, il suffit de la sélectionner et de la déplacer avec la souris à l’endroit voulu :

Site cours Crypto-monnaies

ANIMATION DE LA ‘VISITE GUIDEE 1’

Afin d’animer la présentation par exemple en commandant la rotation du globe, il convient de cliquer sur l’icône « Modifier les options de la scène » de la fenêtre « Visite guidée 1 » :

Site cours Crypto-monnaies

Pour animer la représentation, cliquer sur « Lire la visite guidée depuis le début » dans le ruban de l’éditeur « 3D Maps » :

Site cours Crypto-monnaies

Pour créer une vidéo de la représentation, cliquer sur « Créer une vidéo» dans le ruban de l’éditeur « 3D Maps », choisir les paramètres de la vidéo, cliquer sur le bouton ‘Créer’ et sauvegarder le fichier .mp4 :

Site cours Crypto-monnaies

Q

TUTO EXCELLONS : REFERENCEMENT DES OBJETS

L’un des atouts de la suite Microsoft Office réside dans l’interopérabilité des applications qui la compose.

Pour mettre en oeuvre cette interopérabilité, il est nécessaire de procéder au référencement des objets.

Pour programmer en VBA l’interaction d’EXCEL avec WORD par exemple, il est nécessaire de référencer les éléments (propriétés, méthodes, collections, énumérations, …) exposées par l’objet WORD dans EXCEL.

Un référencement est nécessaire quelque soit l’application Microsoft Office en jeu mais également lorsque nous utilisons des objets Microsoft particuliers (« FileSystemObject », « Microsoft XML » …) ou encore lorsque nous mettons en œuvre des composants non Microsoft (composants ActiveX par exemple).

Cet article présente de façon concise ce qu’il est nécessaire de connaître concernant le référencement des objets.

(Les copies-écrans du présent document sont issues d’EXCEL version 365)

LA BOÎTE DE DIALOGUE « REFERENCES »

 

Depuis le menu de l’interface VBE (Visual Basic Editor), ouvrir la boite de dialogue « Références »  : >Outils/Références…

Site cours Crypto-monnaies

Dans la boîte de dialogue qui s’ouvre, apparaissent toutes les bibliothèques d’objets des applications installées et enregistrés sur l’ordinateur.

Remarquons que quelques-unes d’entre-elles sont sélectionnées automatiquement et, parmi celles-ci, la référence « Microsoft Excel XX.X Object Library » : celle de l’application EXCEL (XX.X étant la version d’EXCEL installée sur notre ordinateur. Ici la version 16.0 – vous pouvez en avoir une différente).

Site cours Crypto-monnaies

LES 2 MODALITES DE REFERENCEMENT : LIAISON ANTICIPEE vs LIAISON TARDIVE

Le VBA permet de réaliser le référencement des objets suivant 2 modalités :

  • La liaison anticipée (early binding)
  • La liaison tardive (late binding)

Chacune de ces modalités comporte certains avantages et certains inconvénients résumés dans le tableau suivant

Site cours Crypto-monnaies

La mise en oeuvre dans VBA de ces 2 modalités est détaillée ci-dessous.

MISE EN OEUVRE DE LA LIAISON ANTICIPEE (EARLY BINDING)

Pour ce type de liaison, il faut avant tout sélectionner l’application désirée dans la boîte de dialogue ‘Références – VBAProject’ :

Site cours Crypto-monnaies

Lorsque l’on utilise la liaison anticipée avec l’application WORD, le code VBA de déclaration des objets se présente ainsi :

Sub gvs_Exemple_Referencement_Liaison_Anticipée()
    'On déclare une variable objet référençant l'application
    Dim oWordApp As Word.Application
    'On déclare une variable objet référençant un document word
    Dim oDoc As Word.Document
    
    'On affecte une nouvelle instance de l'application WORD
    Set oWordApp = New Word.Application
    'On crée un nouveau document que l’on affecte à la variable
    Set oDoc = oWordApp.Documents.Add
    ‘
    '
    '  Partie de notre programme consommant les objets exposés
   '
   '
    oDoc.Close False ‘ A adapter
    'On ferme l'instance de l'application utilisée
    oWordApp.Quit
    
    'On fait le ménage
    Set oDoc = Nothing
    Set oWordApp = Nothing
End Sub

iAvec la liaison anticipée lors de l’écriture du code VBA, la fonction ‘IntelliSense’ est active. Ceci signife que, en faisant référence à l’un des objets de l’objet lié, VBE présente automatiquement la totalité des évènements/propriétés/méthodes liés à cet objet. Illustration de la fonction IntelliSense :

Site cours Crypto-monnaies

De plus, avec la liaison anticipée, l’Explorateur d’objet (Affichage/Explorateur d’objets ou F2) expose l’intégralité des Evèvements/Propriétés/Méthodes propres à un objet référencé. Ceci peut s’avérer utile pour s’approprier des objets complexes comme, par exemple WORD. Les images suivantes illustrent l’explorateur de l’objet WORD : 

Site cours Crypto-monnaies
Site cours Crypto-monnaies

MISE EN OEUVRE DE LA LIAISON TARDIVE (LATE BINDING)

Pour la liaison tardive, aucune sélection n’est réalisée dans la boîte de dialogue ‘Références – VBAProject’ et le code VBA de déclaration des objets est sensiblement différent de celui pour une liaison anticipée. Par exemple, toujours avec l’objet WORD, le code VBA se présente ainsi :

Sub gvs_Exemple_Referencement_Liaison_Tardive()
    'On déclare une variable objet pour l’application
    Dim oWordApp As Object
    'On déclare une variable objet référençant un document word
    Dim oDoc As Object
    'On déclare un booleen
    Dim booWORDActif As Boolean
   
   'On suspend la survenue d’erreur 
    On Error Resume Next
    'On se réfère à l'application WORD en considérant qu'elle est déjà ouverte
    booWORDActif = True
    Set oWordApp = GetObject(, "Word.Application")
    'Si la variable oWordapp n'a pas été initialisée par la ligne précédente c'est que WORD n'est pas ouvert.
    If oWordApp Is Nothing Then
        'On affecte alors une nouvelle instance de l'application WORD
        Set oWordApp = CreateObject("Word.Application")
        booWORDActif = False
    End If
    'On rétablit la survenue d’erreur 
    On Error GoTo 0
    'On affecte une nouveau document
    Set oDoc = oWordApp.Documents.Add    
    '
    ' Partie de notre programme consommant les objets exposés
    '
    oDoc.Close False
    'On ferme l'instance de l'application utilisée si WORD n'était pas prélablement actif
    If Not booWORDActif Then
        oWordApp.Quit
    End If
    
    'On fait le ménage
    Set oDoc = Nothing
    Set oWordApp = Nothing
End Sub

Avec la liaison tardive, nous ne bénéficions ni de la fonction ‘IntelliSense’ de VBA ni de l’Explorateur d’objet. De ce fait, lors de l’écriture du code VBA, il est nécessaire de bien connaitre les Evènements/Propriétés/Méthodes exposés par l’object avec lequel on interopère.

LIAISON ANTICIPEE vs TARDIVE – LE BON COMPROMIS

 

Comme vu dans les paragraphes précédents, la liaison anticipée assure une écriture du code plus simple et rapide.

Toutefois, lorsque le développement est destiné à être distribué sur d’autre postes de travail que celui du développement, nous risquons de générer certaines difficultés si nous utilisonqs les liaisons anticipées.

En effet, Microsoft respecte (la plupart du temps) le principe de compatibilité ascendante, mais ce principe ne s’applique pas dans le sens descendant.

Ce qui signifie que, si nous développons une solution avec liaisons anticipées sous MS Office 2015, par exemple, celle-ci fonctionnera sans problème sur des ordinateurs installés avec MS Office 2015 et, en principe avec les versions ultérieures (2016, 365…). Dans cette situation, MS Office mettra automatiquement à jour le référencement initial au profit du référencement à la version de l’objet installé.

En revanche, sur les ordinateurs installés avec une version plus ancienne que MS Office 2015, le développement VBA réalisé risque fortement de provoquer un bug documenté par un message pour le moins obscur : ‘zzzzz n’est pas une fonction valide’ ( ‘zzzzz’ pouvant être n’importe quelle fonction sans rapport avec le code VBA écrit pour interopérer).

En pareil cas, si nous affichons la boîte de dialogue ‘Références’, nous remarquerons que la (les) référence(s) cochée(s) lors du développement est (sont) indiquée(s) comme « MANQUANT ».

Pour corriger le problème, nous devrons intervenir sur chaque ordinateur pour dé-référencer la (les) référence(s) manquante(s) et référencer l’objet de la version MS Office installée. (Si le nombre d’ordinateurs est important, c’est la galère ! ☹)

Démarche optimale suggérée :

  • Lors de la phase de développement et jusqu’à la finalisation de nos tests, pour bénéficier des avantages liés à l’écriture du code, nous mettrons en œuvre les liaisons anticipées.
  • Avant de distribuer la solution développée, nous modifierons le code VBA en mettant en œuvre les liaisons tardives  : déclarations des variables suivant cette modalité de laison (voir plus haut) et en dé-référençant le (les) objet(s) référencé(s) dans la boîte de dialogue ‘Références’. Ces opérations réalisées, il est recommandé de recompiler le code VBA autant de fois que nécessaire afin d’éliminer toutes les erreurs de référencement.Attention aux énumérations utilisées : après déférencement, à la compilation, elles génèreront une erreur « variable non définie ». Il conviendra alors de les définir explicitement dans le code VBA en tant que constantes.

Q

TUTO EXCELLONS : Exporter les données EXCEL vers XML

La technologie XML s’est imposée dans beaucoup de secteur de l’écononomie (banque, industrie…) comme moyen priviligé d’échange de données entre systèmes hétérogènes.

Ce tutoriel montre, pas à pas, comment exporter les données d’une feuille EXCEL vers un fichier au format XML.

Ce tutoriel ne couvre pas l’intégralité du sujet. Son objectif est de fournir les bases nécessaires à l’utilisation des fonctionnalités spécifiques XML disponibles dans EXCEL (depuis sa version 2010).

 (Les copies-écrans de ce tutoriel ont été réalisées avec EXCEL version Business 365)

EXPLORONS LA STRUCTURE D’UN FICHIER XML

 

Les fichiers XML (eXtensible Markup Language) se conforment à un ensemble de normes et recommandations publiées par le W3C : https://www.w3.org/XML/.

Toutes les données des fichiers XML sont insérées à l’intérieur de balises (tags) ; ces balises sont repérables par les signes «< > » qui les encadrent.

Examinons le fichier XML exemple ci-dessous :

Site cours Crypto-monnaies

Remarquons que chaque donnée (par exemple ‘Eve’) est insérée dans des balises : l’une ouvrante (par exemple <Mère>) et l’autre fermante (par exemple </Mère>).

Relevons que les fichiers XML sont beaucoup plus « bavards » que les fichiers plats classiques : l’espace nécessaire au stockage des balises peut s’avérer bien supérieur à l’espace nécessaire au stockage des données elles-mêmes.

Mais, la souplesse et la rigueur apportées par la technologie XML ainsi que les capacités de stockage des données de plus en plus considérables, justifient largement son utilisation.

EXPLIQUONS CE QU’EST UN SCHEMA XML (XSD)

Avant d’examiner les fonctionnalités XML proposées par EXCEL, il est nécessaire de comprendre l’importance des schémas XML: les XSD.

Les schémas XML (XSD) permettent de décrire la structure et les typologies des données contenues dans un fichier XML ainsi que, éventuellement, les contraintes imposées aux valeurs que peuvent prendre ces données. Un schéma XML permet de vérifier la validité des fichiers XML qui s’y réfèrent.

Pour ce tutoriel, utilisons un XSD simple définissant les caractéristiques de fichiers XML stockant un catalogue d’articles comportant les colonnes Code_Article/Description/Date_Achat/Prix_Cession/Prix_Achat/Remise :

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="Catalogue_Articles">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="Article" minOccurs="0" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="Article">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="Code_Article" type="xs:string"/>
				<xs:element name="Description" type="xs:string"/>
				<xs:element name="Date_Achat" type="xs:string" minOccurs="0"/>
				<xs:element name="Prix_Cession" type="xs:decimal"/>
				<xs:element name="Prix_Achat" type="xs:decimal"/>
				<xs:element name="Remise" type="xs:decimal" default="0" minOccurs="0"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>

Commentaires sur ce schéma XSD.

Sa structure est à deux niveaux :

  • Un niveau Racine (Root) « Catalogue_Articles» indiquant une nombre indéterminé d’éléments grâce à la directive maxOccurs=”unbounded”
  • Un niveau Enfant (Child) « Article » composé de 6 éléments correspondant aux 6 colonnes de notre catalogue d’articles.

Quelques caractéristiques particulières des données :

  • La donnée « Date_Achat » est typée « String » et non « Date » car nous avons décidé de conserver un format de date « jj/mm/aaaa » . Le format « Date » XML étant, lui, de la forme « AAAA-MM-JJ ».
  • La donnée « Remise » est déclarée comme facultative grâce aux directives default=”0″ minOccurs=”0″.

Sauvegardons cet XSD dans un fichier nommé ‘Schemas_Articles.xsd’.

 

Remarques concernant les XSD et EXCEL

 

ASSURONS-NOUS DE LA PRESENCE DE L’ONGLET « DEVELOPPEUR »

Pour accéder aux fonctionnalités XML proposées par EXCEL, il est nécessaire que l’onglet « Développeur » soit présent dans le ruban EXCEL :

Si tel n’est pas le cas, procéder de la façon suivante :

  • Dans le menu EXCEL, naviguer vers Fichier/Options/Personnaliser le ruban.
  • Sélectionner l’onglet « Développeur » :

 CONSTITUONS LA FEUILLE DE DONNEES A EXPORTER

Soit la feuille EXCEL constituée des données à exporter suivante :

 (Cliquer sur l’image pour télécharger le fichier EXCEL)

AJOUTONS LE SCHEMA XML DE MAPPAGE

Dans l’onglet « Développeur », cliquer sur le bouton « Source » :

Dans la fenêtre « Source XML » qui s’affiche, cliquer sur le bouton « Mappage XML » :

Puis, sur le bouton « Ajouter » :

Sélectionner le fichier .xsd précedemment sauvegardé et cliquer sur le bouton « Ouvrir »:

EXCEL demande de choisir le nœud racine. Sélectionner « Catalogue_Articles » :

Après avoir cliqué sur OK, l’arborescence du schéma XML  s’affiche dans la fenêtre « Source XML »:

Pour réaliser le mappage entre les données EXCEL et le schéma XML(XSD) il suffit, au moyen de la souris, de faire glisser le nœud « Article » vers la cellule A1 de la feuille de données :

Une fois le mappage réalisé, Excel transforme automatiquement les données en un tableau structuré mappé sur le schéma XML (XSD) :

EXPORTONS LES DONNEES AU FORMAT XML

Pour exporter les données mappées vers une fichier XML, cliquer sur le bouton « Exporter » de l’onglet « Développeur » et nommer le fichier XML  «Catalogue_Articles.xml» :

Le fichier « Catalogue_Articles.xml » généré présente la structure suivante:

Q

TUTO EXCELLONS : Manipuler les formes par VBA

L’un des aspects le plus remarquable d’EXCEL réside dans sa capacité à dessiner une multitude de formes graphiques plus ou moins complexes, de pouvoir gérer leurs tailles, leurs couleurs, leurs positionnements, leurs comportements…

Ce tutoriel présente de façon concise ce qu’il est nécessaire de connaître pour manipuler les formes par programmation VBA. Seules les méthodes et propriétés de l’objet Shapes les plus utiles sont décrites.

Pour une référence exhaustive de l’objet Shapes, voir : https://learn.microsoft.com/fr-fr/office/vba/api/excel.shapes

(Les copies-écrans de ce tuto ont été réalisées à partir d’un classeur créé avec la version 365 d’EXCEL. Ce classeur est téléchargeable ici  )

QU’EST-CE QU’UNE FORME (SHAPE) POUR EXCEL ?

Pour EXCEL, la classe « Shape » (traduite ici par « Forme ») comprend une multitude d’objets graphiques.

Dans la figure ci-dessous, quelques objets graphiques membres de la classe ‘Shape‘:

Site cours Crypto-monnaies

Une forme (shape) peut être un objet « simple » comme une forme ‘automatique’ (une ligne, un carré…), une icône, une image ou bien un objet « complexe » comme un graphique, un objet SmartArt, un modèle 3D

LISTONS TOUTES LES FORMES CONTENUES DANS UNE FEUILLE

La collection ‘Shapes’ d’une feuille de calcul regroupe la collection de toutes les formes (shapes) présentes dans une feuille.

Le fragment de code ci-dessous énumère dans la fenêtre d’exécution les noms de toutes les formes présentes dans la feuille ‘ShapesSamples’ » donnée en exemple :

Sub ListerShapes()
    Dim oSheet As Worksheet, oSheetEnumeration As Worksheet
    Dim oShape As Shape
    Dim oLO As ListObject
    Dim oRange As Range, oCell As Range
    Dim sShapetype As String
    Dim v As Variant
    
    Set oSheet = ThisWorkbook.Worksheets("ShapesSamples")
    Set oSheetEnumeration = ThisWorkbook.Worksheets("ShapesTypesList")
    'On affecte l'objet Tableau structuré contenant les libellés des types de formes
    Set oLO = oSheetEnumeration.ListObjects("tblShapesTypes")
    Set oRange = oLO.ListColumns("Index").DataBodyRange
    
    'On parcourt toutes les formes de la feuille
    For Each oShape In oSheet.Shapes
        'On recherche le libellé du type de forme dans la table à partir de son index
        v = Application.Match(oShape.Type, oRange, 0)
        If Not IsError(v) Then
            sShapetype = oLO.ListColumns("Description").DataBodyRange.Cells(v, 1).Value
        Else
            sShapetype = "???"
        End If
        'On envoie les informations de la forme dans la fenêtre d'exécution
        Debug.Print "Index:" & oShape.ID & "-" & sShapetype & "-" & oShape.Name
    Next
    
    'On fait le ménage
    Set oSheet = Nothing
    Set oLO = Nothing
    Set oSheetEnumeration = Nothing
End Sub

Rappel : pour afficher la fenêtre d’exécution dans le VBE,  actionner Ctrl+G – Voir l’article BONNES PRATIQUES EXCELLONS : ‘Utilisons les outils de débogage

VBA_InventaireFormes

UTILISONS L’ENREGISTREUR DE MACROS

Du fait de la richesse et de la diversité des méthodes et propriétés exposées par les formes (shapes), nous gagnons beaucoup de temps en utilisant, dans un premier temps, l’enregistreur de macros.

Dans un second temps, nous corrigerons le code généré pour l’adapter et/ou le simplifier.

Pour une bonne utilisation de l’enregistreur de macros, reportons-nous à l’article BONNES PRATIQUES EXCELLONS :  Comment bien utiliser l’enregistreur de macros.

REFERENÇONS LES FORMES DANS LE CODE VBA

Référençons par index

Nous pouvons référencer une forme par son index dans la collection des « Shapes » de la feuille. Par exemple, pour nous référer à la forme d’index 3 dans la feuille :

Set oShape = oSheet.Shapes(3)

Cette méthode de référencement n’est ni très pratique ni très explicite, aussi privilégions le référencement pas nom.

 

Référençons par nom

Lorsque nous créons une forme dans une feuille (manuellement ou par code), EXCEL lui affecte un nom par défaut. Ce nom reprend le type de forme et y ajoute une numérotation chronologique. Par exemple :

« Image 7 »

Nous référençons cette forme par nom de la façon suivante :

     Set oShape = oSheet.Shapes(“Image 7”)

Aux noms affectés par défaut par EXCEL, il est préférable que nos formes portent des noms explicites.

 

Affectons un nom explicite

Nous affectons un nom explicite par VBA à nos formes en modifiant la propriété « Name » de la forme.

Par exemple :

 Set oShape = oSheet.Shapes(“Image 7”)

oShape.Name = “Excellons_Logo”

ATTENTION : Excel ne vérifie pas l’unicité des noms affectés. Si nous donnons le même nom à 2 formes différentes, lorsque, dans le VBA, nous affecterons un object Shape avec un nom dupliqué, l’affectation ne se réalisera que sur l’une des 2 formes.

INSERONS UN GRAPHE DANS UNE FEUILLE

Pour réaliser par VBA l’insertion d’un graphe dans une feuille tel que nous le faisons dans EXCEL en activant l’un des boutons suivants du ruban :

Ruban Insertion Graphiques

nous utilisons la méthode AddChart2 de l’objet Shapes : expression.AddChart2 (StyleXlChartTypeLeftTopWidthHeightNewLayout)

La liste des types de graphe (XlChartType) est disponible à la page : https://learn.microsoft.com/fr-fr/office/vba/api/excel.xlcharttype

(La méthode AddChart2 a été introduite avec la version 2013 d’EXCEL. Dans les versions précédentes c’est la méthode AddChart qui doit être utilisée). 

Cet article est focalisé sur l’objet Formes (Shape), il ne traite pas en détail des méthodes et propriétés de l’objet ‘Chart’.

Le fragment de code suivant créée un graphe de type secteur à partir de données présentes dans la plage P3:P12 de la feuille ‘Resultats’ du classeur exemple : 

Sub AddGraph()
    Dim oSheet As Worksheet
    Dim oShape As Shape
    Dim oChart As Chart
    
    Set oSheet = ThisWorkbook.Worksheets("Resultats")
    
    'On insère le graphe dans la feuille avec la méthode AddChart2
    Set oShape = oSheet.Shapes.AddChart2(333, xl3DPie, , , , True)
    With oShape
        'On référence l'objet Chart
        Set oChart = oShape.Chart
        With oChart
            'On affecte la source de données du graphe
            .SetSourceData oSheet.Range("P3:P12")
            'On donne un titre au graphe
            .ChartTitle.Text = "MON GRAPHE"
        End With
    End With
End Sub

Résultat obtenu :

Exemple de graphe obtenu par VBA

INSERONS UNE LEGENDE DANS UNE FEUILLE

Pour réaliser par VBA l’insertion d’une légende dans une feuille tel que nous le faisons dans EXCEL en activant l’un des boutons suivants du ruban :

Boutons Bulles et Légendes

nous utilisons la méthode AddCallout de l’objet Shapes : expressionAddCallout (TypeLeftTopWidthHeight)

La liste des types de légende (msoCalloutType) est disponible à la page : https://learn.microsoft.com/fr-fr/office/vba/api/office.msocallouttype

Le fragment de code suivant créée une légende de type lien unique à droite dans la feuille ‘Resultats’ du classeur exemple :

Sub AddLegend()
    Dim oSheet As Worksheet
    Dim oShape As Shape
    
    Set oSheet = ThisWorkbook.Worksheets("Resultats")
    Set oShape = oSheet.Shapes.AddCallout(msoCalloutOne, 50, 50, 80, 100)    
End Sub

Résultat obtenu :

Légende

INSERONS UNE COURBE DE BEZIER DANS UNE FEUILLE

Pour réaliser par VBA l’insertion d’une courbe de Bézier dans une feuille tel que nous le faisons dans EXCEL en activant le bouton du ruban suivant :

Bouton Courbe de Bézier

nous utilisons la méthode AddCurve de l’objet Shapes : expressionAddCurve (SafeArrayOfPoints).

La liste des points de la courbe est fournie à la méthode ‘AddCurve’ dans un tableau de valeurs.

Le fragment de code suivant créée une courbe de Bézier en Z avec des coordonnées de début (210,130) et de fin (315,225) :

Sub AddCourbeBezier()
    Dim oSheet As Worksheet
    Dim oShape As Shape
    Dim aPoints(1 To 7, 1 To 2) As Single
    
    'On rempli le tableau de coordonnées des points de la courbe de Bézier
    aPoints(1, 1) = 210
    aPoints(1, 2) = 130
    aPoints(2, 1) = 270
    aPoints(2, 2) = 150
    aPoints(3, 1) = 280
    aPoints(3, 2) = 160
    aPoints(4, 1) = 280
    aPoints(4, 2) = 175
    aPoints(5, 1) = 200
    aPoints(5, 2) = 190
    aPoints(6, 1) = 210
    aPoints(6, 2) = 205
    aPoints(7, 1) = 315
    aPoints(7, 2) = 225
    
    Set oSheet = ThisWorkbook.Worksheets("Resultats")
    Set oShape = oSheet.Shapes.AddCurve(aPoints())
End Sub

Résultat obtenu :

Courbe de Bézier

INSERONS UN CONTROLE DE FORMULAIRE DANS UNE FEUILLE

Pour réaliser par VBA l’insertion d’un contrôle de formulaire légende dans une feuille tel que nous le faisons dans EXCEL en activant l’un des boutons suivants du ruban :

Boutons contrôles de formulaire

nous utilisons la méthode AddFormControl de l’objet Shapes : expressionAddFormControl (TypeLeftTopWidthHeight)

La liste des types de contrôles de formulaires (XlFormControl) est disponible à la page : https://learn.microsoft.com/fr-fr/office/vba/api/excel.xlformcontrol

Le fragment de code suivant insère un contrôle de liste déroulante dans la feuille ‘Resultats’ du classeur exemple :

Sub AddCombobox()
    Dim oSheet As Worksheet
    Dim oShape As Shape
    
    Set oSheet = ThisWorkbook.Worksheets("Resultats")
    Set oShape = oSheet.Shapes.AddFormControl(xlDropDown, 5, 5, 55, 15)
End Sub

Résultat obtenu :

Liste déroulante

INSERONS UN LIEN VERS UN OBJET EXTERNE DANS UNE FEUILLE

Pour réaliser par VBA l’insertion d’un lien vers un objet externe dans une feuille tel que nous le faisons dans EXCEL en activant le bouton du ruban suivant :

Bouton Objet Incorporé

nous utilisons la méthode AddOLEObject de l’objet Shapes : expressionAddOLEObject (ClassTypeFileNameLinkDisplayAsIconIconFileNameIconIndexIconLabelLeftTopWidthHeight).

Les objets que l’on peut incorporer par cette méthode peuvent être des fichiers externes ou des classes particulières d’objets. Pour plus de détail, nous nous reporterons utilement à la page : https://learn.microsoft.com/fr-fr/office/vba/api/excel.shapes.addoleobject.

Le fragment de code suivant créée un lien vers un document PDF particulier dans la feuille “Resultats”:

Sub AddPDF()
    Dim oSheet As Worksheet
    Dim oShape As Shape
    Dim oRange As Range
    
    Set oSheet = ThisWorkbook.Worksheets("Resultats")
    Set oShape = oSheet.Shapes.AddOLEObject(, ThisWorkbook.Path & "\MonPDF.pdf", False, True, "C:\WINDOWS\Installer\{AC76BA86-1036-1033-7760-BC15014EA700}\_PDFFile.ico", 0, "Mon PDF", 5, 5, 50, 50)

End Sub

Résultat obtenu :

Lien vers document PDF

INSERONS UNE IMAGE DANS UNE FEUILLE

Pour réaliser par VBA l’insertion d’une Image dans une feuille tel que nous le faisons dans EXCEL en activant le bouton suivant du ruban :

Bouton Images

nous utilisons la méthode AddPicture2 de l’objet Shapes : expressionAddPicture2 (FileNameLinkToFileSaveWithDocumentLeftTopWidthHeightcompress).

Le fragment de code suivant insère une image dans la feuille ‘Resultats’ du classeur exemple :

Sub AddImage()
    Dim oSheet As Worksheet
    Dim oShape As Shape
    Dim oRange As Range
    
    Set oSheet = ThisWorkbook.Worksheets("Resultats")
    Set oShape = oSheet.Shapes.AddPicture2(ThisWorkbook.Path & "\Logo_Excellons.png", msoFalse, msoTrue, 5, 5 _
                        , Application.CentimetersToPoints(9), Application.CentimetersToPoints(4), True)
End Sub

Résultat obtenu :

Image insérée

INSERONS UNE FORME ‘AUTOMATIQUE’ DANS UNE FEUILLE

Pour réaliser par VBA l’insertion d’une forme ‘automatique’ dans une feuille tel que nous le faisons dans EXCEL en activant l’un des boutons suivants du ruban :

Formes 'Automatiques'

nous utilisons la méthode AddShape de l’objet Shapes : expression. AddShape (Type, Left, Top, Width, Height).

La liste des types de formes ‘automatiques’ (msoAutoShapeType) est disponible à la page : https://learn.microsoft.com/fr-fr/office/vba/api/office.msoautoshapetype

Le fragment de code suivant insère une forme de type « Bouton en relief » dans la feuille “Resultats”:

Sub AddFormAuto()
    Dim oSheet As Worksheet
    Dim oShape As Shape
    Dim oRange As Range
    
    Set oSheet = ThisWorkbook.Worksheets("Resultats")
    Set oShape = oSheet.Shapes.AddShape(msoShapeBevel, 5, 5, 50, 50)
End Sub

Résultat obtenu :

Bouton Relief

INSERONS UN GRAPHIQUE SMARTART DANS UNE FEUILLE

Pour réaliser par VBA l’insertion d’un graphique SmartArt dans une feuille tel que nous le faisons dans EXCEL en activant le bouton suivant du ruban :

Bouton SmartArt

nous utilisons la méthode AddSmartArt de l’objet Shapes : expressionAddSmartArt (LayoutLeftTopWidthHeight).

L’application EXCELLONS SMARTART_Reference.xlsm fournit une référence complète aux graphiques SmartArt.

Le fragment de code suivant insère un graphique SmartArt de type ‘entonnoir’ dans la feuille ‘Resultats’ du classeur exemple :

Sub AddCone()
    Dim oSheet As Worksheet
    Dim oShape As Shape
    Dim oSaLayout As SmartArtLayout
    
    Set oSheet = ThisWorkbook.Worksheets("Resultats")
    'On pointe sur l'illustration 'Entonnoir'
    Set oSaLayout = Application.SmartArtLayouts(68)
    'On créé une nouvelle forme contenant l'illustration voulue
    Set oShape = oSheet.Shapes.AddSmartArt(oSaLayout, 5, 5)
    'On affecte une couleur à la forme
    oShape.SmartArt.Color = Excel.Application.SmartArtColors(4)
End Sub

Résultat obtenu :

SmartArt Entonnoir

REPOSITIONNONS UNE FORME DANS LA FEUILLE

 

Positionnons la forme lors de sa création

A la création d’une forme au moyen de l’une des méthodes de l’objet Shapes, nous indiquons la position de son coin supérieur gauche exprimée en points.

(Si besoin, pour convertir les centimètres en points, nous disposons de la fonction Application.CentimetersToPoints ).

Ainsi, par exemple, pour positionner la forme à 1 centimètre à gauche et 1 centimètre en haut de la feuille au moment de sa création, nous écrirons :

Set oShape = oSheet.AddShape(msoShapeBevel, Application.CentimetersToPoints(1), Application.CentimetersToPoints(1), …)

Repositionnons une forme

Pour repositionner une forme, nous modifions ses propriétés « Left » et « Top » en indiquant leurs nouvelles valeurs en points (ou en centimètres en utilisant la fonction ‘Application.CentimetersToPoints’).

Ainsi, par exemple, pour repositionner une forme à 50 points à gauche et 50 points en haut de la feuille nous écrirons :

oShape.Left = 50
oShape.Top = 50

Repositionnons une forme par rapport à une cellule

Pour repositionner une forme par rapport à une cellule, nous référencerons les propriétés « Left » et « Top » de la cellule.

Ainsi, par exemple, pour repositionner une forme sur le coin haut-Gauche de la cellule « D4 » nous écrirons :

Set oRange = oSheet.Range(“D4”)
oShape.Left = oRange.Left
oShape.Top = oRange.Top

Gérons la propriété « Placement »

La propriété « Placement » de l’objet « Shape » nous permet de gérer le comportement des formes lors du redimensionnement des cellules.
Elle peut prendre l’une des valeurs suivantes :

xlFreeFloating = la forme conserve son positionnement lorsque les cellules sous-jacentes sont redimensionnées.
xlMove = la forme se déplace avec les cellules sous-jacentes (sans être redimensionnée).
xlMoveAndSize = la forme se déplace et se redimensionne avec les cellules sous-jacentes.

L’application EXCELLONS SmartTrombinoscope.xlsm fournit un exemple de mise en oeuvre de positionnements complexes de formes dans une feuille.

REDIMENSIONNONS  UNE FORME OU UN ENSEMBLE DE FORME

Dimensionnons la forme lors de sa création

A la création d’une forme au moyen de l’une des méthodes de l’objet Shapes, nous indiquons la largeur et la hauteur de la forme exprimées en points.

(Si besoin, pour convertir les centimètres en points, nous disposons de la fonction Application.CentimetersToPoints ).

Ainsi, par exemple, pour dimensionner un rectangle biseauté à 100 points de large et 100 points de haut, nous écrirons lors de sa création, :

Set oShape = oSheet.AddShape(msoShapeBevel, …, …,100,100)

Redimensionnons une forme

Pour redimensionner une forme, nous modifions ses propriétés « Width » et « Height » en indiquant leurs nouvelles valeurs en points (ou en centimètres en utilisant la fonction ‘Application.CentimetersToPoints’).

Ainsi, par exemple, pour redimensionner une forme à 200 de large et 200 points de haut, nous écrirons :

oShape.Width = 200
oShape.Height = 200
 

Redimensionnons une forme par rapport à une cellule ou une plage de cellules

Pour redimensionner une forme par rapport à la taille d’une cellule ou d’une plage de cellules, nous référencerons les propriétés « Width » et « Height » de la cellule ou de la plage de cellules.

Ainsi, par exemple, pour redimensionner une forme à la taille de la plage de cellules « D4:F6  » nous écrirons :

Set oRange = oSheet.Range(“D4:F6”)
oShape.Width = oRange.Width
oShape.Height = oRange.Height

Gérons la propriété ‘LockAspectRatio‘ 

 

La propriété « LockAspectRatio » de l’objet Shape permet de gérer le comportement des formes lors du redimensionnement.

Elle prend les valeurs suivantes :

  • msoTrue = la forme se redimensionne en conservant ses proportions. Si, par exemple, la largeur de la forme est modifiée, sa hauteur se redimensionne proportionnellement.
  • msoFalse = la forme ne conserve pas ses proportions. Si, par exemple, la largeur de la forme est modifiée, sa hauteur reste inchangée.

 

Redimensionnons un ensemble de formes avec les méthodes ‘ScaleWidth-ScaleHeight’

Avec les méthodes « ScaleWidth » et « ScaleHeight » nous diminuons ou augmentons proportionnellement la taille des formes en largeur (ScaleWidth) ou en hauteur (ScaleHeight).

Ce fragment de code, diminue la taille des formes d’une feuille de la moitié de leurs tailles initiales :

Sub ShrinkAllShapes()
    Dim oSheet As Worksheet
    Dim oShape As Shape
    
    Set oSheet = ThisWorkbook.Worksheets("ShapesSamples")
    'On parcourt toutes les formes présentes dans la feuille
    For Each oShape In oSheet.Shapes
        'On conserve les proportions de la forme
        oShape.LockAspectRatio = msoTrue
        'Dans le cas où la forme ne supporte pas la méthode ScaleWidth, on ignore l'erreur
        On Error Resume Next
        'On diminue la taille de la forme de moitié = 50%
        oShape.ScaleWidth 0.5, msoTrue
        'On rétablit la gestion des erreurs
        On Error GoTo 0
    Next
End Sub

ATTENTION : Certaines formes ne supportent pas la méthode ‘ScaleWidth’ , c’est la raison pour laquelle l’instruction ‘On Error Resume Next’ est utilisée dans ce fragment de code.

Pour la gestion des erreurs d’exécution, reportons-nous au document BONNES PARTIQUES EXCELLONS : VBA_GestionErreurs.pdf

 

L’application EXCELLONS SmartTrombinoscope.xlsm fournit un exemple de mise en oeuvre du dimensionnement complexes de formes dans une feuille.

AJOUTONS DU TEXTE A UNE FORME ET FORMATONS-LE

 

Toutes les formes (shapes) exposent la propriété TextFrame permettant d’ajouter du texte à une forme au moyen de code VBA.

Par exemple pour ajouter du texte à une forme MaLegende présente dans la feuille ‘Resultats” du classeur exemple, nous écrirons :

Sub AddTextToLegend()
    Dim oSheet As Worksheet
    Dim oShape As Shape
    
    Set oSheet = ThisWorkbook.Worksheets("Resultats")
    Set oShape = oSheet.Shapes("MaLegende")
    oShape.TextFrame.Characters.Text = "EXCELLONS.org : c'est le top !"
End Sub

Résultat obtenu :

Texte ajouté à une forme légende

L’objet Textframe expose la méthode Characters permettant de formater le texte d’une forme (police, taille, couleur…). Deplus, il possède un ensemble de propriétés que l’on peut valoriser par code VBA.

Par exemple, le fragment de code suivant formate le texte ajouté à la forme MaLegende présente dans la feuille ‘Resultats” du classeur exemple :

Sub FormatTextToLegend()
    Dim oSheet As Worksheet
    Dim oShape As Shape
    
    Set oSheet = ThisWorkbook.Worksheets("Resultats")
    Set oShape = oSheet.Shapes("MaLegende")
    
    'Formatons les 13 premiers caractères du texte : corps 12, en gras et en vert
    With oShape.TextFrame.Characters(1, 13).Font
        .Color = RGB(0, 255, 0)
        .Size = 12
        .Bold = True
    End With
    'Formatons les 14 caractères à la partir de la position 17 du texte: corps 16, en gras, en rouge et soulignés
    With oShape.TextFrame.Characters(17, 14).Font
        .Color = RGB(255, 0, 0)
        .Size = 16
        .Bold = True
        .Underline = xlUnderlineStyleSingle
    End With
    
    'Centrons le texte horizontalement et verticalement
    oShape.TextFrame.HorizontalAlignment = xlHAlignCenter
    oShape.TextFrame.VerticalAlignment = xlVAlignCenter
End Sub

Résultat obtenu :

Texte de légende formaté

MODIFIONS LES COULEURS ET LE REMPLISSAGE D’UNE FORME

 

Les formes (shapes) exposent un ensemble de propriétés permettant d’agir sur la couleur et le type des contours ainsi que sur la couleur et le remplissage de l’intérieur de la forme.

A titre d’exemple, le fragment de code suivant trace une pentagone, définit ses contours en tant que tirets, les colorise en rouge et remplit son intérieur de briquettes de couleur verte :

Sub TracePentagone()
    Dim oSheet As Worksheet
    Dim oShape As Shape
    Dim oRange As Range
    Dim aPoints(1 To 6, 1 To 2) As Single
    
    'On affecte les coordonnées des sommets du pentagone
    aPoints(1, 1) = 520
    aPoints(1, 2) = 93
    aPoints(2, 1) = 433
    aPoints(2, 2) = 211
    aPoints(3, 1) = 180
    aPoints(3, 2) = 194
    aPoints(4, 1) = 70
    aPoints(4, 2) = 76
    aPoints(5, 1) = 232
    aPoints(5, 2) = 51
    aPoints(6, 1) = 520 'le dernier sommet possède des coordonnées identiques au premier sommet
    aPoints(6, 2) = 93  '-> pour fermer le polygone
    
    Set oSheet = ThisWorkbook.Worksheets("Resultats")
    'On insère le pentagone dans la feuille
    Set oShape = oSheet.Shapes.AddPolyline(aPoints)
    With oShape
        'On colorise les bordures du pentagone en tirets rouges
        With .Line
            .DashStyle = msoLineDashDotDot
            .ForeColor.RGB = RGB(255, 0, 0)
        End With
        'On remplit le pentagone de briques vertes
        With .Fill
            .Patterned msoPatternHorizontalBrick
            .BackColor.RGB = RGB(0, 255, 0)
        End With
    End With
End Sub

Résultat obtenu :

Pentagone rouge et vert

(Bon d’accord, ce résultat n’est pas esthétiquement très réussi…) 

ASSIGNONS UNE MACRO EXECUTEE LORS DU CLIC SUR UNE FORME

 

La propriété ‘OnAction’ permet d’exécuter une macro donnée lors du clic sur une forme.

Soit, par exemple, la macro suivante à exécuter lors du clic sur une forme :

Sub displayInfo()
    MsgBox "Lien vers EXCELLONS.org: " & vbCrLf _
         & "https://excellons.org/" _
         , vbExclamation, "MESSAGE DE LA PLUS HAUTE IMPORTANCE !"
End Sub

Assignons l’exécution de cette macro lors d’un clic sur la forme ‘MaLegende’ de la façon suivante :

Sub assignMacro()
    Dim oSheet As Worksheet
    Dim oShape As Shape
    
    Set oSheet = ThisWorkbook.Worksheets("Resultats")
    Set oShape = oSheet.Shapes("MaLegende")
    
    oShape.OnAction = "displayInfo"
End Sub

Résultat obtenu lors du clic sur la forme :

Action sur clic

RELIONS DES FORMES ‘AUTOMATIQUES’ AVEC DES CONNECTEURS

 

Nous pouvons par VBA relier des formes ‘Automatiques’ (AutoForm) au moyen de formes connecteurs (msoConnectorElbow) et ainsi obtenir, par exemple, une résultat de type ordinogramme :

Action sur clic

Pour obtenir ce résultat, procédons de la façon suivante :

  • Créeons, colorisons et positionnons sur la feuille autant de formes ‘automatiques’ que nécessaire. Dans notre exemple, 4 formes de plusieurs sortes au moyen du code VBA suivant :
Sub Add4Shapes()
    Dim oSheet As Worksheet
    Dim oShape As Shape
    
    'On référençe la feuille cible
    Set oSheet = ThisWorkbook.Worksheets("Resultats")
    
    'Insérons la forme 'Database'
    InsertNewShape oSheet, msoShapeFlowchartMagneticDisk, "BaseSQL", "B2:B6", msoThemeColorAccent4, "Base SQL"
    
    'On insère la forme 'Traitement'
    InsertNewShape oSheet, msoShapeFlowchartProcess, "Traitement", "C9:D12", msoThemeColorAccent6, "Traitement"
    
    'On insère la forme 'Etats'
    InsertNewShape oSheet, msoShapeFlowchartMultidocument, "Etats", "B16:B19", msoThemeColorAccent5, "Etats 1,2,3..."
    
    'On insère la forme 'Ecran'
    InsertNewShape oSheet, msoShapeFlowchartDisplay, "Display", "E16:E19", msoThemeColorAccent5, "Ecran"
End Sub
Sub InsertNewShape(zSheet As Worksheet, zShapeType As MsoAutoShapeType, zShapeName As String, zShapeRange As String, zColor As Variant, zTexte As String)
    Dim oShape As Shape
    Dim oRange As Range
    
    'On référence la plage de cellules transmise pour le positionnement
    Set oRange = zSheet.Range(zShapeRange)
    
    'On ajoute la forme voulue à partir des paramètres transmis et des propriétés de la plage de cellules transmise
    Set oShape = zSheet.Shapes.AddShape(zShapeType, oRange.Left, oRange.Top, oRange.Width, oRange.Height)
    
    With oShape
        'On affecte à la forme le nom transmis
        .Name = zShapeName
        'On affecte à la forme la couleur transmise
        .Fill.ForeColor.ObjectThemeColor = zColor
        
        'On affecte et formate le texte contenu dans la forme
        With .TextFrame
            With .Characters
                .Text = zTexte
                .Font.Bold = True
                .Font.Color = vbBlack
            End With
            'On positionne le texte dans la forme
            .HorizontalAlignment = xlHAlignCenter
            .VerticalAlignment = xlVAlignCenter
        End With
    End With
    
End Sub

 

  • Maintenant, relions les formes avec des connecteurs. Les méthodes Beginconnect et Endconnect, propres aux objects Connectors permettent de relier 2 formes entre-elles. Dans notre exemple, les 4 formes sont reliées au moyen du code VBA suivant :
Sub AddConnectors()
    Dim oSheet As Worksheet
    Dim oShape1 As Shape, oShape2 As Shape
    Dim oRange As Range
    
    'On référençe la feuille cible
    Set oSheet = ThisWorkbook.Worksheets("Resultats")
    
    'On connecte la forme 'Database' à la forme "Traitement"
    Set oShape1 = oSheet.Shapes("BaseSQL")
    Set oShape2 = oSheet.Shapes("Traitement")
    InsertConnector oSheet, oShape1, oShape2, 5, 1

    'On connecte la forme 'Traitement' à la forme "Etats"
    Set oShape1 = oSheet.Shapes("Traitement")
    Set oShape2 = oSheet.Shapes("Etats")
    InsertConnector oSheet, oShape1, oShape2, 3, 1

    'On connecte la forme 'Traitement' à la forme "Display"
    Set oShape1 = oSheet.Shapes("Traitement")
    Set oShape2 = oSheet.Shapes("Display")
    InsertConnector oSheet, oShape1, oShape2, 3, 1

End Sub
Sub InsertConnector(zSheet As Worksheet, zShape1 As Shape, zShape2 As Shape, zPoint1 As Long, zPoint2 As Long)
    Dim oConnector As Shape
    Dim oRange As Range
    
    'On insère le connecteur en utilisant les paramètres transmis
    Set oConnector = zSheet.Shapes.AddConnector(msoConnectorElbow, 120, 50, 200, 100)    
    
    With oConnector
        'On formate le connecteur
        .Line.Weight = 1.75
        .Line.ForeColor.ObjectThemeColor = msoThemeColorDark2
        .Line.EndArrowheadStyle = msoArrowheadTriangle
        'On relie les 2 formes passées en paramètres avec le connecteur suivant les 2 points passés en paramètres
        .ConnectorFormat.BeginConnect zShape1, zPoint1
        .ConnectorFormat.EndConnect zShape2, zPoint2
    End With
End Sub

Les méthodes BeginConnect et EndConnect réclament comme second paramètre obligatoire SiteConnection indiquant le point d’ancrage du connecteur sur la forme à relier.

Ce point d’ancrage est à choisir parmi les points d’ancrage existants pour la forme à relier. ‘SiteConnection’ est un entier dont la valeur se situe entre ‘1’ et le nombre maximum de points d’ancrage de la forme. Chaque type de forme possède sa propre collection de points d’ancrage. Le nombre maximum de points d’ancrage d’une forme est retourné par la propriété ConnectionSiteCount de la forme.

Il n’est pas aisé de connaitre a priori le numéro du point d’ancrage pour pour positionner le connecteur à un point d’ancrage précis d’une forme. Si, comme dans notre exemple, nous désirons positionner les connecteurs à des points bien spécifiques des formes, le plus simple est d’utiliser l’enregistreur de macro pour déterminer les numéros de ces points.

Une autre option consiste à indiquer dans un premier temps, comme point d’ancrage ‘1’ et d’utiliser la méthode Rerouteconnections de l’objet ‘Connector’. Cette méthode a pour effet de prendre le chemin le plus court entre les deux formes reliées.

Q

TUTO EXCELLONS : CAPTURONS et TRANSFORMONS les données du WEB

De plus de plus de données sont accessibles à partir de pages WEB.

Grâce à ce tutoriel capturons et transformons les données du WEB avec un minimum d’effort.

(Les copies-écrans du présent document sont issues d’EXCEL version 365)

QUELLES DONNEES WEB SONT RECUPERABLES DANS EXCEL ?

Avant de nous lancer dans la récupération de données capturées sur le WEB, nous devons nous assurer que ces données sont récupérables dans EXCEL.

D’une façon générale nous pourrons récupérer les données d’une page WEB se présentant sous la forme d’un tableau.

Pour nous en assurer, il suffit de nous rendre sur la page WEB visée, de copier le tableau de données voulu (ctrl+C) et le coller dans une feuille EXCEL vierge (ctrl+V).

Si, après cette opération, nous obtenons les données en colonnes avec entêtes dans EXCEL nous avons de bonnes chances de pouvoir utiliser avec succès les fonctions de récupération de données.

Site cours Crypto-monnaies
Pour ce tutoriel, nous nous proposons de récupérer les cours des crypto-monnaies (Bitcoin et autres…) à une fréquence quotidienne. Pour ce faire, nous utiliserons le site courscryptomonnaies.com  pour récupérer les données qu’il expose.

Pour simplifier, le site WEB utilisé se trouve en accès libre (accès anonyme). Il est tout à fait possible de récupérer également des données sur des pages WEB réclamant une connexion explicite « Code Utilisateur/Mot de passe ». Ce tutoriel ne détaille pas les étapes à suivre pour ce type de connexion (si besoin, se reporter à la page https://learn.microsoft.com/fr-fr/power-query/connector-authentication)

CREONS UN LIEN AVEC LE SITE WEB

Ouvrons un nouveau classeur EXCEL et dans l’onglet « Données » du ruban, cliquons sur l’icône ‘A partir du WEB’ :

Etablir avec lien avec le site WEB

Dans la fenêtre qui s’ouvre, indiquons l’adresse (l’URL) du site WEB désiré :

URL Site Cours Crypto

Cliquons sur OK.

Le formulaire « Navigateur » s’ouvre. Sélectionnons « Table » dans sa partie gauche :

Navigateur Site WEB

Dans sa partie droite du formulaire « Navigateur » affiche un aperçu des données voulues puis, dans le bas du formulaire, sélectionnons « Charger dans… » de la liste déroulante :

Charger Dans

Dans le fenêtre « Importation des données », choisissons « Insérer les données dans » la feuille existante en $A$1 puis cliquons ur OK :

Importation des Données

Après le temps nécessaire pour le chargement des données, nous obtenons le tableau suivant dans le feuille EXCEL :

Resultat Importation

PROGRAMMONS L’ ACTUALISATION DES DONNEES

 

Dans le ruban, après avoir sélectionné une cellule quelconque du tableau obtenu, cliquons la liste déroulante ‘Actualiser tout’ et choisissons ‘Propriétés de connexion… ‘ :

Proprietes de la Connexion

Dans le formulaire « Propriétés de la requête » sélectionnons :

  • Activer l’actualisation en arrière-plan
  • Actualiser toutes les 360 minutes (6 heures) ou indiquer une autre périodicité
  • Actualiser les données lors de l’ouverture du fichier.
Mise à jour des Proprietes

PERSONNALISONS LES DONNÉES RECUPÉRÉES

Maintenant que nos données sont récupérées, nous aimerions bien améliorer leur présentation :

  • Nous voulons supprimer la première colonne (« Rang ») et la dernière colonne (« Détail ») sans intérêt pour nous.
  • Nous voulons trier les cours sur la colonne « Variation (24h) » en ordre décroissant pour obtenir le hit-parade des crypto-monnaies relativement à leur variation d’un jour à l’autre.

Après avoir sélectionné une cellule quelconque de notre tableau, cliquons sur « Requêtes et connexions » dans l’onglet « Données » du ruban, puis sur « Table 0 » dans la partie droite ouverte dans le classeur :

Activer l'Editeur Power Query

L’ Editeur Power Query EXCEL s’ouvre .

    • Commençons par supprimer les données indésirables : sélectionnons les colonnes « Rang » et « Détails » et cliquons sur l’icône « Supprimer les colonnes ».
Editeur Power Query

Dans le cas où nous voudrions trier sur la colonne ‘Variation (24h)’ les choses seront plus complexes : cliquons sur l’entête ‘Variation (24h)’ et sélectionnons ‘tri décroissant’. Le résultat obtenu n’est pas celui attendu. Cela tient au fait que les données de cette colonne sont stockées sous format ‘Texte’ et non sous format ‘Numérique’.

Il nous faut alors avoir recours à la transformations de données et procéder en plusieurs étapes. 

  1. Effaçons le signe « % » :
    • Sélectionnons la commande « Remplacer les valeurs » :
Remplacer Valeurs

Dans la fenêtre qui s’ouvre, saisissons le caractère ‘%’ dans le champ ‘Valeur à rechercher’ et laisson vide le champ ‘Remplacer par’ et cliquons sur ‘OK’ :

Remplacer Valeurs

2. Remplaçons le séparateur décimal point ‘.’ par une virgule ‘, ‘

    • Sélectionnons une nouvelle fois la commande « Remplacer les valeurs » :
Remplacer Valeurs

3. Transformons les données de la colonne numérique décimal.

    • Sélectionnons l’onglet ‘Transformer’ puis, dans la liste déroulante ‘Type de données’ choisissons ‘Nombre décimal’ :
Transformer Decimal

4. Divisons les données par 100

    • Dans l’onglet « Transformer», sélectionnons « Standard » puis dans la liste déroulante sur « Diviser ».
Activer Diviser

 

    • Dans la fenêtre qui s’ouvre, indiquons la valeur ‘100’ et cliquons sur OK :
Diviser colonne Par 100

5. Sélectionnons l’onglet « Accueil » puis « Fermer et charger»:

Résultat Transformations

Dans le feuille EXCEL, les données transformées se présentent ainsi :

Résultats Excel

Pour finaliser la présentation, cliquons sur la colonne ‘Variation (24h)’ puis, dans le volet « Accueil », partie   « Nombre », choisissons « Pourcentage » :

Mise en forme Pourcentage

Enfin, trions sur la colonne ‘Variation (24h)’ avec le chois ‘Trier du plus grand au plus petit‘ :

Trier Descendant

A l’issue des diverses transformations, nous obtenons le tableau suivant :

Resultat Final

Q