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

OFFICE SCRIPTS – Une Introduction

 

OFFICE SCRIPTS c’est quoi ?

Globalement,  Office Scripts est pour Excel mode online l’équivalent de ce que l’enregistreur de macros et de l’éditeur VBE est pour EXCEL mode bureau.

Nous écrivons les scripts d’OFFICE SCRIPTS en langage TypeScript lui-même hérité du langage JavaScript (ce qui rapproche ces scripts de ceux écrits en Google Apps Script pour les GOOGLE SHEETS).

Usage basique d’OFFICE SCRIPTS

Sur le même principe que l’enregistreur de macros d’EXCEL mode bureau, l’enregistreur d’actions nous permet d’enregistrer une série d’actions dans EXCEL online, de donner un nom à cette série puis de la reproduire en l’exécutant.

Usage avancé d’OFFICE SCRIPTS

Sur le même principe que l’éditeur VBE d’EXCEL mode bureau, l‘éditeur de code intégré nous permet de créer des scripts à partir de rien ou de modifier les scripts générés par l’enregistreur d’actions. Avant de nous lancer dans l’écriture de code, nous devons posséder un minima de connaissance du langage TypeScript. L’investissement nécessaire à cet apprentissage dépend grandement de notre connaissance préalable de la programmation (Si nous maîtrisons le langage Javascript, cet investissement devrait être relativement léger).

Ce qu’il nous faut pour bénéficier d’OFFICE SCRIPTS

Pour pouvoir bénéficier d’OFFICE SCRIPTS, nous devons disposer d’un des abonnements Microsoft 365 listés ici.

Dans sa version de mars 2022, OFFICE SCRIPTS n’est pas disponible dans EXCEL mode bureau.

Lorsque nous disposons d’un abonnement Microsoft 365 éligible à OFFICE SCRIPTS, l’onglet Automatiser est ajouté au ruban EXCEL mode online :

Menu_Debogage_Compiler

Trouvons de l’aide sur OFFICE SCRIPTS

En mars 2022 le produit OFFICE SCRIPTS est encore récent et, de ce fait, l’offre d’aide est encore limitée.

La documentation en ligne d’OFFICE SCRIPTS de Microsoft est accessible ici.

Nous disposons de vidéos de présentation d’Office Scripts. En premier lieu celles réalisées par Microsoft ou encore celles réalisées par d’autres contributeurs : celle de Kevin Stratvert (en anglais) ou celle de Leila Gharani (en anglais) par exemple.

Au moment de l’écriture de cet article, aucune formation dédiée à Office Scripts n’a pu être trouvée. A défaut, nous pouvons, si besoin, nous former à JavaScript. La plateforme de formations Udemy en propose plusieurs dont certaines réalisées par des formateurs de langue française.

Nous pouvons soumettre nos problèmes et questions sur les forums d’échanges en français tel que celui d’EXCEL-PRATIQUE auquel nous contribuons.

L’ouvrage ‘Typescript notions fondamentales’ aux éditions ENI s’adresse aux développeurs disposant déjà d’une pratique de programmation dans d’autres langages.

Voyons les différences essentielles entre OFFICE SCRIPTS et VBA

(Constat de mars 2022)

Portée d’Office Scripts versus portée du VBA

  • Alors que le VBA n’est utilisable dans EXCEL qu’en mode bureau, a contrario, OFFICE SCRIPTS n’est (actuellement) disponible qu’en mode online.
  • Cependant, il semble que Microsoft ait la volonté d’étendre l’usage OFFICE SCRIPTS à l’avenir. Pour autant, compte-tenu du nombre considérable de solutions VBA actuellement en œuvre, il est quasi certain que la fin du VBA n’est pas pour demain.

Stockage des Scripts

  • Avec le VBA les macros sont stockées dans le même fichier que le classeur alors que les fichiers de scripts OFFICE SCRIPTS (d’extension .osts) sont stockés dans le dossier “Scripts Office” de notre espace OneDrive. Cela offre l’avantage de pouvoir aisément et à notre convenance partager nos scripts entre nos divers classeurs et d’en faire bénéficier d’autres utilisateurs de notre organisation.
