Microsoft 365 Automatiser un graphique avec excell 365

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Christophe1

XLDnaute Nouveau
Bonjour,
J'ai découvert le mode "automatisé" et tout se passe bien jusqu'au moment ou j'essaie de lui faire afficher un graphique avec le script.
Pour faire un résumé, je reçois un tableau sous csv que je voudrais faire apparaitre sous forme de graphique grace à un script.
J'ai bien réussi en mode "automatique"a convertir le csv en tableau, créer une nouvelle colonne avec les valeurs a utiliser pour mon graphique mais celui ci n'apparait pas quand je lance mon script.
Pourriez vous me dire ou je fais une erreur?
Merci
 

Pièces jointes

Bonjour Christophe et bienvenue sur le forum,

Tu trouveras une solution ci-dessous. Je n'ai pas utilisé les Scripts Office que je ne connais pas, mais PowerQuery pour récupérer les données du fichier csv et les envoyer vers un graphique croisé dynamique.

Pour l'utiliser, il faut renseigner l'emplacement du fichier csv et actualiser les données.

A+
 

Pièces jointes

Bonjour Christophe et bienvenue sur le forum,

Tu trouveras une solution ci-dessous. Je n'ai pas utilisé les Scripts Office que je ne connais pas, mais PowerQuery pour récupérer les données du fichier csv et les envoyer vers un graphique croisé dynamique.

Pour l'utiliser, il faut renseigner l'emplacement du fichier csv et actualiser les données.

A+
Merci, je tenterai ça demain car je n'enregistre jamais le fichier csv sur le pc. Celui ci est envoyé par mail et je souhaite le rendre lisible grâce au tableau depuis outlook.
 
Bonjour Christophe et bienvenue sur le forum,

Tu trouveras une solution ci-dessous. Je n'ai pas utilisé les Scripts Office que je ne connais pas, mais PowerQuery pour récupérer les données du fichier csv et les envoyer vers un graphique croisé dynamique.

Pour l'utiliser, il faut renseigner l'emplacement du fichier csv et actualiser les données.

A+
Bonjour mromain,
J'ai testé ton script mais cela ne donne rien. Lorsque j'ai enregistré mes opérations via "automatisé", j'avais du modifier le script en manuel car je me suis rendu compte que toutes mes données venant du csv se mettaient dans la colonne A et que tout était décalé d'une colonne. Je vais continuer mes recherches.
Bàt
 
Voila, je viens de trouver, l'automatisation du graphique ne se faisait pas et il mettait un code générique que j'ai remplacé par:

// Get the active worksheet.
let sheet = workbook.getActiveWorksheet();
// Create a column chart using the data from M:N.
let chart = sheet.addChart(
ExcelScript.ChartType.line,
sheet.getRange("M:N")
);
// Set the margin of the chart to be 100 pixels from the top of the screen.
chart.setTop(100);

Et maintenant ça fonctionne. Je vais lui rajouter quelques fonctions supplémentaires.
Bonne journée
 
