Formater l'Axe des x d'un graphique avec code

Fermé
bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023 - 3 mai 2016 à 21:35
bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023 - 4 mai 2016 à 20:54
Bonjour à tous!

J'ai une macro pour effectuer un graphique automatiquement à partir d'une autre feuille(1). La macro crée une nouvelle feuille pour y insérer le graphique.

J'ai réussi à créer le code suivant à l'aide de plusieurs site sur le sujet, mais je suis bloqué sur une problème.

Sur mon axe des x se retrouve les date de lecture d'un appareil. Mon appareil prend 2 lectures par jours une à 12h00 et l'autre à 0h00. Dans mon fichier excel, j'ai donc une colonne (E) pour la date et une colonne pour l'heure (F) dans le format 1200.

À partir de ces données, j'ai inséré une nouvelle colonne (F) dans la feuille (1) qui concatène ma date et mon heure. Car, je ne voulais pas que les 2 valeurs de la même journée soit une par dessus l'autre dans mon graphique. Cette nouvelle colonne(F) ne me sert qu'à cette fin, ensuite je la cache. Probablement, qu'il y a une meilleur façon de faire mais pour l'instant ça fonctionne!

J'ai réussi à faire tracer mon graphique avec toute mes données correctement mais pour l'affichage des valeurs sur l'axe des x, ça ne fonctionne pas! Probablement dû au fait que j'ai caché la colonne (F), mais lorsque qu'elle n'est pas cachée, elle m'affiche une valeur sur l'axe des x du style 2016-01-25_12. Mes lectures se retrouve dans la colonne K de ma feuille 1.

J'ai essayé de trouver un moyen pour formater mon axe des x, mais sans succès jusqu'ici! Est-ce qu'on peut lui dire part de tel valeur jusqu'à tel autre valeur, etc...?

Je voudrais, que le maximum de l'axe des x du graphique soit dynamique, qu'il affiche seulement les données jusqu'à la dernière date trouvée et que les valeurs en dessous de l'axe soit fixe du style au mois avec subdivision au jours. Ainsi que si il détecte dans ma feuille (1) une nouvelle année, qu'il me crée une nouvelle série sur le même graphique.

Voici mon code:
Option Explicit
Sub graphique()

Dim Grf As ChartObject
Dim Sh As Worksheet
Dim nom As String, DerLig As Integer

DerLig = Sheets(1).Range("A" & Rows.Count).End(xlUp).Row
 
Set Sh = Sheets("graphique")

'On crée notre graphique
Set Grf = Sh.ChartObjects.Add(100, 100, 600, 300)

With Grf.Chart
    nom = Sheets(1).Range("K1").Value
    .HasLegend = False
    .HasTitle = True
    .ChartTitle.Text = "No piézomètre: " & Mid(nom, 23, 14)
    .ChartTitle.Left = 21
    .ChartType = xlLine
    .SeriesCollection.NewSeries
        With .SeriesCollection(1)
            .Format.Line.Weight = xlThin
            .Values = Sheets(1).Range("K2" & ":K" & DerLig)
            .XValues = Sheets(1).Range("F2" & ":F" & DerLig)
        End With
   
        With .ChartTitle.Font
            .Size = 10
            .Name = "Arial"
        End With
        
        With .Axes(xlValue, xlPrimary)
            .HasTitle = True
            .AxisTitle.Characters.Text = "Pression (KPa)"
            .MinorTickMark = xlTickMarkInside
            .MinorUnit = 0.2
            .AxisTitle.Font.Bold = False
        End With
        
        With .Axes(xlCategory, xlPrimary)
            .HasTitle = True
            .AxisTitle.Characters.Text = "Date de lecture"
            .AxisTitle.Font.Bold = False
            '.CategoryType = xlTimeScale
            '.TickLabels.NumberFormat = "dd-mm"
            .MajorTickMark = xlTickMarkInside
            '.MajorUnit = 20
            .MinorTickMark = xlTickMarkOutside
            '.MinorUnit = 2
            '.MinimumScale = 0
            '.MaximumScale = DerLig
            '.TickLabels.NumberFormat = "yyyy-mm-dd"
                        
        End With
    
End With


Set Grf = Nothing
Set Sh = Nothing


End Sub


Merci de votre aide!
A voir également:

1 réponse

bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023 1
4 mai 2016 à 20:54
Je n'ai pas encore trouvé la solution à mon problème, mais j'ai amélioré mon code pour ajouter plus de 1 graphique sur la même feuille.

Toujours à la recherche d'une solution!

Option Explicit
Sub graphique()

Dim Grf As ChartObject
Dim Sh As Worksheet
Dim nom As String, DerLig As Integer, i As Integer
Dim col

DerLig = Sheets(1).Range("A" & Rows.Count).End(xlUp).Row
 
Set Sh = Sheets("graphique")

For i = 1 To UserForm2.ComboBox1.Value

    Select Case i

    Case 1
    Set Grf = Sh.ChartObjects.Add(100, 100, 600, 200)
    nom = Sheets(1).Range("K1").Value
    col = Split(Columns(11).Address, ":")(1)

    Case 2
    Set Grf = Sh.ChartObjects.Add(100, 320, 600, 200)
    nom = Sheets(1).Range("L1").Value
    col = Split(Columns(12).Address, ":")(1)

    Case 3
    nom = Sheets(1).Range("M1").Value
    Set Grf = Sh.ChartObjects.Add(100, 540, 600, 200)
    col = Split(Columns(13).Address, ":")(1)
   
    Case 4
    nom = Sheets(1).Range("N1").Value
    Set Grf = Sh.ChartObjects.Add(100, 760, 600, 200)
    col = Split(Columns(13).Address, ":")(1)

    End Select

    With Grf.Chart
    .HasLegend = True
        With .Legend
            With .Border
                .Color = vbBlack
                .LineStyle = xlContinuous
            End With
            .Format.Line.Weight = 0.25
            .Format.Fill.ForeColor.RGB = RGB(255, 255, 255)
            .Left = 55
            .Top = 31
        End With
        
        With .PlotArea
            .Left = 20
            .Width = 550
            .Height = 145
            .Top = 18
        End With
        
    .HasTitle = True
    .ChartTitle.Text = "No piézomètre: " & Mid(nom, 23, 14)
    .ChartTitle.Left = 21
        With .ChartTitle.Font
            .Size = 10
            .Name = "Arial"
        End With
    .ChartType = xlLine
    .SeriesCollection.NewSeries
        With .SeriesCollection(1)
            .Name = "2016" ' À changer pour que la date change avec les données de la colonne E
            .Format.Line.Weight = xlThin
            .Values = Sheets(1).Range(col & "2" & ":" & col & DerLig)
            .XValues = Sheets(1).Range("F2" & ":F" & DerLig)
        End With
        
        With .Axes(xlValue, xlPrimary)
            .HasTitle = True
            .AxisTitle.Characters.Text = "Pression (KPa)"
            .MinorTickMark = xlTickMarkInside
            .MinorUnit = 0.2
            .AxisTitle.Font.Bold = False
        End With
        
        With .Axes(xlCategory, xlPrimary)
            .HasTitle = True
            .AxisTitle.Characters.Text = "Date de lecture"
            .AxisTitle.Font.Bold = False
        End With
    
    End With
    
Next i


Set Grf = Nothing
Set Sh = Nothing


End Sub
0