Menu_Debogage_Compiler

Déclaration des objets manipulés

  • Alors que VBA tolère la déclaration implicite des objets manipulés dans un classeur, OFFICE SCRIPTS impose une déclaration explicite de tout objet manipulé. Ainsi par exemple pour l’objet ‘worksheet’, VBA (à défaut d’une déclaration explicite) considère la feuille sélectionnée dans le classeur comme étant la feuille manipulée, alors que pour OFFICE SCRIPTS la déclaration explicite de la feuille manipulée est impérative. Nous réalisons cette déclaration dans le code TypeScript avec une instruction let :
Menu_Debogage_Compiler

Référencement par indice

  • Une différence essentielle : le référencement des cellules par indice.
    Dans VBA le référencement des cellules par indice a pour base 1 alors que dans OFFICE SCRIPTS le référencement des cellules par indice a pour base 0.
    Ainsi, pour référencer par indice la cellule “A1” de la feuille active, dans VBA nous écrivons :
    set oCell = Activesheet.Cells(1,1)
    alors que dans un script OFFICE SCRIPTS nous écrivons :
    let oCell = SelectedSheet.getCells(0,0)

Déclenchement des scripts

  • Dans la version de mars 2022, OFFICE SCRIPTS est capable de déclencher l’exécution de script au moyen d’un bouton déposé sur la feuille du classeur.
    Contrairement aux macros VBA qui peuvent être déclenchées sur un évènement (par exemple lorsque la valeur d’une certaine cellule change) OFFICE SCRIPTS n’en a pas la capacité dans sa version actuelle (gageons que ces limitations évolueront dans un futur proche, restons vigilants…).
  • Au demeurant, l’application POWER AUTOMATE (incluse dans les abonnements Microsoft 365) nous permet de déclencher les scripts OFFICE SCRIPTS sur certains évènements comme : l’arrivée d’un mail dans OUTLOOK 365 ou la survenue d’une heure ou d’une date déterminée.

Interaction avec les utilisateurs

  • Encore une différence essentielle : dans la version mars 2022, OFFICE SCRIPTS ne nous permet pas d’interagir avec les utilisateurs.
    Avec VBA nous interagissons avec les utilisateurs au moyen de formulaires “userforms” ou avec l’instruction “Input” ou bien encore avec l’instruction “Msgbox”. Toutes ces techniques sont actuellement indisponibles dans OFFICE SCRIPTS. L’application POWER AUTOMATE (incluse dans les abonnements Microsoft 365) pourrait nous offrir une alternative.

Gestion des erreurs et exceptions

  • Une bonne nouvelle : OFFICE SCRIPTS comporte une instruction ‘try…catch…finally’.
    Grâce à l’instruction ‘try…catch…finally’ OFFICE SCRIPTS nous permet de gérer les erreurs et les exceptions de façon structurée.
    (Un ouf de soulagement est poussé par les tenants de la programmation structurée, dont nous sommes, horrifiés par les instructions “On Error…” parfois incontournables en VBA).

 Ajout automatique de commentaires par Office Scripts

  • L’enregistreur d’actions OFFICE SCRIPTS ajoute automatiquement des lignes de commentaires (en anglais actuellement) commençant par ‘//’ dans le code généré. Il ajoute également un commentaire lorsqu’il n’a pas pu générer le code sur une action particulière (ceci est bien utile pour avoir connaisance de ces actions non automatisables).
  • Dans l’image suivante, les lignes de commentaires générées automatiquement sont surlignées en jaune :
Menu_Debogage_Compiler

Illustrons OFFICE SCRIPTS par un exemple

A titre d’exemple, reprenons l’application EXCELLONS ‘Jours fériés en France’ téléchargeable ici.