Bonsoir à toutes & à tous, Bonsoir @Christophe1
J'arrive bien longtemps après la bataille, mais je l'ai fait alors je poste.
Comme @mromain je ne connais pas Script Office (je n'ai pas Office 365) alors je suis passer par le VBA.
La macro demande de désigner le fichier csv, elle l'importe, le met sous forme de tableau structuré, ajoute une colonne datation (date+horaire) et construit un graphe nuage de points avec les colonne m3 et datation.
Un peu de mise en forme et c'est fini.

  • Le résultat :
    1750016679928.png

  • Le code :
    VB:
    Sub InsérerGraphique()    
         Dim Wbk As Workbook, Wsh As Worksheet, Shp As Shape, Chrt As Chart
         FichCSV = Application.GetOpenFilename("Relevé (*.csv), *.csv")
       
         If FichCSV = False Then Exit Sub
       
         'Ouvrir le fichier csv
         Workbooks.OpenText Filename:=FichCSV, _
                                    Origin:=65001, StartRow:=2, DataType:=xlDelimited, ConsecutiveDelimiter:=False, Comma:=True, _
                                    DecimalSeparator:="."
         Set Wsh = ActiveSheet
         ActiveWindow.DisplayGridlines = False
       
         'Données dans un tableau structuré
         With Wsh.ListObjects.Add(xlSrcRange, Wsh.UsedRange, , xlYes)
              .Name = "TS_Relevé"
              .TableStyle = "TableStyleLight11"
              .ShowTableStyleColumnStripes = True
         End With
       
         'Ajout d'une colonne de datation (pour graphique en x,y)
         [TS_Relevé].ListObject.Range.Cells(1).Offset(0, [TS_Relevé].Columns.Count).Value = "datation"
         With [TS_Relevé[datation]]
              .Formula = "=DATE([@annee],[@mois],[@jour])+TIME([@Heure],[@minutes],0)"
              .NumberFormat = "hh:mm"
         End With
         [TS_Relevé].EntireColumn.AutoFit
       
         'S'écarter du TS pour éviter le graphique par défaut
         Application.Goto Wsh.Cells(1).Offset(0, [TS_Relevé].Columns.Count + 2)
       
         'Créer un graphique en X,Y
         Set Shp = Wsh.Shapes.AddChart2(-1, xlXYScatter)
         Set Chrt = Shp.Chart
         'Position, dimensionnement
         With Shp
              .Top = Wsh.Cells(5, 3).Top
              .Left = Wsh.Cells(5, 3).Left
              .Width = Application.CentimetersToPoints(30)
              .Height = Application.CentimetersToPoints(15)
         End With
         With Chrt
              .ChartType = xlXYScatterLinesNoMarkers  'Pas de marqueurs sur la courbe
              Set NS = .SeriesCollection.NewSeries    'Ajout de la série
         End With
         'Propriétés de la Serie
         With NS
              .Name = "Relevé du " & Format(WorksheetFunction.Min([TS_Relevé[datation]]), "dd/mm/yyyy") & " au " & Format(WorksheetFunction.Max([TS_Relevé[datation]]), "dd/mm/yyyy")
              .Values = [TS_Relevé[m3]]
              .XValues = [TS_Relevé[datation]]
         End With
       
         'Mise en forme du graphique
         With Chrt
              'Axe des X
              .SetElement (msoElementPrimaryCategoryAxisTitleBelowAxis)
              .Axes(xlCategory).AxisTitle.Caption = "Heure"
              'Axe des Y
              .SetElement (msoElementPrimaryValueAxisTitleBelowAxis)
              .Axes(xlValue).AxisTitle.Caption = "m3"
              'Hauteur de la zone de tracé (on passe par selection car sinon bug sauf en pas à pas !)
              .PlotArea.Select
              Selection.Height = Application.CentimetersToPoints(12.5)
              'Mise en forme de l'axe des X
              With .Axes(xlCategory)
                   .TickLabels.Orientation = xlUpward
                   .TickLabels.NumberFormat = "hh:mm"
                   'Bornes sur des heures entières
                   .MinimumScale = WorksheetFunction.Floor(WorksheetFunction.Min([TS_Relevé[datation]]), 1 / 24)
                   .MaximumScale = WorksheetFunction.Ceiling(WorksheetFunction.Max([TS_Relevé[datation]]), 1 / 24) + 0.0000000001
                   'Unité principale 1 heure
                   .MajorUnit = 1 / 24
                   'Unité secondaire 14 d'heure
                   .MinorUnit = 1 / 24 / 4
                   .Format.Line.ForeColor.RGB = RGB(0, 0, 255)
                   .MajorTickMark = xlOutside
                   .MinorTickMark = xlOutside
                   .AxisTitle.Caption = "Heure"
                   .AxisTitle.Top = Application.CentimetersToPoints(14)
              End With
         End With
         Application.Goto [TS_Relevé].Cells(1, 1)
    End Sub

  • Le classeur
    1750017157976.png
Voir fichier joint

À bientôt
 

Pièces jointes

Re,
La version corrigée graphique avec les débits et non plus la consommation.

Ajout d'un TS "TS_Débit" avec la datation (affichage seulement des heures mais datation complète) et des débits par heures (consommation du 1/4 d'heure fois 4).
  • Résultat
    1750020212097.png

  • Code
    VB:
    Sub InsérerGraphique()    
         Dim Wbk As Workbook, Wsh As Worksheet, Shp As Shape, Chrt As Chart
         FichCSV = Application.GetOpenFilename("Relevé (*.csv), *.csv")
        
         If FichCSV = False Then Exit Sub
        
         'Ouvrir le fichier csv
         Workbooks.OpenText Filename:=FichCSV, _
                                    Origin:=65001, StartRow:=2, DataType:=xlDelimited, ConsecutiveDelimiter:=False, Comma:=True, _
                                    DecimalSeparator:="."
         Set Wsh = ActiveSheet
         ActiveWindow.DisplayGridlines = False
        
         'Données dans un tableau structuré
         With Wsh.ListObjects.Add(xlSrcRange, Wsh.UsedRange, , xlYes)
              .Name = "TS_Relevé"
              .TableStyle = "TableStyleLight11"
              .ShowTableStyleColumnStripes = True
         End With
        
         [TS_Relevé].EntireColumn.AutoFit
        
         'Ajout d'un TS Heure Débit
         With Wsh.ListObjects.Add(xlSrcRange, Wsh.ListObjects("TS_Relevé").Range.Offset(0, [TS_Relevé].Columns.Count + 1).Resize(, 2), , xlYes)
              .Name = "TS_Débit"
              .TableStyle = "TableStyleLight9"
              .ShowTableStyleColumnStripes = True
         End With
        
         'Colonne des heures (formules puis ne conserver que les valeurs)
         [TS_Débit].ListObject.Range.Cells(1).Value = "Heure"
         With [TS_Débit[Heure]]
              .Formula = "=DATE(TS_Relevé[@annee],TS_Relevé[@mois],TS_Relevé[@jour])+TIME(TS_Relevé[@Heure],TS_Relevé[@minutes],0)"
              .Value = .Value
              .NumberFormat = "hh:mm"
         End With
        
         'Colonne du débit (formules puis ne conserver que les valeurs)
         [TS_Débit].ListObject.Range.Cells(1, 2).Value = "Débit m³/h"
         With [TS_Débit[Débit m³/h]]
              .Formula = "=TS_Relevé[@m3]*4"
              .Value = .Value
         End With
        
         'S'écarter du TS pour éviter le graphique par défaut
         Application.Goto Wsh.Cells(1).Offset(0, [TS_Relevé].Columns.Count + 5)
        
         'Créer un graphique en X,Y
         Set Shp = Wsh.Shapes.AddChart2(-1, xlXYScatter)
         Set Chrt = Shp.Chart
         'Position, dimensionnement
         With Shp
              .Top = Wsh.Cells(5, 3).Top
              .Left = Wsh.Cells(5, 3).Left
              .Width = Application.CentimetersToPoints(30)
              .Height = Application.CentimetersToPoints(15)
         End With
         With Chrt
              .ChartType = xlXYScatterLinesNoMarkers  'Pas de marqueurs sur la courbe
              Set NS = .SeriesCollection.NewSeries    'Ajout de la série
         End With
         'Propriétés de la Serie
         With NS
              .Values = [TS_Débit[Débit m³/h]]
              .XValues = [TS_Débit[Heure]]
              .Name = "Relevé du " & Format(WorksheetFunction.Min([TS_Débit[Heure]]), "dd/mm/yyyy") & " au " & Format(WorksheetFunction.Max([TS_Débit[Heure]]), "dd/mm/yyyy")
         End With
        
         'Mise en forme du graphique
         With Chrt
              'Axe des X
              .SetElement (msoElementPrimaryCategoryAxisTitleBelowAxis)
              .Axes(xlCategory).AxisTitle.Caption = "heure"
              'Axe des Y
              .SetElement (msoElementPrimaryValueAxisTitleBelowAxis)
              .Axes(xlValue).AxisTitle.Caption = "m³/h"
              'Hauteur de la zone de tracé (on passe par selection car sinon bug sauf en pas à pas !)
              .PlotArea.Select
              Selection.Height = Application.CentimetersToPoints(12.5)
              'Mise en forme de l'axe des X
              With .Axes(xlCategory)
                   .TickLabels.Orientation = xlUpward
                   .TickLabels.NumberFormat = "hh:mm"
                   'Bornes sur des heures entières
                   .MinimumScale = WorksheetFunction.Floor(WorksheetFunction.Min([TS_Débit[Heure]]), 1 / 24)
                   .MaximumScale = WorksheetFunction.Ceiling(WorksheetFunction.Max([TS_Débit[Heure]]), 1 / 24) + 0.0000000001
                   'Unité principale 1 heure
                   .MajorUnit = 1 / 24
                   'Unité secondaire 14 d'heure
                   .MinorUnit = 1 / 24 / 4
                   .Format.Line.ForeColor.RGB = RGB(0, 0, 255)
                   .MajorTickMark = xlOutside
                   .MinorTickMark = xlOutside
                   .AxisTitle.Caption = "Heure"
                   .AxisTitle.Top = Application.CentimetersToPoints(14)
              End With
         End With
         Application.Goto [TS_Relevé].Cells(1, 1)
    End Sub
Voir fichier joint

À bientôt
 

Pièces jointes

Re,
La version corrigée graphique avec les débits et non plus la consommation.

Ajout d'un TS "TS_Débit" avec la datation (affichage seulement des heures mais datation complète) et des débits par heures (consommation du 1/4 d'heure fois 4).

  • Code
    VB:
    Sub InsérerGraphique()   
         Dim Wbk As Workbook, Wsh As Worksheet, Shp As Shape, Chrt As Chart
         FichCSV = Application.GetOpenFilename("Relevé (*.csv), *.csv")
       
         If FichCSV = False Then Exit Sub
       
         'Ouvrir le fichier csv
         Workbooks.OpenText Filename:=FichCSV, _
                                    Origin:=65001, StartRow:=2, DataType:=xlDelimited, ConsecutiveDelimiter:=False, Comma:=True, _
                                    DecimalSeparator:="."
         Set Wsh = ActiveSheet
         ActiveWindow.DisplayGridlines = False
       
         'Données dans un tableau structuré
         With Wsh.ListObjects.Add(xlSrcRange, Wsh.UsedRange, , xlYes)
              .Name = "TS_Relevé"
              .TableStyle = "TableStyleLight11"
              .ShowTableStyleColumnStripes = True
         End With
       
         [TS_Relevé].EntireColumn.AutoFit
       
         'Ajout d'un TS Heure Débit
         With Wsh.ListObjects.Add(xlSrcRange, Wsh.ListObjects("TS_Relevé").Range.Offset(0, [TS_Relevé].Columns.Count + 1).Resize(, 2), , xlYes)
              .Name = "TS_Débit"
              .TableStyle = "TableStyleLight9"
              .ShowTableStyleColumnStripes = True
         End With
       
         'Colonne des heures (formules puis ne conserver que les valeurs)
         [TS_Débit].ListObject.Range.Cells(1).Value = "Heure"
         With [TS_Débit[Heure]]
              .Formula = "=DATE(TS_Relevé[@annee],TS_Relevé[@mois],TS_Relevé[@jour])+TIME(TS_Relevé[@Heure],TS_Relevé[@minutes],0)"
              .Value = .Value
              .NumberFormat = "hh:mm"
         End With
       
         'Colonne du débit (formules puis ne conserver que les valeurs)
         [TS_Débit].ListObject.Range.Cells(1, 2).Value = "Débit m³/h"
         With [TS_Débit[Débit m³/h]]
              .Formula = "=TS_Relevé[@m3]*4"
              .Value = .Value
         End With
       
         'S'écarter du TS pour éviter le graphique par défaut
         Application.Goto Wsh.Cells(1).Offset(0, [TS_Relevé].Columns.Count + 5)
       
         'Créer un graphique en X,Y
         Set Shp = Wsh.Shapes.AddChart2(-1, xlXYScatter)
         Set Chrt = Shp.Chart
         'Position, dimensionnement
         With Shp
              .Top = Wsh.Cells(5, 3).Top
              .Left = Wsh.Cells(5, 3).Left
              .Width = Application.CentimetersToPoints(30)
              .Height = Application.CentimetersToPoints(15)
         End With
         With Chrt
              .ChartType = xlXYScatterLinesNoMarkers  'Pas de marqueurs sur la courbe
              Set NS = .SeriesCollection.NewSeries    'Ajout de la série
         End With
         'Propriétés de la Serie
         With NS
              .Values = [TS_Débit[Débit m³/h]]
              .XValues = [TS_Débit[Heure]]
              .Name = "Relevé du " & Format(WorksheetFunction.Min([TS_Débit[Heure]]), "dd/mm/yyyy") & " au " & Format(WorksheetFunction.Max([TS_Débit[Heure]]), "dd/mm/yyyy")
         End With
       
         'Mise en forme du graphique
         With Chrt
              'Axe des X
              .SetElement (msoElementPrimaryCategoryAxisTitleBelowAxis)
              .Axes(xlCategory).AxisTitle.Caption = "heure"
              'Axe des Y
              .SetElement (msoElementPrimaryValueAxisTitleBelowAxis)
              .Axes(xlValue).AxisTitle.Caption = "m³/h"
              'Hauteur de la zone de tracé (on passe par selection car sinon bug sauf en pas à pas !)
              .PlotArea.Select
              Selection.Height = Application.CentimetersToPoints(12.5)
              'Mise en forme de l'axe des X
              With .Axes(xlCategory)
                   .TickLabels.Orientation = xlUpward
                   .TickLabels.NumberFormat = "hh:mm"
                   'Bornes sur des heures entières
                   .MinimumScale = WorksheetFunction.Floor(WorksheetFunction.Min([TS_Débit[Heure]]), 1 / 24)
                   .MaximumScale = WorksheetFunction.Ceiling(WorksheetFunction.Max([TS_Débit[Heure]]), 1 / 24) + 0.0000000001
                   'Unité principale 1 heure
                   .MajorUnit = 1 / 24
                   'Unité secondaire 14 d'heure
                   .MinorUnit = 1 / 24 / 4
                   .Format.Line.ForeColor.RGB = RGB(0, 0, 255)
                   .MajorTickMark = xlOutside
                   .MinorTickMark = xlOutside
                   .AxisTitle.Caption = "Heure"
                   .AxisTitle.Top = Application.CentimetersToPoints(14)
              End With
         End With
         Application.Goto [TS_Relevé].Cells(1, 1)
    End Sub