Application EXCEL "Jours fériés en France"

Lorsque nous ouvrons ce classeur dans EXCEL en mode bureau, si nous modifions le territoire ou l’année, le tableau des jours fériés est automatiquement mis à jour, de même que le nombre de jours ouvrés.

Par contre, lorsque nous ouvrons ce classeur dans EXCEL en mode online, si nous modifions le territoire ou l’année… OUPS! Rien ne se passe…

En effet, EXCEL mode online ne prend pas en charge ni les évènements du classeur ni les macros VBA (comme vu dans le chapitre précédent). Dans le cas où nous voudrions transposer les fonctions réalisées par VBA, il nous faut réaliser un script OFFICE SCRIPTS en TypeScript.

Une fois mis au point, ce script sera exécuté dans EXCEL mode online de la façon suivante:

Application EXCEL "Jours fériés en France"

A noter que les Office scripts se comportent de façon identique sur plateforme WINDOWS et MAC. A contrario, le code VBA de ce classeur ne peut s’exécuter sur MAC (du fait de l’absence de l’objet ‘MSXML2.XMLHTTP’ dans cette environnement).

Ci-dessous, nous fournissons l’intégralité du code Office Scripts permettant de réaliser, en environnement EXCEL Online, la mise à jour du tableau de résultats en fonction du territoire et de l’année choisis :

//OfficeScript de récupération des jours fériés en France pour un territoire donné et une année donnée.
async function main(workbook: ExcelScript.Workbook){
//On vérifie que le classeur est celui attendu
const cWorkbookName = 'JoursFeries.xslm';
let sWorkbookName: string = workbook.getName();
if (sWorkbookName = cWorkbookName) {
    try {
        //On affecte la feuille et on vérifie que la feuille active est celle attendue
        let oActiveSheet: ExcelScript.Worksheet = workbook.getWorksheet('Accueil');
        try {
            //On affecte toutes les zones nommées et on vérifie leur présence
            let sChoixZone = oActiveSheet.getRange('txtZone').getValue();
            let sChoixAnnee = oActiveSheet.getRange('txtAnnee').getValue().toString();
            let oCellStatut = oActiveSheet.getRange('txtStatut');
            let oTableau: ExcelScript.Table = oActiveSheet.getTable('tblResult');
            let oCellMsg = oActiveSheet.getRange('txtMessage');

            //On efface le message et le statut
            oCellMsg.clear(ExcelScript.ClearApplyTo.all);
            oCellStatut.clear(ExcelScript.ClearApplyTo.all);

            //On efface le contenu du tableau de résultats
            oTableau.getRangeBetweenHeaderAndTotal().clear(ExcelScript.ClearApplyTo.all)

            //On initialise la cellule statut
            oCellStatut.getFormat().getFill().setColor('orange');
            oCellStatut.setValue('En cours...');

            //On déclare l'URL racine de l'API
            const cUrl = 'https://calendrier.api.gouv.fr/jours-feries/';
            //On constitue la requête pour l'API
            const sRequestString = cUrl + sChoixZone + '/' + sChoixAnnee + '.json';
            //On constitue la formule à copier dans la colonne 'Jour de la semaine' pour obtenir le jour de la semaine
            const sFormula = "=SI(ESTNUM([@[Jour férié]]);TEXTE([@[Jour férié]];\"jjjj\");\"\")";

            //On affecte l'objet Request API
            const oRequest = await fetch(sRequestString);            
            try {
                //On teste le statut de la réponse de l'API
                if (oRequest.status === 200) {
                    //On récupère la réponse de l'API
                    const oResponseJSON: string = await oRequest.json();
                   
                    //On parse la réponse de l'API
                    const sResponse = JSON.stringify(oResponseJSON);
                    let lLen = sResponse.length;
                    let sUsageData = sResponse.substring(1, lLen - 1);
                    const aUsageData = sUsageData.split(',');

                    //On traite chaque ligne de la réponse parsée
                    for (let i = 0; i < aUsageData.length; i++) {
                        let aUsageText = aUsageData[i].split(':');

                        //On remplit la première colonne du tableau avec les dates reçues
                        let sText: string  = aUsageText[0].trim();
                        lLen = sText.length;                    
                        sText = sText.substring(1, lLen - 1);
                        oTableau.getRangeBetweenHeaderAndTotal().getCell(i, 0).setValue(sText);
                        oTableau.getRangeBetweenHeaderAndTotal().getCell(i, 0).getFormat().setHorizontalAlignment(ExcelScript.HorizontalAlignment.center);

                        //On remplit la deuxième colonne du tableau avec le libellé reçu
                        let sText2: string = aUsageText[1].trim();
                        lLen = sText2.length;
                        sText2 = sText2.substring(1, lLen - 1);
                        oTableau.getRangeBetweenHeaderAndTotal().getCell(i, 1).setValue(sText2);

                        //On remplit la troisième colonne du tableau avec la formule donnant le jour de la semaine
                        oTableau.getRangeBetweenHeaderAndTotal().getCell(i, 2).setFormulaLocal(sFormula);                        
                    }
                    //On met en forme le message de résultat et le statut à OK
                    oCellStatut.getFormat().getFill().setColor('green');
                    oActiveSheet.getRange('E5').getFormat().getFont().setColor("FFFFFF");
                    oCellStatut.getFormat().setHorizontalAlignment(ExcelScript.HorizontalAlignment.center);
                    oCellStatut.setValue('OK');
                    oCellMsg.setValue("L'API a renvoyé " + aUsageData.length + " jours fériés en " + sChoixAnnee + " pour le territoire '" + sChoixZone + "'." );
                    oCellMsg.getFormat().getFont().setColor('green');

                    //On fait pointer le surseur sur la ligne de titre
                    let oRange = oActiveSheet.getRange("B2:D2");
                    oRange.select();
                }
                else {
                    //Dans le cas où l'on obtient une erreur de l'API
                    oCellStatut.getFormat().getFill().setColor('red');
                    oCellStatut.setValue('Erreur');
                    oCellStatut.getFormat().setHorizontalAlignment(ExcelScript.HorizontalAlignment.center);
                    //On ajoute un commentaire à la cellule contenant le message 
                    let oComment = oActiveSheet.addComment(oCellMsg.getAddress(), "L'API ne peut répondre à la requête pour le territoire et l'année indiquée !");
                    
                }
            }
            catch {
                //Dans le cas où l'on ne peut atteindre l'API
                oCellStatut.getFormat().getFill().setColor('orange');
                oCellStatut.setValue('Indisponibilité');
                oCellStatut.getFormat().setHorizontalAlignment(ExcelScript.HorizontalAlignment.center);
                oCellMsg.setValue("Le service interrogé est momentanément indisponible. Attendre quelques minutes puis retenter l'exécution de ce script.");
                console.log(oRequest.status);
            }
        }
        catch{																											//Dans le cas où une zone nommée n'est pas présente
            console.log("Le classeur actif ne semble pas correspondre à ce traitement. Traitement stoppé.")
        }
    }
    catch {																												//Dans le cas où la feuille attendue n'est pas présente
        console.log("La feuille voulue n'est pas présente dans le classeur actif. Traitement stoppé.")
    }
}
else {
    //Dans le cas où le classeur n'est pas celui attendu
    console.log(sWorkbookName);
}
}

L’IA connait Office Script !

Nous sommes tous friands des nouveautés technologiques et impatients, à leur émergence, d’en découvrir les possibilités et limites.

C’est avec curiosité et gourmandise que nous avons posé le prompt suivant à Copilot (IA de Microsoft) :

    • Comment générer un tableau structuré avec Office Script ?

    Copilot a renvoyé la réponse suivante :

    Whaou…ça décoiffe…Dans quelque temps, à quoi les programmeurs spécialistes seront-ils employés ?

    Q