Voir fichier joint

À bientôt
Bonjour AtTheOne,

Merci pour le script. Je vais l'examiner pour voir ce que ça donne en VBA.
L'automatisation de office365 est pas mal même si beaucoup de fonction ne sont pas encore "active".
Mais grâce aux exemples, on arrive à s'en sortir.

Bonne journée
 
Bonjour le forum,

Cette macro traite très simplement les données du fichier CSV :
VB:
Sub MAJ()
Dim fichier As Variant, nlig&, ncol%, tablo
fichier = Application.GetOpenFilename("Fichiers CSV (*.csv),*.csv")
If fichier = False Then Exit Sub
Application.ScreenUpdating = False
[A:B].ClearContents 'RAZ
Workbooks.OpenText fichier, DataType:=xlDelimited, Comma:=True
With ActiveSheet
    nlig = .UsedRange.Rows.Count
    ncol = .UsedRange.Columns.Count
    .Cells(2, ncol + 1).Resize(, 2) = Array("heure", "m3")
    .Cells(3, ncol - 1).Name = "Hdeb" 'cellule nommée
    .Cells(3, ncol + 1).Resize(nlig - 2) = "=(RC[-2]-Hdeb)/86400"
    .Cells(3, ncol + 2).Resize(nlig - 2) = "=RC[-2]"
    tablo = .Cells(2, ncol + 1).Resize(nlig - 1, 2)
    .Parent.Close False
End With
[A1].Resize(nlig - 1, 2) = tablo
ActiveSheet.ChartObjects(1).Chart.SetSourceData [A2:B2].Resize(nlig - 2)
End Sub
Edit : j'ai modifié, il n'y a plus de boucle.

A+
 

Pièces jointes

Dernière édition:
On peut ouvrir le fichier CSV en lecture séquentielle, cest plus rapide :
VB:
Sub MAJ()
Dim fichier As Variant, x, texte$, i&, s, ub%, hdeb&, a()
fichier = Application.GetOpenFilename("Fichiers .csv (*.csv),*.csv")
If fichier = False Then Exit Sub
x = FreeFile
Open fichier For Input As #x 'ouverture en lecture séquentielle
Line Input #x, texte: Line Input #x, texte 'on saute 2 lignes
While Not EOF(x)
    Line Input #x, texte
    s = Split(texte, ","): ub = UBound(s): If i = 0 Then hdeb = s(ub - 2)
    ReDim Preserve a(1, i) 'base 0
    a(0, i) = (s(ub - 2) - hdeb) / 86400
    a(1, i) = Val(s(ub - 1))
    i = i + 1
Wend
Close #x
'---restitution
[A1:B1] = Array("heure", "m3")
With [A2:B2]
    If i Then
        .Resize(i) = Application.Transpose(a) 'Transpose est limitée à 65536 lignes
        ActiveSheet.ChartObjects(1).Chart.SetSourceData .Resize(i)
    End If
    .Offset(i).Resize(Rows.Count - i - .Row + 1).ClearContents 'RAZ en dessous
End With
End Sub
 

Pièces jointes

Bonjour à toutes & à tous, bonjour @job75,
Ta proposition est bien plus condensée que la mienne, je regrette seulement qu'on perde la date et l'heure du relevé (date 0 = 1/1/1970 à 0h00, décalage de 20248j 5h et 15 mn).
Ces informations pourrait être utiles à @Christophe1 qui je cite
Et maintenant ça fonctionne. Je vais lui rajouter quelques fonctions supplémentaires.
va certainement aller un peu plus loin que juste un graphique,
et qui affiche le débit plutôt que la consommation (en supposant une mesure tous les 1/4 heure)

Perso j'ai préféré un graphe en nuage de points, qui respectera à coup sûr les intervalles de temps (bon ici ils semblent constants 15 mn ! 🙄)
et des bornes d'axes des x entre l'heure entière précédant la première mesure et l'heure entière suivant la dernière mesure.

À bientôt
 
Bonjour AtTheOne, le forum,

Le 01/01/1970 00:00 c'est le début du comptage des secondes (time) mais ça ne sert à rien, on ne va pas afficher le graphique sur 55 ans !

Par contre on peut afficher dans le titre du graphique la date et l'heure du début du relevé voyez le fichier joint.

A+
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour